MAC 441/5714 - Tópicos de Programação
Orientada a Objetos
Aula 6 - 27/03/2008
Mais sobre Smalltalk (Repetições e
Coleções)
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 do:[:t| x := x + t*t]
Um exemplinho para recordarmos a Sintaxe de Smalltalk:
| umArray umIndice umValor |
umValor := 2.
umArray := Array new: 10.
1 to: 10 do:
[:indice
| umArray at: indice put: (umValor * indice * indice)].
umIndice := 1.
[umIndice <= umArray size]
whileTrue:
[Transcript show: 'O valor na posição: ',
(umIndice printString), ' é ',
(umArray at: umIndice) printString ; cr.
umIndice := umIndice + 1.]
Um bom jeito de aprendermos o estilo de programação em
Smalltalk é vermos como são implementadas as
funções da própria biblioteca. Veja, por exemplo,
como é implementado o método Number>>to:do:
to: stop do: aBlock
"Normally
compiled in-line, and therefore not overridable.
Evaluate
aBlock for each element of the interval (self to: stop by: 1)."
| nextValue |
nextValue :=
self.
[nextValue
<= stop]
whileTrue:
[aBlock value: nextValue.
nextValue := nextValue + 1]
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)
bloco valueWithPossibleArgs: #(1 2 3 4 5 6 7 8 9 10)
Exercício
- Escrever classes TemperaturaFahrenheit
e TemperaturaCelsius que
permitam conversão de tipos entre elas.
- Usar convenção Smalltalk para escrever
métodos no papel:
- NomeDaClasse>>nomeDeMétodoSemParâmetros
- NomeDaClasse>>seletor1:seletor2:seletor3:
Minha solução do exercício (código-fonte
gerado pelo Squeak):
- MAC5714-Temperaturas.html
- MAC5714-Temperaturas.st.
Este arquivo .st pode ser carregado na sua imagem. Para fazer isso,
após baixar o arquivo, abra a ferramenta "File List", clique em
cima no nome do arquivo .st e aperte o botão Install.
- Novo exercício: refatore as minhas duas classes, extraindo
comportamento e variáveis comuns para uma super-classe Temperatura.
Coleções
- A biblioteca de classes de Smalltalk vem com toda uma hierarquia
de classes para manipulações de coleções
que é extremamente interessante.
- As coleções são muitíssimo utilizadas
por qualquer programa Smalltalk de médio ou grande porte.
- Vale a pena estudar não só a interface das
coleções mas também estudar um pouco a sua
implementação.
Tipos de Coleções
- Collection: é
uma classe abstrata básica que é mãe de todas as
coleções
- A rigor, em Smalltalk não existem classes abstratas mas
este conceito é obtido de forma simples e eficiente
através do método subclassResponsibility
que é implementado pela classe Object.
- Bag: é um
saco de objetos onde não interessa a sua ordem e pode haver
repetição de elementos
- Set: igual a Bag mas
não há repetição de elementos (qq.
semelhança com o conceito matemático de conjuntos
não é mera coincidência :-)
- SequenceableCollection:
classe abstrata para representar coleções que podem ser
indexadas
- ArrayedCollection:
classe abstrata para representar coleções
seqüenciáveis de tamanho fixo
- Principais tipos concretos de ArrayedCollection: ByteArray (vetor de SmallIntegers), String (vetor de caracteres), Text (vetor de caracteres com
formatação), Array
(vetor de Objects),
RunArray (vetor de Objects com
representação específica para vetores com muita
repetição contígua), SoundBuffer (com vários
métodos específicos para manipulação de
áudio).
- OrderedCollection:
elementos são guardados na ordem em que foram adicionados
à coleção; podem ser acessados por um
índice; seu comprimento pode ser variável.
- SortedCollection:
similar a OrderedCollection
mas seus elementos são ordenados por um algoritmo de
ordenação.
- Interval: representa
números em um intervalo (exemplo:
- Dictionary: é
um conjunto (Set) de
associações (Associations).
Uma associação é um par de objetos do tipo <chave,valor>.
(associação pode ser criada assim: 1->5 ou #blue->#azul)
Protocolos Comuns a todas as subclasses de Collection
- adding
- add: newObject
- addAll: aCollection
- removing
- remove: oldObject
- remove: oldObject ifAbsent: anExceptionBlock
- removeAll: aCollection
- testing
- includes: anObject
- isEmpty
- occurrencesOf: anObject
- enumerating
- do: aBlock
- select: aBlock
- reject: aBlock
- collect: aBlock
- detect: aBlock
- detect: aBlock ifNone: exceptionBlock
- inject: thisValue into: BinaryBlock
- instance creation
- with: anObject
- with: anObject with: anObject
- with: anObject with: anObject with: anObject
- with: anObject with: anObject with: anObject with: anObject
- conversion
- asSet
- asBag
- asOrderedCollection
- asSortedCollection
- asSortedCollection: aBlock
- Exemplos:
- s := Set with: $s with:
$e with: $t
- cont := 0.
meuTexto do: [ :letra |
letra asLowercase == $a
ifTrue: [ cont := cont + 1]]
- (meuTexto select: [:letra
| letra asLowercase ==
$a]) size
- (meuTexto reject: [:letra
| letra asLowercase ~=
$a]) size
- meuTexto inject: 0
into: [:cont :proxElem
|
cont + (proxElem asLowerCase == $a
ifTrue: [1]
ifFalse: [0])]
- aCollection inject: 0
into: [:subTotal :next | subTotal + next]
Bibliografia
- Smalltalk-80 - The Language and Its Implementation. Adele
Goldberg e David Robson.
- Um site bem interessante sobre coleções.
Próxima Aula
Aula Anterior
Página de MAC 441/5714
Página do Fabio
Página do DCC