O Exemplo



next up previous contents
Next: A Interface Up: Aplicações Interactivas em Smalltalk/V Previous: Objectivos

O Exemplo

 

O exemplo consiste numa Estação de Serviço Auto. A Estação de Serviço possui uma máquina para lavagem de automóveis e outra para alinhamento de direcções. Quando um automóvel entra na Estação, é preenchida uma ficha que o acompanhará durante a sua presença na mesma, nessa ficha é registado qual(ais) o(s) tipo(s) de serviço(s) pretendido(s). Depois de preenchida a ficha, o automóvel é colocado na fila de espera de um dos serviços pretendidos. Quando o serviço é realizado, o automóvel é retirado da fila de espera desse serviço e é colocado na fila de espera de outro serviço. Depois de percorrer todos os serviços pretendidos o automóvel é finalmente colocado na fila de espera da caixa de pagamento, o valor a pagar dependerá dos serviços utilizados.

Pela descricão da Estação de Serviço identificam-se, inicialmente, os seguintes objectos:

Um automóvel é identificado pela sua matrícula, guardando-se também a marca e o modelo do automóvel; para cada um destes valores existe uma variável de instância. Para saber quais os serviços de que o automóvel necessita, existem as variáveis de instância boaLimpeza e boaDireccao: se o valor das variáveis for false, então o automóvel necessita do serviço respectivo. Uma vez que ao chegar à caixa é necessário saber quanto vai pagar cada automovel, optou-se por criar uma subclasse de Automovel que apenas acrescenta a variável de instância despesa (o valor a pagar) e métodos para a manipular: trata-de da classe AutoComFactura (ver apêndice B).

Uma vez que as classes Lavagem, Direccao e Caixa são todas filas de espera, foram colocadas como subclasses da classe Queue (ver apêndice C). Note-se que o método first não é implementado na classe Queue, uma vez que ele está definido numa superclasse (em IndexedCollection).

As classes Lavagem e Direccao possuem variáveis de classe em que é registado o preço do respectivo serviço. Deste modo, todas as instâncias de cada uma das classes partilham o mesmo preço de serviço.

Uma chamada de atenção especial, na classe Caixa, para o método listCaixa: constroi uma lista com as matrículas dos automóveis que estão na fila de espera e a sua utilidade é descrita no capítulo 3. A utilização de expressões do tipo self changed: será também explicada mais adiante.

Falta agora combinar as classes apresentadas para criar a Estação de Serviço, isso é feito na classe EstacaoServico. Esta classe declara três variáveis de instância, uma para a lavagem, outra para o alinhamento e outra para a caixa. É importante referir dois métodos em particular. O método start inicializa uma instância:

  
start
        "comecar"
    Alinhamento setPreco: 10.
    Lavagem setPreco: 20.
    alinhamento := Alinhamento new.
    caixa := Caixa new.
    lavagem := Lavagem new.
    self dependsOn: alinhamento; dependsOn: lavagem.!
O método começa por definir o preço de cada um dos serviços e, de seguida, cria instâncias de cada um dos serviços e de Caixa. De seguida, envia a self duas mensagens dependsOn:, o objectivo é declarar que esta instância de EstacaoServico depende de alinhamento e de lavagemgif. Como se pode ver nos métodos sai de Lavagem e de Alinhamento, sempre que um automóvel é retirado da fila de espera, a mensagem changed: é enviada à instância na qual a remoção está a ser feita (como parâmetro da mensagem é enviado o automóvel removido). Como consequência, sempre que um automóvel é removido de uma dessas filas de espera, é enviada à estacão de serviço a mensagem update: com o automóvel removido.

A mensagem update:

update: aCar
        "re-inserir carro"
        aCar  testaDireccao
                ifFalse: [alinhamento chega: aCar]
                ifTrue: [aCar testaLimpeza
                               ifFalse: [lavagem chega: aCar]
                               ifTrue: [caixa chega: aCar]
                        ]! !
testa se o automóvel ainda necessita de algum serviço ou se já deve ir para a caixa e coloca-o na fila de espera correspondente.

Com as classes apresentadas é já possível criar uma instância de EstacaoServico e simular o funcionamento do sistema. É no entanto necessário escrever as expressões manualmente e mandar executá-las explicitamente.



next up previous contents
Next: A Interface Up: Aplicações Interactivas em Smalltalk/V Previous: Objectivos



Jose Franscisco Creissac Campos
Wed Jan 31 12:57:29 MET 1996