Buscar

12 - Princípios de Coesão de Pacotes

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

Continue navegando