You are on page 1of 6

SECO 1 COMO ESTE LIVRO TE ENSINA A LINGUAGEM Nas Linguagens de Programao Orientadas a Objectos, tipicamente definimos classes e hierarquias

s de classes que reflectem importantes propriedades gerais de individualidades 8unhas, cavalos, etc.) Mensagens so enviadas a receptores, e estes retornam respostas. para fazer a necessria computao, Smalltalk encontra o mtodo apropriado, dado a mensgame e o receptor, e esse mtodo especifica exactamente como a computao deve ser feita. Por ex. podemos enviar uma mensagme sqrt para o receptor 2. Em contraste, as Linguagens de Programao Orientadas por Procedimentos, tais como a C, encorajam a pensar em termos de funes e procedimentos, em vez de classes e hierarquias. Smalltalk tem as seguintes caractersticas atractivas: - orientada a objectos desde a raiz - feita em poderosos ambientes de desenvolvimento - Encorajam o desenvolvimento de interfaces de utilizador grficos Smalltalk puro objecto-orientado porque todas as entidades so objectos. O enorme poder evm de ferramentas poderosas: - Os ambientes de desenvolvimento do Smalltalk fornecem poderosos browsers que permitem examinar todas as definies de classes e mtodos - Fornecem poderosas ferramentas de debugging - As suas classes e mtodos so compiladas como as escrevemos, incrementalmente, sem perdas de tempo finais. Tambm fornece reciclagem automtica de memria, desempenhando o que se chama de colecta de lixo automtica, o que origina maior produtividade. H 2 razes principais para aprendermos smalltalk: - A tua produtividade exceder provavelmente a tua produtividade com outras linguagens - O fornecimento de poderosos mdulos de software, permite a sua colagem, em vez de fazermos os programas de raiz reutilizao. Para aumentaromos a produtividade, devemos criar livrarias prprias, padres de templates idiomas. A arte de praticar boa programao deve ter em conta ideias como a abstraco de dados, abstraco de procedimentos, princpio de representao explcita, princpio de modularidade, de no duplicao, de look-it-up, e de is-a versus has-a SECO 2 COMO EXPERIMENTAR O USO DO WORKSPACE Vamos aprender como executar simples computaes aritmticas e visualizar o resultado. Tambm veremos a terminologia standard usada. Na maioria das linguagens escrevemos o programa num editor produzindo um ficheiro de texto. Depois traduzimos para instrues mquina, compilando, produzindo um ficheiro executvel. No Smalltalk usamos um ambiente de desenvolvimento, que contm um conjunto integrado de ferramentas. Quando acabamos samos e deixamos s a imagem da aplicao. Quando entramos vemos a janela Transcript. Podemos ento activar a janela de Workspace, clicando em File > New Workspace. Uma vez no Workspace, podemos digitar e editar expresses tal como escrevemos texto num processador de texto. ex. 2 sqrt Depois seleccionamos a expresso (como se selecciona texto no Word) e podemos ento compilar e avaliar, sendo o resultado mostrado, clicando com o boto direito do rato e de pois em Show It que uma opo que aparece no menu que emerge. Quando avaliamos a expresso 2 sqrt, dizemos que estamos a enviar uma mensagem, consistindo num selector de mtodo, sqrt, ao receptor da mensagem, 2. O receptor encontra o mtodo nomeado pelo selector de mtodo, usa esse mtodo para produzir um valor, e responde com esse valor. Assim, via mtodos, os objectos podem enviar e receber mensagens. Os objectos que descrevem grupos de indivduos so chamaods de classes. objectos que descrevem indivduos so chamados de instncias. As mensagens podem incluir argumentos. ex. 2 raisedTo: 10 Mtodos como sqrt so chamados unrios porque aparecem em mensagens que no tm argumentos focam-se inteiramente num objecto, o receptor. Mtodos como o raisedTo: dizem-se de palavra-chave, porque incluem dois pontos, que indicam que argumentos so esperados tarabalham com 2 objectos, o receptor e o argumento.

