SECÇÃO 1 – COMO ESTE LIVRO TE ENSINA A LINGUAGEM Nas Linguagens de Programação Orientadas a Objectos, tipicamente definimos classes e hierarquias

de classes que reflectem importantes propriedades gerais de individualidades 8unhas, cavalos, etc.) Mensagens são enviadas a receptores, e estes retornam respostas. para fazer a necessária computação, Smalltalk encontra o método apropriado, dado a mensgame e o receptor, e esse método especifica exactamente como a computação deve ser feita. Por ex. podemos enviar uma mensagme sqrt para o receptor 2. Em contraste, as Linguagens de Programação Orientadas por Procedimentos, tais como a C, encorajam a pensar em termos de funções e procedimentos, em vez de classes e hierarquias. Smalltalk tem as seguintes características atractivas: - É orientada a objectos desde a raiz - É feita em poderosos ambientes de desenvolvimento - Encorajam o desenvolvimento de interfaces de utilizador gráficos Smalltalk é puro objecto-orientado porque todas as entidades são objectos. O enorme poder evm de ferramentas poderosas: - Os ambientes de desenvolvimento do Smalltalk fornecem poderosos browsers que permitem examinar todas as definições de classes e métodos - Fornecem poderosas ferramentas de debugging - As suas classes e métodos são compiladas como as escrevemos, incrementalmente, sem perdas de tempo finais. Também fornece reciclagem automática de memória, desempenhando o que se chama de colecta de lixo automática, o que origina maior produtividade. Há 2 razões principais para aprendermos smalltalk: - A tua produtividade excederá provavelmente a tua produtividade com outras linguagens - O fornecimento de poderosos módulos de software, permite a sua colagem, em vez de fazermos os programas de raiz – reutilização. Para aumentaromos a produtividade, devemos criar livrarias próprias, padrões de templates – idiomas. A arte de praticar boa programação deve ter em conta ideias como a abstracção de dados, abstracção de procedimentos, princípio de representação explícita, princípio de modularidade, de não duplicação, de look-it-up, e de is-a versus has-a SECÇÃO 2 – COMO EXPERIMENTAR O USO DO WORKSPACE Vamos aprender como executar simples computações aritméticas e visualizar o resultado. Também veremos a terminologia standard usada. Na maioria das linguagens escrevemos o programa num editor produzindo um ficheiro de texto. Depois traduzimos para instruções máquina, compilando, produzindo um ficheiro executável. No Smalltalk usamos um ambiente de desenvolvimento, que contém um conjunto integrado de ferramentas. Quando acabamos saímos e deixamos só a imagem da aplicação. Quando entramos vemos a janela Transcript. Podemos então activar a janela de Workspace, clicando em File > New Workspace. Uma vez no Workspace, podemos digitar e editar expressões tal como escrevemos texto num processador de texto. ex. 2 sqrt Depois seleccionamos a expressão (como se selecciona texto no Word) e podemos então compilar e avaliar, sendo o resultado mostrado, clicando com o botão direito do rato e de pois em Show It que é uma opção que aparece no menu que emerge. Quando avaliamos a expressão 2 sqrt, dizemos que estamos a enviar uma mensagem, consistindo num selector de método, sqrt, ao receptor da mensagem, 2. O receptor encontra o método nomeado pelo selector de método, usa esse método para produzir um valor, e responde com esse valor. Assim, via métodos, os objectos podem enviar e receber mensagens. Os objectos que descrevem grupos de indivíduos são chamaods de classes. objectos que descrevem indivíduos são chamados de instâncias. As mensagens podem incluir argumentos. ex. 2 raisedTo: 10 Métodos como sqrt são chamados unários porque aparecem em mensagens que não têm argumentos – focam-se inteiramente num objecto, o receptor. Métodos como o raisedTo: dizem-se de palavra-chave, porque incluem dois pontos, que indicam que argumentos são esperados – tarabalham com 2 objectos, o receptor e o argumento.

