Problema: quem controla os eventos acionados pelos atores externos a aplicação.
Solução: adicione responsabilidade a classe controladora quando:
A classe representa o próprio sistema ou um dispositivo.
A classe que representa um caso de uso.
Mecanismos:
A decisão de se optar por um controlador baseado em caso de uso ou de um dispositivo/sistema está associado aos padrões de baixo acoplamento e alta coesão.
Atenção quanto a controladores sobrecarregados.
Alta Coesão
Problema: como manter o objeto focado, gerenciado e entendível ao mesmo tempo que se mantém com baixo acoplamento.
Solução: atribua responsabilidade de forma a manter a coesão alta.
Mecanismos:
Concentre análise nas classe com muitos métodos desconectados uns dos outros.
Analise métodos que realizam “coisas” demais.
Coesão Alta e Baixo Acoplamento: Estes dois conceitos são complementares.
Coesão coincidental
· Há nenhuma (ou pouca) relação construtiva entre os elementos de um módulo
· No linguajar OO:
· Um objeto não representa nenhum conceito OO
· Uma coleção de código comumente usado e herdado através de herança (provavelmente múltipla)
Coesão lógica
· Módulo faz um conjunto de funções relacionadas, uma das quais é escolhida através de um parâmetro ao chamar o módulo
· Semelhante a acoplamento de controle
· Cura: quebrar em métodos diferentes
Coesão temporal
· Elementos estão agrupados no mesmo módulo porque são processados no mesmo intervalo de tempo
· Exemplos comuns:
· Método de inicialização que provê valores defaults para um monte de coisas diferentes
· Método de finalização que limpa as coisas antes de terminar
· Cura: depender de construtores e destrutores, outro exemplo: arquivo de configuração típico.
Coesão procedural
· Associa elementos de acordo com seus relacionamentos procedurais ou algorítmicos
· Um módulo procedural depende muito da aplicação sendo tratada
· Junto com a aplicação, o módulo parece razoável
· Sem este contexto, o módulo parece estranho e muito difícil de entender
· "O que está acontecendo aqui!!!????!!"
· Não pode entender o módulo sem entender o programa e as condições que existem quando o módulo é chamado Cura: reprojete o sistema.
Coesão de comunicação
· Todas as operações de um módulo operam no mesmo conjunto de dados e/ou produzem o mesmo tipo de dado de saída
· Cura: isole cada elemento num módulo separado
· "Não deveria" ocorrer em sistemas OO usando polimorfismo (classes diferentes para fazer tratamentos diferentes nos dados)
Coesão sequencial
· A saída de um elemento de um módulo serve de entrada para o próximo elemento
· Cura: decompor em módulos menores
Coesão funcional (a melhor)
· Um módulo tem coesão funcional se as operações do módulo puderem ser descritas numa única frase de forma coerente
· Num sistema OO:
· Cada operação na interface pública do objeto deve ser funcionalmente coesa
· Cada objeto deve representar um único conceito coeso
· Exemplo: um objeto que esconde algum conceito ou estrutura de dados ou recurso e onde todos os métodos são relacionados por um conceito ou estrutura de dados ou recurso
· Meyer chama isso de "information-strength module"
Consequências:
Melhor claridade e facilidade de compreensão do projeto
Simplificação da manutenção
Frequentemente vai mão na mão com acoplamento fraco
Com granularidade baixa e funcionalidade bem focada, aumenta o reuso.