MAC 413/5715 - Tópicos de Programação Orientada
a Objetos
Aula 6 - 27/08/2003
Aumentando a Flexibilidade (continuação)
Generalização de Classes
- Uma superclasse é introduzida por um de dois motivos:
- duas ou mais classes tem implementação em comum
- duas ou mais classes tem uma interface em comum


Especialização de Classes
- uma classe pode especializar outra de 4 formas:
- adicionando estado na forma de um atributo
- adicionando estado na forma de uma associação
- adicionando comportamento na forma de um método
- alterando comportamento com um novo método que se sobrepõe a um método da superclasse
- adicionando essas coisas na superclasse poderia torná-la inchada,
não coesa. Então, criamos a subclasse para garantir a coesão
da arquitetura.
Evite Distinção de Classes Baseada no Estado (p/ melhorar
a flexibilidade)
- Se a única diferença entre uma classe e sua sub-classe
é o valor de algum atributo (estado), podemos ter problemas.
- Exemplo: na FIGURA
4.21 um empregado pode se tornar gerente e depois
deixar de se tornar gerente.
- O tipo do objeto muda ao longo do tempo, portanto é necessário
criar um novo objeto, destruir o antigo e atualizar todas as referências
para ele.
- A solução usando herança da FIGURA
4.22 não
resolve o problema.
- O problema é melhor resolvido usando agregação.
- FIGURA
4.23.
Evite Superclasses Concretas (p/ melhorar a flexibilidade)
- Comparando as figuras
4.21 e
4.22, vemos que
- a primeira é mais simples (o que é bom)
- mas a segunda é mais flexível
- No design da figura
4.21, todas as propriedades de um empregado estão
obrigatoriamente no gerente.
- No design da figura
4.22 podemos ter propriedades específicas
de empregados não-gerentes (exemplo chato: cartão de ponto).
Especialização vs. Agregação
- Ou seja, herança versus delegação (ambas são
utilizadas para acrescentar coisas novas a uma classe).
- Evite especializações nas dimensões erradas
- especializações em múltiplas dimensões
geram um crescimento exponencial no número de classes.
- vimos isso no exemplo das figuras
4.1 e
4.2
- isso gera uma herança múltipla em forma de losango
que gera muita confusão.
- Colocação das propriedades na classe correta (dentro
de uma hierarquia)
- propriedades de uma classe devem fazer sentido em todas as subclasses.
- propriedades comuns a várias subclasses devem ser definidas
na superclasse
- Com isso, vamos jogando as definições das propriedades
para cima e para baixo até achar o ponto certo.
- Cuidado ao usar herança múltipla
- em algumas empresas é proibido
- em algumas linguagens não é possível
- permite a possibilidade que uma classe herde implementações
conflitantes de métodos
- muitas vezes, usar herança múltipla é um erro
conceitual pois especialização é uma relação
do tipo "é um tipo de".
- (mau) Exemplo: FIGURA
4.32.
Agregação
- Como tornar arquiteturas construídas com agregação
mais flexíveis
- esconda as partes internas do agregado
- Limite o que uma classe conhece sobre a outra.
- No exemplo da figura
4.33, os clientes do caixa automático
não deveriam acessar diretamente as classes agregadas.
- O padrão Façade pode ajudar aqui.
- reutilização das partes agregadas.
- se eu quiser usar a classe leitora de cartões tanto num
caixa automático quanto numa máquina de pedágio.
- quando o cartão é inserido e lido, o leitor precisa
enviar uma mensagem para o caixa automático ou para a máquina
de pedágio.
- se no design original há uma associação entre
o leitor de cartão e um caixa automático, o design precisa
ser alterado pois a máquina de pedágio não é
do tipo caixa automático.
- para introduzir a flexibilidade, é necessário eliminar
o acoplamento do leitor de cartão com o caixa.
- Solução: criar superclasse abstrata "card driven"
comum a todos os tipos de coisas que utilizarão o leitor de cartões.
- Figure
4.34.
Referência
Charles Richter. Designing Flexible Object-Oriented Systems with UML
. Capítulo 4: Flexibility Guidelines for Class Diagrams. Macmillan
Technical Publishing, 1999.
Atividade 1
Utilizando diagramas UML, desenvolva um projeto de Arquitetura para um sistema
de votação eletrônica distribuída. Através deste sistema, os eleitores terão a
opção de votar de suas próprias casas ou de ir até uma seção eleitoral do TRE.
Você deverá apresentar uma descrição do seu sistema incluindo:
- um diagrama de implantação para indicar quais serão os programas e componentes
que irão fazer parte do sistema e onde serão executados,
- um (ou mais) diagrama de classes indicando a arquitetura de cada parte
relevante do sistema e
- um diagrama de casos de uso mostrando como eleitores, fiscais de partidos e
administradores do sistema interagem com o sistema.
O sistema deverá ser capaz de gerenciar uma eleição simultânea para
presidente, 2 senadores, deputado federal, governador e deputado
estadual. Para cada um destes cargos, há um número variado de candidatos
(desde 4 até milhares). A modelagem dos dados também deve ser orientada a
objetos, ou seja, praticamente tudo no seu sistema serão objetos. A lista dos
candidatos válidos e os votos efetuados devem seguir uma estrutura orientada a
objetos e o sistema deverá ser capaz de totalizar o resultado da votação
automaticamente.
Opcionalmente, você poderá usar texto para explicar algum ponto específico,
mas a ênfase deve ser na qualidade dos diagramas UML. Se quiser, sua
especificação pode ser composta apenas por diagramas, sem texto.
Próxima Aula
Aula Anterior
Página de MAC 413/5715
Página do Fabio
Página do DCC