Métodos como o * dizem-se binários 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 intermédios. Sempre que uma expressão do Smalltalk contém múltiplos métodos de tipos diferentes, um conjunto simples de regras determina como a expressão é avaliada: - mensagens unárias são enviadas primeiro - Depois, as binárias são enviadas - Finalmente, as de palavra-chave No caso de expressões contendo múltiplas 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 expressão separada por ponto final é chamada de frase/sentença. a última não leva ponto final, que são assim separadores. O padrão para mostrar a resposta produzida por uma expressão no Transcript é: Transcript show: expression printString. quando substituo expression estou a instanciar o padrão. Nota: no caso do Object Studio, para ver o resultado no Workspace (escreve-o por cima da expressão) é fazer seleccionar > Right > Smalltalk > Show. Para mostrar o resultado no Transcript é fazer seleccionar > Right > Smalltalk > Out, mas não usando transcription show:, só a expressão (ex. 1746 printString). O Transcript show: será necessário para quando estou a escrever um programa (???). SECÇÃO 3 – COMO ESCREVER EXPRESSÕES ARITMÉTICAS Mensagens +, -, *, e / Quando uma instância Integer não dá resto zero, um nº racional, expresso como uma instância de Fraction, marcado entre parênteses, é a resposta. 5/3 dá (5/3) 5.0/3.0 dá 1.66667 A mensagem de divisão // produz sempre um inteiro como resultado. nos negativos trunca na direcção do – infinito; por ex. 22//-7 dá –4. Notas: 1 – tenho de pôr parênteses, ex. (5/3) printString; 2 – (5.0/3.0) dá 1.666666666667; 3 – (22//-7) dá –3 e não –4 como diz o livro. 6 + 3 * 2 dá 18 porque executa da esquerda para a direita. Claro que posso usar parênteses para poder continuara trabalhar com as precedências habituias da aritmética, ou tornar as minhas intenções claras. 5 negated dá –5, porque a mensagem – é binária, assim como a / 5 reciprocal dá (1/5) Quando expressões aritméticas contêm instâncias que pertencem a múltiplas classes, essas expressões são chamadas de expressões mistas. A regra geral é que o smalltalk converte nºs pertencentes a uma classe em nºs pertencentes a outra, de forma a que não seja perdida informação. 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 Também podemos converter nºs em strings: 3 asString dá ‘3’ Converter um tipo de nº noutro tipo é chamado de casting ou coerção. O Smalltalk oferece uma série de métodos aritméticos: sin, tan, arcSin, arcTan, ln, log: round, truncated. SECÇÃO 4 – COMO DEFINIR MÉTODOS 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 hierárquica 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 métodos definidos nessa classe. Agora, podemos definir novos métodos, clicando em Methods > New Method. O método fatToCalories é para ser enviado a instâncias da classe Integer fatToCalories: "Responde as calorias do receptor, vistas como gramas de gordura" ^self*9 Se quisermos preservar os métodos que definimos, temos de gravar o ambiente de desenvolvimento quando deixarmos de trabalhar. Isso faz-se clicando no botão de fechar e depois clicar em yes como resposta à pergunta. O Smalltalk é insensível aos caracteres blank. O Smalltalk é case sensitive. Convenção quanto a nomes: - Selectores de método consistem em uma ou mais palavras em Inglês - Nenhuma das palavras é abreviada - O primeiro carácter de cada palavra, excepto o primeiro, é maiúsculo. - Não há caracteres separadores, tais como _ entre as palavras - A combinação das palavras explica o que o método faz. displayFatCalories Transcript show: ‘There are’. Transcript show: (self*9) printString. Transcript show: ‘calories in the fat’ Porque displayfatCalories não contém qualquer expressão marcada com ^, o método diz-se que cai no fim, respondendo self por defeito. O método 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: não se usa, ou pelo menos eu não consigo usar, mas apenas o ^ O característica cascata do Smalltalk, também pode ser usada: displayFatCalories Transcript show: 'There are ' ; show: (self * 9) printString; show: ' calories in the fat ' (no Object studio continua a não dar/dizer que o método show foi enviado a nil. Fornecer acesso às definições de métodos predefinidos é uma das grandes e inabituais vantagens da linguagem. esse acesso aprofunda o nosso conhecimento da linguagem e facilita a reutilização de classes e métodos. Frequentemente, podemos copiar e adaptar a definição de um método ou classe existente ajustando-o/a a um novo propósito, em vez de escrever um novo método ou classe a partir do zero. SECÇÃO 5 – COMO DEFINIR MÉTODOS COM PARÂMETROS Assim, as mensagens incluirão argumentos. Transcript show: (194 convertToCaloriesWith: 4) printString Para definir tal método, vamos ver como incorporar parâmetros nas definições dos métodos. Parâmetros são nomes que servem para lidar com objectos que são fornecidos como argumentos das mensagens, tal como o 4 na expressão anterior. Assim, sempre que a mensagem de convertToCaloriesWith: paarce, o Smalltalk tem de fazer o seguinte: - Identificar o objecto argumento, 4, com o parâmetro – digamos claoriesPerGram – especificado por ti quando defines o métodos convertToCaloriesWith - Avaliara expressão self*caloriesPerGram - Responder o valor de self*caloriesPerGram para uso noutras computações. Identificar um objecto argumento com um parâmetro é chamado de associação do parâmetro. Sempre que o Smalltalk faz essa ligação, o parâmetro diz-se associado a um valor e o valor dizse associado ao parâmetro.

