Acoplamento e Coesão Modelagem e Programação Orientada a Objetos

Slides:



Advertisements
Apresentações semelhantes
Programação em Java Prof. Maurício Braga
Advertisements

Paulo Marques Hernâni Pedroso
Modificadores Marco Antonio. Introdução Em todas as linguagens de programação o acesso a classes/métodos deve seguir algumas regras.
Engenharia de Software
Orientação a Objetos: Encapsulamento e Classificação
Java: Pacotes e Modificadores de Visibilidade
De 17 1 Linguagens de Programação Orientadas a Objetos Pós-Gradução(Lato-Sensu) em Sistemas de Banco de Dados - UFPa Marco Fagundes Aula.
Generalização, Especialização e Conceitos
Refatorações Experiência é aquela coisa maravilhosa que permite que você reconheça um erro tão logo o cometa novamente F.P. Jones.
Atribuição de Responsabilidades em Projeto OO
Introdução a diagrama de classes e UML
Linguagem de Programação II
Paradigmas da Programação – Semestre 1 – Aula 5
JAVA ENUMS © 2009 by Jorge L. de Souza Leão março de 2009 PEE - COPPE/UFRJ.
Herança e Polimorfismo
Classes e objetos P. O. O. Prof. Grace.
Definição É um padrão de desenvolvimento utilizado na orientação a objeto quando queremos manter baixo o nível de acoplamento entre diferentes partes.
Se liga aí, que é hora da revisão!
Tipos Agregados Homogêneos e Listas
Programação Orientada a Objetos com Java
Aula prática 13 Orientação a Objetos – C++ Parte 1
Nazareno Andrade (baseado no material de Hyggo Almeida)
Singleton e Adapter Professor: Nazareno Andrade
Linguagens Orientadas a Objeto
METODOLOGIA PARA DESENVOLVIMENTO DE SISTEMAS Prof. Dr. rer. nat. Daniel D. Abdala 1.
Conceitos.
Sobrecarga e Encapsulamento
Programação Orientada à Objetos
Atributos, Encapsulamento e Interface em Java
Programação I Aula 2 (Métodos)
Classes, Objetos, Atributos e Métodos JAVA
if669 - Introdução à Programação
Professora Lucélia Oliveira
PHP Orientado a Objetos Análise e Desenvolvimento de Sistemas Prof
Orientação a Objetos Parte I
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa This.
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa Membro Static.
Laboratório I Mateus Raeder. Mateus Raeder – fevereiro de 2009 Associação entre classes  Um objeto é a representação de uma entidade do mundo real 
INTRODUÇÃO À ORIENTAÇÃO A OBJETOS EM JAVA
Curso de Aprendizado Industrial Desenvolvedor WEB Disciplina: Programação Orientada a Objetos I Professora: Cheli Mendes Costa Classes e Objetos em Java.
Programação Orientada à Objetos
Wagner Santos C. de Jesus
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Implementação Orientada a Objetos – Aula 03
Tratamento de Exceções
UTFPR – Campus Curitiba - DAELN Cursos de Eng. Eletrônica/Eng
Prof. Gilberto Irajá Müller
Orientação a Objetos usando Java
Aula Prática 4 Monitoria IP/CC (~if669).
Classes Abstratas e Interface
Programação I Aula 1 Prof. Gilberto Irajá Müller Última atualização 2/3/2009.
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Herança Modelagem e Programação Orientada a Objetos
Programação II Prof. Mateus Raeder Universidade do Vale do Rio dos Sinos - São Leopoldo -
Modificadores Programação II.
Padrões de projeto M.Sc. Sílvio Bacalá Jr..
Introdução a Orientação a Objetos
Classes abstratas São classes das quais não se pode instanciar objetos. São classes das quais não se pode instanciar objetos. Seu objetivo é ser herdada.
2 – Revisão de Programação Orientada a Objetos
Módulo II Capítulo 1: Orientação a Objetos
Relacionamentos UML e Polimorfismo
IF 718 Análise e Projeto de Sistemas Augusto Sampaio Vitor Braga (Estágio docência) Camila Sá (Monitora) Parte do material cedido pela Qualiti Software.
Aula 6 – Padrão Factory Method
Aula 7 – Padrão Abstract Factory
CURSO JAVA BÁSICO Módulo 9 – slide 1 Módulo 10 Threads.
Diagrama de Classes Modelagem e Programação Orientada a Objetos Curso Superior de Tecnologia em Sistemas para Internet Prof. Cristiano Stüpp Nunes
Engenharia de Software Orientada a Objetos Professor: Guilherme Timóteo Aula 3: – Modelagem de Classes (parte 2)
GRASP: Projeto de Objetos com Responsabilidade – Parte 2.
1 Interface (o termo) » Interface (a palavra reservada): Java estendeu o conceito de interfaces à um nível ainda mais flexível que permite construir entidades.
Introdução à Orientação a Objetos em Java Prof. Gustavo Wagner (Alterações) Slides originais: Prof. Tiago Massoni Desenvolvimento de Sistemas FATEC-PB.
Transcrição da apresentação:

Acoplamento e Coesão Modelagem e Programação Orientada a Objetos Curso Superior de Tecnologia em Sistemas para Internet Prof. Cristiano Stüpp Nunes cristiano.nunes@veris.edu.br

Acoplamento Acoplamento é uma medida “inter” componentes, no caso de OO, uma medida entre o relacionamento de classes; É o grau de dependência entre classes; Refere-se ao nível em que uma classe conhece ou usa membros de uma outra classe; Os dois espectros dessa medida são: Baixo Acoplamento (ou Acoplamento Fraco) Alto Acoplamento (ou Acoplamento Forte )

Baixo Acoplamento Se o único conhecimento que a classe A tem sobre a classe B, é que a classe B foi exposta através de sua interface, então as classes A e B tem um baixo acoplamento; Baixo acoplamento é o estado desejável para classes bem encapsuladas que minimizam as referências umas às outras.

Alto Acoplamento Se a classe A se baseia em partes da classe B que não fazem parte da interface de B, então elas são bastante acopladas; Em outras palavras, se A sabe mais do que deveria sobre a forma como B foi implementada, então A e B estão bastante ligadas; O alto acoplamento é o estado indesejável de se ter classes que desobedecem às regras do baixo acoplamento.

Problemas do Alto Acoplamento Difícil entendimento: A classe é mais difícil de se entender isoladamente; Exemplo: Ao tentar encontrar um erro no seu sistema, você começa a analisar uma determinada classe A e descobre que para entender essa classe A, precisa estudar a classe B que está ligada a ela, para também entender esta, precisa estudar a classe C, e assim por diante.

Problemas do Alto Acoplamento Difícil reutilização: A classe é mais difícil de ser reusada, já que depende da presença de outras classes; Exemplo: Digamos que seja necessário retirar uma determinada parte do sistema, algo como um módulo de calcular folha de pagamento de um sistema financeiro, para ser levada e adequada a outro sistema financeiro, imagine que as classes responsáveis por isso, estejam ligadas ao módulo de RH, você vai levar o módulo de RH junto?

Problemas do Alto Acoplamento Propagação de mudanças: Mudanças em uma classe relacionada força mudanças locais à classe; Exemplo: Imagine que seja necessário mudar uma classe do módulo de folha de pagamento, para isso, teria que mudar a classe que está no módulo de RH, e se você não for o responsável pelo módulo de RH? E se além de ter que mudar esta classe, também mudar várias outras que estão ligadas à primeira.