Mtodos como o * dizem-se binrios porque trazem exactamente 2 objectos juntos, o receptor e um argumento. Em vez de mostrar os resultados no Workspace, podemos mostr-los no Transcript, que na realidade um Workspace especial. Transcript show: 1746 printString. Depois s seleccionar e Right -> Do It. A mensagem de show: aparece pois til para mostra resultados intermdios. Sempre que uma expresso do Smalltalk contm mltiplos mtodos de tipos diferentes, um conjunto simples de regras determina como a expresso avaliada: - mensagens unrias so enviadas primeiro - Depois, as binrias so enviadas - Finalmente, as de palavra-chave No caso de expresses contendo mltiplas mensagens do mesmo tipo, o Smalltalk envia as mensagens da esquerda para a direita. Directamente - Transcript show: the number of calories is: Transcript cr Cada expresso separada por ponto final chamada de frase/sentena. a ltima no leva ponto final, que so assim separadores. O padro para mostrar a resposta produzida por uma expresso no Transcript : Transcript show: expression printString. quando substituo expression estou a instanciar o padro. Nota: no caso do Object Studio, para ver o resultado no Workspace (escreve-o por cima da expresso) fazer seleccionar > Right > Smalltalk > Show. Para mostrar o resultado no Transcript fazer seleccionar > Right > Smalltalk > Out, mas no usando transcription show:, s a expresso (ex. 1746 printString). O Transcript show: ser necessrio para quando estou a escrever um programa (???). SECO 3 COMO ESCREVER EXPRESSES ARITMTICAS Mensagens +, -, *, e / Quando uma instncia Integer no d resto zero, um n racional, expresso como uma instncia de Fraction, marcado entre parnteses, a resposta. 5/3 d (5/3) 5.0/3.0 d 1.66667 A mensagem de diviso // produz sempre um inteiro como resultado. nos negativos trunca na direco do infinito; por ex. 22//-7 d 4. Notas: 1 tenho de pr parnteses, ex. (5/3) printString; 2 (5.0/3.0) d 1.666666666667; 3 (22//-7) d 3 e no 4 como diz o livro. 6 + 3 * 2 d 18 porque executa da esquerda para a direita. Claro que posso usar parnteses para poder continuara trabalhar com as precedncias habituias da aritmtica, ou tornar as minhas intenes claras. 5 negated d 5, porque a mensagem binria, assim como a / 5 reciprocal d (1/5) Quando expresses aritmticas contm instncias que pertencem a mltiplas classes, essas expresses so chamadas de expresses mistas. A regra geral que o smalltalk converte ns pertencentes a uma classe em ns pertencentes a outra, de forma a que no seja perdida informao. 6*(2/5) (6/1) vezes (2/5), que d (12/5) 6*3.1 6.0 vezes 3.1 que d 18.6 Se quiser dizer ao Smalltalk para converter explicitamente, em vez de automaticamente, podemos usar asInteger e asFloat: 3.01 as Integer d 3; 3.99 as Integer d 4; -3.01 asInteger d 3; -3.99 asInteger d 4 Tambm podemos converter ns em strings: 3 asString d 3 Converter um tipo de n noutro tipo chamado de casting ou coero. O Smalltalk oferece uma srie de mtodos aritmticos: sin, tan, arcSin, arcTan, ln, log: round, truncated. SECO 4 COMO DEFINIR MTODOS SIMPLES 194 fatToCalories primeiro, entrar no browser de class-hierarchy clicando em File > Browse Classes (no Object studio Tools > Class Browser. Vemos, no cran que aparece, que a estrutura hierrquica do smalltalk tem raiz na classe Object.

