MAC 441/5714 - Tópicos de Programação
Orientada a Objetos
Aula 4 - 16/03/2006
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 / Smalltalk Introduction
- Navigator, Widgets, Supplies
- Workspace
- menu do botão da direita: explain, do it, print it,
inspect it, debug it
- Transcript
- Message Names
- Method Finder
- System Browser
- pacotes, hierarquia, classes, protocolos, métodos,
atributos, variáveis compartilhadas
- exemplo: ver
classe String do pacote Collections-Text
- File List
- Change Set
- Change Sorter
- Recent
- Processes
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
Blocos
- Um bloco é um objeto que contém uma
seqüência de instruções a serem executadas
- Um bloco é uma seqüência postergada de
ações
- Sintaxe: [
ação1. ação2. ação3. ...
açãon]
- Exemplos:
- [índice := índice
+ 1]
- [índice := índice
+ 1.
array at: índice put: 32]
- note a indentação acima, é a comumente
utilizada, i.e., blocos são "retangulares".
- blocos podem ser passados como parâmetros ou guardados em
variáveis:
- ações at:
'pagamentos mensais'
put: [FinançasCaseiras gastoDe:
1200 em: 'aluguel';
gastoDe: 60 em: 'jornal';
gastoDe: 350 em: 'manutenção do carro';
gastoDe: 13.50 em: 'Nhá Bentas']
- O trecho de código acima não envia nenhuma mensagem
para o objeto FinançasCaseiras,
ele simplesmente envia o bloco para o objeto ações que
provavelmente o guardará como sendo um bloco associado ao string
'pagamentos mensais' e
que deverá ser executado mais tarde no momento oportuno.
- Objetos do tipo bloco podem ser executados enviando-se para eles
a mensagem value
- Por exemplo, faríamos algo como (ações at: 'pagamentos
mensais') value para recuperar e executar o bloco armazenado
- Às vezes, armazenamos blocos em variáveis: incrementBlock := [index := index + 1]
- O valor devolvido por um bloco é o valor devolvido pela
última expressão dentro dele.
Repetição
- Por ser uma linguagem minimalista, Smalltalk não possui
comandos de repetição, laços, etc.
- Mas os números possuem métodos que fazem exatamente
isso.
- Exemplo:
- 4 timesRepeat: [quantia := quantia + 10]
Condicionais
- Por ser uma linguagem minimalista, Smalltalk não possui
comandos como if, while, for, etc
- Mas os tipos booleanos possuem mensagens que assumem este papel
- A biblioteca de classes possui as classes Boolean, True e False
- As classes True e False só tem uma
instância cada; são chamadas de true e false
- Exemplos:
- (x < 0)
ifTrue:
[Dialog warn 'Cuidado, o número é negativo!']
- (número \\ 2) = 0
"resto da divisão por 2 é 0?"
ifTrue: [paridade := 0]
ifFalse: [paridade := 1]
- paridade := (número \\ 2) = 0 ifTrue: [0] ifFalse: [1]
Repetição Condicional
- index := 1.
[index <= list size]
whileTrue: [list at: index put: 0.
index := index + 1]
- [list size >= 10] whileFalse: [list getMoreContents]
- exercício interessante: ver a implementação
do método timesRepeat:
Argumentos para Blocos
- Blocos podem receber um ou mais argumentos
- meuQueridoBloquinho := [:array |
total := total + array size]
- meuQueridoBloquinho value:
meuQueridoVetor
- [:novoElemento |
índice := índice + 1.
lista at: índice put: novoElemento]
- delta := [:a :b :c | b ** 2
- (4 * a * c)].
delta value: 10 value: 20
value: 30
Bibliografia
- Smalltalk-80 - The Language and
Its Implementation. Adele
Goldberg e David Robson.
- Conhecendo o Smalltalk.
Abdala e Wangenheim.
Próxima Aula
Aula Anterior
Página de MAC 441/5714
Página do Fabio
Página do DCC