Exemplo de Alto Acoplamento Dada um simples classe Contato (mal implementada): public class Contato { //atributos não encapsulados String nome; String endereco; String fone; //construtor que depende do tipo e quantidade de atributos public Contato(String n, String e, String f) { nome = n; endereco = e; fone = f; }

Exemplo de Alto Acoplamento public class DAO { public String incluiContato(Contato contato) { //como Contato não é encapsulado, //permite que esse metódo acesso os atributos diretamente return "INSERT INTO TABLE contatos VALUES ('" + contato.nome + "', '" + contato.endereco + "', '" + contato.fone +"')"; } A classe DAO tem um considerável nível de dependência em relação a classe Contato

Exemplo de Alto Acoplamento public class Controlador { private DAO dao = new DAO(); //uma alteração na implementação da classe Contato //pode exigir alterações na classe Controlador private Contato contato = new Contato("Angelina Jolie", "Fifth Avenue, NY", "1-415-8273"); public void persistaDados() { //pode exigir alterações na classe DAO dao.incluiContato(contato); } A classe Controlador tem dependência em relação a classe DAO e Contato

Herança versus Alto Acoplamento “Herança é um tipo de acoplamento particularmente forte.” A alteração da implementação de um método na superclasse vai afetar todas as subclasses dessa; Design Patterns dão prioridade a Composição e aconselham utilizar Herança com muita prudência e em pouquíssimas situações; Ao usar Composição tome cuidado para não deixar as classes fortemente dependentes, pois ainda assim corre-se o risco do alto acoplamento.

Como minimizar o Alto Acoplamento Encapsulamento (sempre); Uso de Design Patterns (Padrões de Projeto); Classes Abstratas; Uso de Interface; Evitar o uso malfeito de Herança; “Program to an interface, not an implementation” (Erich Gamma) “Programe voltado à interface e não à implementação”

Program to an interface, not an implementation Não significa estritamente e somente usar a palavra reservada interface do Java; Está também relacionado a encapsular os atributos e a implementação dos métodos e permitir o acesso a eles somente através dos getters e setters (interface); Interface é um termo genérico nesse caso; Interface representa “o que” uma classe faz, mas não “como” ela faz. public interface Mamifero { public void nascer(); public void mamar(); public void morrer(); }

Coesão Coesão é uma medida “intra” componentes, isto é, procura medir um componente individualmente; Refere-se ao nível em que uma classe tem um único e bem definido papel ou responsabilidade; Os dois espectros dessa medida são: Baixa Coesão (Coesão Fraca) Alta Coesão (Coesão Forte)

Baixa Coesão Baixa coesão é o estado indesejável de uma classe cujos membros dão suporte a vários papéis ou responsabilidades não focados; Uma classe com baixa coesão faz muitas coisas não relacionadas e leva aos seguintes problemas: Difícil de entender Difícil de reusar Difícil de manter E é “delicada“ – constantemente afetada por outras mudanças

Exemplo de Baixa Coesão public class Angu { public String funcionario; private float perimetro; public float nota_bimestral; private float valor_mensal; public static int calculaDiametro(float raio) { // ... } public static int calcularMedia(Vector numeros) { public static outputStream abreArquivo(String nomeArquivo) {

Alta Coesão Alta coesão é o estado desejável de uma classe cujos membros dão suporte a um único e bem definido papel ou responsabilidade; Também conhecida como Coesão Funcional; O principal benefício da alta coesão é que normalmente tais classes são mais fáceis de manter (e menos freqüentemente alteradas) do que as classes com baixa coesão; Quanto maior for a coesão, menor será o nível de acoplamento de um módulo.

Exemplo de Alta Coesão A implementação de um JavaBean (ou entity bean – bean de entidade) é um exemplo claro de altíssima coesão: public class Contato { private String nome; private String fone; public Contato() { } public String getNome() { return nome; } public void setNome(String nome) { this.nome = nome; } public String getFone() { return fone; } public void setFone(String fone) { this.fone = fone; } }

“Alta coesão e baixo acoplamento.” Implementação Ideal “Alta coesão e baixo acoplamento.” Não é simples e nem fácil de se alcançar; Mas podemos tentar chegar próximo do ideal.