Para ver as subclasses de uma determinada classe, duplo clique nessa classe. Assim, Magnitude > Number > para chegar a Integer. Depois, se clicamos em Integer, vemos uma lista de mtodos definidos nessa classe. Agora, podemos definir novos mtodos, clicando em Methods > New Method. O mtodo fatToCalories para ser enviado a instncias da classe Integer fatToCalories: "Responde as calorias do receptor, vistas como gramas de gordura" ^self*9 Se quisermos preservar os mtodos que definimos, temos de gravar o ambiente de desenvolvimento quando deixarmos de trabalhar. Isso faz-se clicando no boto de fechar e depois clicar em yes como resposta pergunta. O Smalltalk insensvel aos caracteres blank. O Smalltalk case sensitive. Conveno quanto a nomes: - Selectores de mtodo consistem em uma ou mais palavras em Ingls - Nenhuma das palavras abreviada - O primeiro carcter de cada palavra, excepto o primeiro, maisculo. - No h caracteres separadores, tais como _ entre as palavras - A combinao das palavras explica o que o mtodo faz. displayFatCalories Transcript show: There are. Transcript show: (self*9) printString. Transcript show: calories in the fat Porque displayfatCalories no contm qualquer expresso marcada com ^, o mtodo diz-se que cai no fim, respondendo self por defeito. O mtodo concatenado enviado a uma string com outra string como argumento. Nota: no Object Studio : displayFatCalories ^'There are ' , (self * 9) printString, ' calories in the fat ' parece que o transcript show: no se usa, ou pelo menos eu no consigo usar, mas apenas o ^ O caracterstica cascata do Smalltalk, tambm pode ser usada: displayFatCalories Transcript show: 'There are ' ; show: (self * 9) printString; show: ' calories in the fat ' (no Object studio continua a no dar/dizer que o mtodo show foi enviado a nil. Fornecer acesso s definies de mtodos predefinidos uma das grandes e inabituais vantagens da linguagem. esse acesso aprofunda o nosso conhecimento da linguagem e facilita a reutilizao de classes e mtodos. Frequentemente, podemos copiar e adaptar a definio de um mtodo ou classe existente ajustando-o/a a um novo propsito, em vez de escrever um novo mtodo ou classe a partir do zero. SECO 5 COMO DEFINIR MTODOS COM PARMETROS Assim, as mensagens incluiro argumentos. Transcript show: (194 convertToCaloriesWith: 4) printString Para definir tal mtodo, vamos ver como incorporar parmetros nas definies dos mtodos. Parmetros so nomes que servem para lidar com objectos que so fornecidos como argumentos das mensagens, tal como o 4 na expresso anterior. Assim, sempre que a mensagem de convertToCaloriesWith: paarce, o Smalltalk tem de fazer o seguinte: - Identificar o objecto argumento, 4, com o parmetro digamos claoriesPerGram especificado por ti quando defines o mtodos convertToCaloriesWith - Avaliara expresso self*caloriesPerGram - Responder o valor de self*caloriesPerGram para uso noutras computaes. Identificar um objecto argumento com um parmetro chamado de associao do parmetro. Sempre que o Smalltalk faz essa ligao, o parmetro diz-se associado a um valor e o valor dizse associado ao parmetro.

convertToCaloriesWith: caloriesPerGram ^ self * caloriesPerGram importante saber que os valores para o parmetro estabelecidos quando um mtodo chamado, s esto disponveis dentro do mtodo. O scope de um parmetro aquela poro de um programa que pode aceder ao valor do parmetro. Um parmetro de um mtodo diz-se que tem scope local, e assim, o Smalltalk diz-se que uma linguagem localmente scoped. Os programadores de Smalltalk usualmente usam nomes de parmetros longos e descritivos. SECO 6 COMO EXECUTAR TESTES USANDO PREDICADOS Um predicado um mtodo que responde com um de 2 objectos, true ou false. O smalltalk oferece vrios predicados binrios para testar as relaes entre pares de ns.: = ~= > < >= <= O not uma mensagem unria que responde true quando enviada a false e vice-versa. Transcript show: false not printString; cr; show: true not printString; cr; O smalltalk tambm fornece outros predicados tais como isInteger e is string que testam instncias se pertencem a uma determinada classe ou no. Transcript show: 4 isInteger printString; cr; show: 4 isString printString; cr; true false SECO 7 COMO ESCREVER EXPRESSES CONDICIONAIS Uma expresso que avalia true ou false uma expresso booleana. Boolean expression ifTrue: [statements] Integer method definition .instance analyzeCalories self > 1600 ifTrue: [Transcript show: You have had enough; cr]. self < 1200 ifTrue: [Transcript show: You need more; cr] Workspace 1700 analyzeCalories. 1100 analyzeCalories Transcript You have had enough You need more Sempre que um conjunto de frases delimitado por parnteses recto, esse conjunto constitui um bloco. Integer method definition .instance analyzeCalories self <= 1600 ifFalse: [Transcript show: you have had enough; cr]. self >= 1200 ifFalse: [Transcript show: You need more; cr] Podemos combinar iftrue: e ifFalse: numa mensagem de 2 argumentos com 2 palavras chave: Boolean expression ifTrue: if-true block ifFalse: if-false block Quando ifTrue: e ifFalse: so combinados, ifTrue:ifFalse: diz-se que o selector de mtodo. Tambm permitido enviar mensagens ifFalse:ifTrue Boolean expression ifFalse: if-false block ifTrue: if-true block Pode incoporar-se uma expresso condicional dentro de outra expresso condicional: Integer method definition .instance analyzeCalories self > 1600 ifTrue: [Transcript show: You have had enough; cr] ifFalse: [self < 1200 ifTrue: [Transcript show: You need more; cr] ifFalse: [Transcript show: You have eaten wisely; cr]]

Integer method definition .instance analyzeCalories Transcript show: (self > 1600 ifTrue: [You have enough] ifFalse: [(self < 1200) ifTrue: [you need more] iffalse: [you have eaten wisely]]); cr Note que a expresso condicional inteira envolvida por parnteses. Os blocos podem conter expresses de resposta. Se uma expresso de resposta for encontrada durante a avaliao do bloco, o valor da expresso de resposta imediatamente se torna a resposta produzida pelo mtodo no qual o bloco est incorporado; nada mais no mtodo avaliado. assim, pode mover a mensagem show: inteiramente para fora de analyzecalories. Integer method definition .instance analyzecalories self > 1600 ifTrue: [^ You have had enough] if False: [(self < 1200) ifTrue: [^ You need more] ifFalse: [^ You have eaten wisely]] Workspace Transcript show: 1700 analyzeCalories; cr. SECO 8 COMO COMBINAR EXPRESSES BOOLEANAS receiver expression & argument expression receiver expression | argument expression Integer method definition .instance inRange ^ (1200 <= self) & (self <= 1600) Workspace Transcript show: 1700 inRange printString; cr; Transcript false Integer method definition .instance analyzeCalories (1200 <= self) & (self <= 1600) iftrue: [Transcript show: self printString; show: is reasonable; cr] Workspace 1400 analyzeCalories Transcript 1400 is reasonable Para evitar desperdiar a computao para avaliar argumentos, muitos programadores evitam & e | todos juntos, usando antes and: e or: Ambos os mtodos, and: e or: tomam blocos como argumentos: receiver expression and: argument block Integer method definition .instance analyzeCalories (1200 <= self and: [self <= 1600]) ifTrue: [Transcript show: self printString; show: is reasonable; cr]. (self < 1200 or: [self > 1600]) ifTrue: [Transcript show: self printString; show: is unreasonable; cr] Se quiser combinar 2 expresses booleanas, and e o resultado true se ambos os valores de ambas as expreses so true, ento envie primeir expresso a mensagem & com a segunda expresso booleana como argumento.

SECO 9 COMO INTRODUZIR VARIVEIS LOCAIS Uma varivel um nome que se refere a um objecto. O objecto referido por uma varivel diz-se que o valor daquela varivel.