convertToCaloriesWith: caloriesPerGram ^ self * caloriesPerGram É importante saber que os valores para o parâmetro estabelecidos quando um método é chamado, só estão disponíveis dentro do método. O scope de um parâmetro é aquela porção de um programa que pode aceder ao valor do parâmetro. Um parâmetro de um método 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 parâmetros longos e descritivos. SECÇÃO 6 – COMO EXECUTAR TESTES USANDO PREDICADOS Um predicado é um método que responde com um de 2 objectos, true ou false. O smalltalk oferece vários predicados binários para testar as relações entre pares de nºs.: = ~= > < >= <= O not é uma mensagem unária que responde true quando enviada a false e vice-versa. Transcript show: false not printString; cr; show: true not printString; cr; O smalltalk também fornece outros predicados tais como isInteger e is string que testam instâncias se pertencem a uma determinada classe ou não. Transcript show: 4 isInteger printString; cr; show: 4 isString printString; cr; true false SECÇÃO 7 – COMO ESCREVER EXPRESSÕES CONDICIONAIS Uma expressão que avalia true ou false é uma expressão 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 parênteses 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: são combinados, ifTrue:ifFalse: diz-se que é o selector de método. Também é permitido enviar mensagens ifFalse:ifTrue Boolean expression ifFalse: if-false block ifTrue: if-true block Pode incoporar-se uma expressão condicional dentro de outra expressão 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 expressão condicional inteira é envolvida por parênteses. Os blocos podem conter expressões de resposta. Se uma expressão de resposta for encontrada durante a avaliação do bloco, o valor da expressão de resposta imediatamente se torna a resposta produzida pelo método no qual o bloco está incorporado; nada mais no método é 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. SECÇÃO 8 – COMO COMBINAR EXPRESSÕES 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 desperdiçar a computação para avaliar argumentos, muitos programadores evitam & e | todos juntos, usando antes and: e or: Ambos os métodos, 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 expressões booleanas, and e o resultado é true se ambos os valores de ambas as expresões são true, então envie à primeir expressão a mensagem & com a segunda expressão booleana como argumento.

SECÇÃO 9 – COMO INTRODUZIR VARIÁVEIS LOCAIS Uma variável é um nome que se refere a um objecto. O objecto referido por uma variável diz-se que é o valor daquela variável.

Sign up to vote on this title
UsefulNot useful