MAC 441/5714 - Tópicos de Programação
Orientada a Objetos
Aula 5 - 23/03/2004
Mais sobre Smalltalk
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.
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]
ifTrue: [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
Repetição em um Intervalo
- 1 to: 10 do: [:t| x := x +
t] "t vai de 1 a 10 em incrementos unitários"
- -10 to: 10 by: 0.1 [:t| x := x + t*t]
Expressões Literais
Em Smalltalk temos 5 tipos de literais:
- Números
- 3
30.498
-28
0.0000001
8r457 (octal)
2r0100010110 (binário)
16rAF3D0 (hexa)
1.78e-3 (notação científica)
1/3 (é uma fração que é guardada como tal,
sem perder precisão)
129871234/23948723
- Caracteres
- Strings
- 'óuauêaíó'
'Eu adoro o Smalltalk-80'
'Que carinha chato!'
'Vamos jantar no Alan''s esta noite?'
- Símbolos
- #eu
- um símbolo é um identificador único; eles
se parecem com strings mas cada símbolo é único.
- Arrays
- #(1 2 3)
#(('um' 1) ('dois' 2))
- #[ 2 03 230 95 3 0] (esse é um ByteArray, um tipo
específico de Array)
Arrays são muito utilizadas para muitas coisas em Smalltalk, por
exemplo, para passarmos mais do que 3 argumentos para um bloco:
- bloco := [:a :b :c :d :e |
a + b + c + d]
bloco valueWithArguments: #(1 2 3 4 5)
Exercício
- Escrever classe Conversor
que converte temperaturas de Celsius
para Fahrenheit
Bibliografia
- Smalltalk-80 - The Language and Its Implementation. Adele
Goldberg e David Robson.
Próxima Aula
Aula Anterior
Página de MAC 441/5714
Página do Fabio
Página do DCC