Baixe o app para aproveitar ainda mais
Prévia do material em texto
Aula 12: Princípios da Coesão de Pacotes Programação Modular Jefersson Alex dos Santos (jefersson@dcc.ufmg.br) Roteiro Modularização • Projeto de classes – fundamental para garantir a qualidade de software – insuficiente para grandes projetos de software • É necessário considerar uma maior granularidade de módulos – pacotes podem ajudar! Pacotes • Sua função é agrupar classes em espaços de nomes • Pacotes em Java: – Funciona como uma série de diretórios (hierarquicamente) – Exemplo: package test; public class A { public static void main(String args[]) { System.out.println("Hello"); } } – Convenções: • prefixo do nome de um pacote: – é sempre escrito em todas as letras minúsculas-ASCII – deve ser um dos nomes de domínio de nível superior ou um dos códigos de duas letras para países, conforme especificado na norma ISO 3166 de 1981. • componentes restantes podem seguir convenções internas • Exemplo: br.ufmg.dcc.dcc052 Pacotes • Usando classes de um pacote: – Caso 1 public class C { public static void main(String args[]) { System.out.println(com.B.getOne()); } – Caso 2 import com.B; public class C { public static void main(String args[]) { System.out.println(B.getOne()); } } – Caso 3 • Usando: import com.* Diagrama de Pacotes – UML • Pacotes e dependências: Alguns Conceitos • Coesão – O nível de especificidade de uma classe para desempenhar um papel em um contexto • Acoplamento – Dependência e “conhecimento” entre classes • Granularidade – Corresponde ao nível de detalhamento – Quanto mais granular um sistema, mais partes Fonte: http://techdistrict.kirkk.com/2010/04/22/granularity-architectures-nemesis/ Mundo ideal: Coesão Acoplamento Princípios da coesão de pacotes • Como escolhemos quais classes pertencem a cada pacote? • Alguns critérios podem ajudar: Princípio da Equivalência entre o Reuso e a Distribuição Principio do Reuso Comum Princípio do Fechamento Comum Princípio da Dependência Acíclica Princípio da Equivalência entre o Reuso e a Distribuição • “a granularidade de reuso não deve ser menor que a granularidade de distribuição” • O que é reuso? O que é distribuição? • A reutilização de uma parte de um software é facilitada se ela for separada em uma estrutura apropriada (pacote) • Suponha que a tabela hash em java seja alterada. HashMap depende de LinkedList. – Teríamos que baixar as duas classes novamente? Princípio do Reuso Comum • “classes que não são usadas junto, não devem ser agrupadas” • Se uma classe depende de outra em um pacote diferente, na verdade há uma dependência do pacote inteiro. • O agrupamento de classes relacionadas diminui a dependência entre pacotes. – Redução de acoplamento! • Exemplos: – iterator e container. – Buttons, labels e windows – Socket server e socket connection. Princípio do Fechamento Comum • “classes que mudam juntas, ficam juntas” • Quanto mais pacotes inter-relacionados há em um projeto, maior o trabalho é para gerenciar, testar e liberar atualizações. • O agrupamento de classes que mudarão juntas reduz o número de pacotes modificados • Qual o melhor tipo de pacote ? – Aquele que não depende de nada – Aquele que nada depende dele Princípio da Dependência Acíclica • “A estrutura de dependência entre pacotes deve ser um DAG (grafo direto acíclico)” • Outros princípios: – Princípio da Dependência Estável: Dependências devem acontecer do pacote mais instável para o mais estável. – Princípio da Estabilidade Abstrata: Pacotes estáveis deveriam ser abstratos. Exclusão Mútua • O Princípio da Equivalência entre o Reuso e a Distribuição e o Princípio do Reuso Comum facilita a reutilização de pacotes • O Princípio do Fechamento Comum facilita a manutenção. • É possível alternar entre princípios, começando com poucos pacotes e depois refatorá-los em vários para facilitar o reuso. Fonte: http://projetos.edugraf.ufsc.br/2009/2/convidado/PedroPauloVezzaCampos/PrincipiosArquiteturaPacotes/recursos/PrincipiosDaArquiteturaDePacotes.pdf Algumas Considerações • As relações entre pacotes tendem a mudar durante o desenvolvimento do projeto de software. • As classes em um pacote estável dependem de poucas classes de outros pacotes. • É possível mensurar o grau de abstração em um pacote: A(P) = # interfaces in P / # total classes of P Referências • Princípios de Coesão de Pacotes: http://www.objectmentor.com/resources/articles/Principles_and_P atterns.pdf • Granularidade: http://www.objectmentor.com/resources/articles/granularity.pdf • Exemplos: http://projetos.edugraf.ufsc.br/2009/2/convidado/PedroPauloVezza Campos/PrincipiosArquiteturaPacotes/recursos/PrincipiosDaArquit eturaDePacotes.pdf • Exercícios: http://homepages.dcc.ufmg.br/~fernando/classes/dcc052/ementa/ lesson12/pdf/slides_12.pdf
Compartilhar