MAC 441/5714 - Tópicos de Programação
Orientada a Objetos
Aula 4 - 18/03/2004
Introdução a Smalltalk
"Smalltalk is by far the best programming language
available. The Family
of C programming languages has been evolving toward Smalltalk-like
functionality for the past 25 years. Java is the most Smalltalk-like of
the C family, removing the direct pointer manipulation of C++ and
adding fully integrated garbage collection. Smalltalk provides a
simpler syntax, consistency between class and instance behavior, much
higher productivity and easier maintainability. This makes it the
logical next choice for current Java developers and the logical choice
for businesses interested in reducing their total cost of ownership for
software systems." (Allen B. Davis)
Um Pouco do Ambiente de Desenvolvimento
- Welcome
- Workspace
- menu do botão da direita: explain, do it, print it,
debug it
- System Browser
- pacotes, hierarquia, classes, protocolos, métodos,
atributos, variáveis compartilhadas
- exemplo: Dialog warn 'E
aí meu irrrrrmão??'
- dar explain no warn, achar Dialog, achar choose:from:List:values:lines:cancel:,
rodar exemplo de dentro do comentário.
- File Browser
- Change List
Mensagens Encadeadas
- podemos encadear numa mesma linha ou seqüência,
quantas mensagens quisermos
- Exemplos:
- 10 ** 3 + 3 negated odd
- anosOitenta := ('Smalltalk-80' copyFrom: 10 to: 12) asNumber
negated
- pergunta: por que os parenteses são necessários
na linha acima?
Mensagens em Cascata
- Se vamos enviar várias mensagens para o mesmo objeto,
podemos usar uma forma abreviada:
- ao invés de escrever
- coleção :=
OrderedCollection new.
coleção add:
1.
coleção add:
20.
coleção add:
25.
coleção add:
30.
- podemos escrever simplesmente
- coleção :=
OrderedCollection new.
coleção add:
1;
add: 20;
add: 25;
add: 30.
- se quiser, pode colocar tudo na mesma linha, também,
separando por ;
Um detalhe importante: a mensagem yourself
- se quiséssmos colocar todo o comando anterior em uma
só linha, o seguinte não funcionaria:
- coleção :=
OrderedCollection new add:
1; add: 20; add: 25; add: 30.
- por que não?
- teríamos que fazer o seguinte:
- coleção :=
OrderedCollection new add:
1; add: 20; add: 25; add: 30; yourself.
Nomes para Métodos e outros Elementos
- É muito muito importante
- dar nomes que indiquem muito claramente o que os métodos
fazem
- dar nomes aos parâmetros que indiquem o tipo/papel dos
objetos passados por parâmetro
- utilizar as regras/estilo comumente usados pela
comunidade da linguagem (inventar seu próprio estilo nem sempre
é uma boa).
- Exemplos:
- findPreviousString: aString
startingAt: start
- indexOfSubCollection:
aSubCollection startingAt: anIndex
- evite nomes abreviados e crípticos para métodos,
classes e variáveis
- nomes de métodos e classes podem ser meio-longos; se forem
longos demais, talvez seja um indício de que o método
está fazendo coisas demais ou que a classe está com
responsabilidades demais
- métodos em Smalltalk em geral são bem curtos (de 5
a 10 linhas)
- Note que em C++ ou Java a mensagem seguinte seria muito mais
difícil de se entender forçando o leitor do código
a olhar a implementação do método para entender o
que ele faz, em Smalltalk isso não é necessário
(desde que os seletores sejam bem escolhidos)
- calendário adicionaJogoDo: 'São Paulo' contraO:
'Palmeiras' placar: 3 a: 2 dia: Date today
- em Java: calendário.adicionaJogo("São Paulo",
"Palmeiras", 3, 2, System.Date.today());
Atributos
- Temos variáveis de classe e variáveis de
instância
- Em Smalltalk todos atributos são privados e todos
métodos são públicos
- Se queremos acessar um atributo de fora da classe, precisamos ter
métodos de acesso
- A convenção Smalltalk para métodos acessores
é terem exatamente o mesmo nome do atributo
- Exemplo:
- Atributo: nomeDoPai
- método acessor para leitura: nomeDoPai
- método acessor para escrita: nomeDoPai: umNome
- bobFilho := Pessoa new.
bobFilho nomeDoPai: 'Bob Pai'.
Transcript show: 'O pai dele é', (bobFilho nomeDoPai).
Variáveis Locais
- São definidas no início do método entre | |
- Exemplo:
- |var1 var2
minhaQueridaTemporária|
Valor Devolvido
- self é o
valor default caso nada seja especificado
- pode-se especificar um valor diferente usando-se ^algumaCoisa
O que é Importante: Efeito Colateral ou Valor Devolvido
- Um método ou é responsável por devolver
algum valor interessante ou por causar algum efeito colateral
- Um efeito colateral pode ser a mudança do estado do objeto
ou o envio de mensagens a outros objetos ou ambos
- Muitas vezes não é uma boa idéia escrever um
método onde ambas as coisas (valor devolvido e efeito colateral)
são importantes; se for fazer isso, avalie o caso com cuidado
- Em todos os casos, o objetivo do método tem que estar
muito claro para o usuário dele.
Exercício
- Escrever classe Conversor que converte temperaturas de Celsius
para Fahrenheit
Bibliografia
- Conhecendo o Smalltalk. Abdala e Wangenheim.
Não deixem também de ver esta excelente página de
citações sobre Smalltalk, Java e outras linguagens.
Próxima Aula
Aula Anterior
Página de MAC 441/5714
Página do Fabio
Página do DCC