Padrões para atribuir responsabilidades: Baixo Acoplamento

Documentos relacionados
A organização modular tem como finalidade básica auxiliar o gerenciamento de sistemas complexos.

GRASP. Nazareno Andrade (baseado em Hyggo Almeida e Jacques Sauvé)

Padrões de Projeto de Software

Análise e Projeto Orientados por Objetos

Programação Java (nível intermediário) 4. Polimorfismo

DCC004 - Algoritmos e Estruturas de Dados II

Interfaces POO. Prof. Marcio Delamaro

Programação Orientada a Objetos Relacionamentos entre classes

Computação II - Java - Prova 1 Prof. Adriano Joaquim de Oliveira Cruz /05/13. Questão: Total Pontos: Gráu:

// quando o estado do Sujeito muda

PROGRAMAÇÃO ORIENTADA A OBJETOS: OCULTAR INFORMAÇÕES E ENCAPSULAMENTO

Programação com Objectos. Processamento de Dados I. 2. Classes, Atributos e Métodos

Herança. Prof. Fernando V. Paulovich 23 de agosto de 2010

// quando o estado do Sujeito muda

Recapitulando. Construtores: (Overload assinatura) public Circle() {...} public Circle(double x, double y, double r) {... }

Interfaces e Classes Internas

Universidade de Mogi das Cruzes Implementação Orientada a Objetos - Profª. Danielle Martin. Guia da Sintaxe do Java

Lista de exercícios 1. 1) Diga quais são as vantagens da modularização e explique cada uma delas.

nome = n; cargo = c; salario = s; public void print() { System.out.println(nome cargo salario); public void aumento( double fator){

Padrões para atribuir responsabilidades: Expert

Estrutura de Dados Funções e Procedimentos

Classes e Objetos INTRODUÇÃO À ORIENTAÇÃO A OBJETOS COM JAVA - MÓDULO II. Classes. Objetos. Um modelo para a criação de objetos

Linguagem de Programação II Implementação

Lista 05 Herança. public class PessoaFisica extends Pessoa { private String RG; public PessoaFisica(){ super(); } public String getrg(){ return RG; }

Padrões para atribuir responsabilidades: Alta Coesão

6. Pesquisa e Ordenação

Collections Framework

Universidade Federal de Uberlândia Faculdade de Computação Programação Orientada a Objetos II Prof. Fabiano Dorça. Padrão Observer (Observador)

Aula 5 POO 1 Encapsulamento. Profa. Elaine Faria UFU

Linguagem de Programação II Implementação

Objetivos. Explorar os conceitos fundamentais acerca do uso herança na linguagem Java

Dados armazenados em um objeto podem ser tanto primitivos, tais como inteiros ou caracteres, ou referências para outros objetos.

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Hierarquia de classes e mecanismo de ligação

Para entender o conceito de objetos em programação devemos fazer uma analogia com o mundo real:

4 Conceito de Herança

Programação Orientada a Objetos 2 Flávio de Oliveira Silva, M.Sc.

Linguagem de Programação I

Iterator. Professor: Hyggo Almeida

Tratamento de Erros. Sérgio Luiz Ruivace Cerqueira

Tipos, Literais, Operadores

Tipos, Literais, Operadores

Quando um programa viola as restrições semânticas da linguagem, a JVM assinala um erro ao programa, sob a forma de exceção.

Encapsulamento. Separa a interface de um objeto dos detalhes de seu funcionamento interno. Caixa preta 2/27

Singleton. Como a maioria dos programadores organizaria o código para acessar informação de configuração? Eis um exemplo:

Programação OO em Java. Profa Andréa Schwertner Charão DELC/CT/UFSM

Linguagem de Programação IV Introdução

Padrões de Projeto. Padrões de Projeto. Além dos 23 Padrões GoF. Os 23 Padrões de Projeto. Documentação de um Padrão. Classificação dos Padrões

Visitor. Um problema a resolver. Temos uma hierarquia de classes, provavelmente um Composite Exemplo: Numa rede elétrica, temos a seguinte hierarquia:

UNIP - Ciência da Computação e Sistemas de Informação. Estrutura de Dados. AULA 5 Pilhas

Palavras Reservadas da Linguagem Java

Java para Desktop. Programação Orientada à Objetos 2 JSE

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

Programação Orientada a Objetos. Vagner Luz do Carmo - Vluzrmos

Linguagem Algorítmica OO. Linguagem Algorítmica

LEIC-A / MEIC-A 2007/2008 (1º

Abstract Factory. Prover uma interface para criar uma família de objetos relacionados ou dependentes sem especificar suas classes concretas

1 Introdução e Conceitos básicos

Encapsulamento. Alberto Costa Neto DComp - UFS

Unidade 3: Classes em Java Para Programadores C Classes, Objetos e Tratamento de Erros Prof. Daniel Caetano

Especificam quem tem acesso a cada entidade, isto é, quem tem acesso a. cada classe e cada membro da classe (dados e métodos)

Unidade: Classes Abstratas, Polimorfismo, Sobreposição e Interfaces

PROGRAMAÇÃO ORIENTADA A

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

Programação Estruturada e Orientada a Objetos

Classes e Objetos em Java. Algoritmos e Programação I. Classes. Classes. Modificadores de Acesso. Classes. Revisão

Instituto de Informática Estrutura de Dados II

Programação com Objectos Teste Teórico (repescagem) 24 de Janeiro de 2009, 09:00 (120 minutos)

9 Classes Abstractas e Interfaces

Ex: carro_desportivo poderá ser uma subclasse de automóvel (carro_desportivo é_um automóvel)

DATA ACCESS OBJECT (DAO)

INF1636 PROGRAMAÇÃO ORIENTADA A OBJETOS

Boas práticas com Orientação a Objetos. Paulo Silveira

Java 2 Standard Edition Classes internas

Programação OO em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

POO29004 Programação Orientada a Objetos

Programação Orientada a Objetos Flávio de Oliveira Silva 144

Programação Orientada a Objetos. Encapsulamento

Java RMI. RMI Remote Method Invocation. Chamadas Remotas de Procedimentos (RPC) RPC - Implementação

Linguagem de Programação Orientada a Objeto Abstração - Encapsulamento

Padrão de projeto de software

Computação II Orientação a Objetos

Herança e Polimorfismo

Algoritmos e Programação 2. Objetos e Classes em Java. Classes. Revisão. Definições de classes incluem (geralmente):

Apêndice A. Alguns construtores e métodos importantes e úteis da classe Vector são:

1. Estude e implemente a classe Exemplo1 apresentada abaixo:


Métodos e Procedimentos. Prof. Jesus José de Oliveira Neto

UNIVERSIDADE FEDERAL DE MATO GROSSO DO SUL SISTEMAS DE INFORMAÇÃO - CÂMPUS DE COXIM FUNDAMENTOS EM ORIENTAÇÃO A OBJETOS

LEIC-T LERC MEIC-T 2011/2012 1º Semestre Programação com Objetos 2012/01/07 11h00m 3/10

Programação por Objectos. Java

Exceções AULA 13. Ricardo Massa F. Lima Sérgio C. B. Soares

Paradigmas da Programação PPROG. Tipos Enumerados. Nelson Freire (ISEP DEI-PPROG 2013/14) 1/20

Introdução à orientação a objetos. João Tito Almeida Vianna 18/05/2013

Nome do Aluno: Matrícula: Turma: Data: 08/04/2013

Programação Orientada a Objectos - P. Prata, P. Fazendeiro

A B Classe Genérica D A C. Classe Especializada. Classe Especializada. Características Herdadas

Encapsulamento e Métodos (Construtores e Estáticos) João Paulo Q. dos Santos

Transcrição:

Problema Padrão para atribuir responsabilidades: Baixo Acoplamento Como minimizar dependências e maximizar o reuso? O acoplamento é uma medida de quão fortemente uma classe está conectada, possui conhecimento ou depende de outra classe Com fraco acoplamento, uma classe não é dependente de muitas outras classes Com uma classe possuindo forte acoplamento, temos os seguintes problemas: Mudanças em uma classe relacionada força mudanças locais à classe A classe é mais difícil de entender isoladamente A classe é mais difícil de ser reusada, já que depende da presença de outras classes Solução Atribuir responsabilidades de forma a minimizar o acoplamento Exemplo Considere o seguinte diagrama parcial de classes no estudo de caso Suponha que temos que criar um Pagamento e associá-lo a uma Venda Que classe deveria ter essa responsabilidade? Alternativa 1: No mundo real, um TPDV "registra" um pagamento e o padrão Creator sugere que TPDV poderia criar Pagamento Página 1 de 8

TPDV deve então passar o pagamento para a Venda Veja o resultado abaixo Alternativa 2: Criar o Pagamento com Venda e associá-lo à Venda Veja o resultado abaixo Supondo que a Venda deva ter conhecimento do pagamento (depois da criação) de qualquer jeito, a alternativa 2 tem menos acoplamento (TPDV não está acoplado a Pagamento) Dois padrões (Creator e Low Coupling) sugeriram diferentes soluções Minimizar acoplamento ganha Discussão Minimizar acoplamento é um dos princípios de ouro do projeto OO Acoplamento se manifesta de várias formas: X tem um atributo que referencia uma instância de Y X tem um método que referencia uma instância de Y Pode ser parâmetro, variável local, objeto retornado pelo método X é uma subclasse direta ou indireta de Y X implementa a interface Y Página 2 de 8

A herança é um tipo de acoplamento particularmente forte Uma seção futura aprofunda o assunto Não se deve minimizar acoplamento criando alguns poucos objetos monstruosos (God classes) Exemplo: todo o comportamento numa classe e outras classes usadas como depósitos passivos de informação Tipos de acoplamentos (do menos ruim até o pior) Acoplamento de dados Acoplamento de controle Acoplamento de dados globais Acoplamento de dados internos Acoplamento de dados Situações Saída de um objeto é entrada de outro Uso de parâmetros para passar itens entre métodos Ocorrência comum: Objeto a passa objeto x para objeto b Objeto x e b estão acoplados Uma mudança na interface de x pode implicar em mudanças a b Exemplo: class Servidor { public void mensagem(meutipo x) { // código aqui x.façaalgo(object dados); // dados e x estão acoplados // (se interface de dados muda // mais código Exemplo pior: Objeto a passa objeto x para objeto b x é um objeto composto ou agregado (contém Página 3 de 8

outro(s) objeto(s)) Objeto b deve extrair objeto y de dentro de x Há acoplamento entre b, x, representação interna de x, y Exemplo: ordenação de registros de alunos por matrícula class Aluno { String nome; long matrícula; public String getnome() { return nome; public long getmatrícula() { return matrícula; // etc. ListaOrdenada listadealunos = new ListaOrdenada(); listadealunos.add(new Aluno(...)); //etc. Agora, vamos ver os problemas: class ListaOrdenada { Object[] elementosordenados = new Object[tamanhoAdequado]; public void add(aluno x) { // há código não mostrado aqui long matrícula1 = x.getmatrícula(); long matrícula2 = elementosordenados[k].getmatrícula(); if(matrícula1 < matrícula2) { // faça algo else { // faça outra coisa O problema da solução anterior é que há forte acoplamento ListaOrdenada sabe muita coisa de Aluno O fato de que a comparação de alunos é feito com a matrícula O fato de que a matrícula é obtida com getmatrícula() Página 4 de 8

O fato de que matrículas são long (representação de dados) Como comparar matrículas (com <) O que ocorre se mudarmos qualquer uma dessas coisas? Solução 2: mande uma mensagem para o próprio objeto se comparar com outro class ListaOrdenada { Object[] elementosordenados = new Object[tamanhoAdequado]; public void add(aluno x) { // código não mostrado if(x.compareto(elementosordenados[k]) < 0) { // faça algo else { // faça outra coisa Reduzimos o acoplamento escondendo informação atrás de um método Problema: ListaOrdenada só funciona com Aluno Solução 3: use interfaces para desacoplar mais ainda interface Comparable { public int compareto(object outro); class Aluno implements Comparable { public int compareto(object outro) { // compare registro de aluno com outro // retorna valor < 0, 0, ou > 0 dependendo da comparação class ListaOrdenada { Object[] elementosordenados = new Object[tamanhoAdequado]; public void add(comparable x) { // código não mostrado if(x.compareto(elementosordenados[k]) < 0) { // faça algo else { Página 5 de 8

// faça outra coisa Em C++, teria outras soluções possíveis Apontador de função Apontador de função com tipos genéricos (templates) Acoplamento de controle Passar flags de controle entre objetos de forma que um objeto controle as etapas de processamento de outro objeto Ocorrência comum: Objeto a manda uma mensagem para objeto b b usa um parâmetro da mensagem para decidir o que fazer class Lampada { public final static ON = 0; public void setlampada(int valor) { if(valor == ON) { // liga lampada else if(valor == 1) { // desliga lampada else if(valor == 2) { // pisca Lampada lampapa = new Lampada(); lampada.setlampada(lampada.on); lampada.setlampada(2); Solução: decompor a operação em múltiplas operações primitivas class Lampada { public void on() { // liga lampada public void off() { // desliga lampada public void pisca() { // pisca Página 6 de 8

Lampada lampada = new Lampada(); lampada.on(); lampada.pisca(); Ocorrência comum: Objeto a manda mensagem para objeto b b retorna informação de controle para a Exemplo: retorno de código de erro class Teste { public int printfile(file aimprimir) { if(aimprimir está corrompido ) { return CORRUPTFLAG; // etc. etc. Teste umteste = new Teste(); int resultado = umtese.printfile(miniteste); if(resultado == CORRUPTFLAG) { // oh! oh! else if(resultado == -243) { // etc. etc. Solução: use exceções class Teste { public int printfile(file aimprimir) throws PrintExeceptio if(aimprimir está corrompido ) { throw new PrintExeception(); // etc. etc. try { Teste umteste = new Teste(); umteste.printfile(miniteste); catch(printexception printerror) { // mail para a turma: não tem miniteste amanhã! Página 7 de 8

Acoplamento de dados globais Dois ou mais objetos compartilham estruturas de dados globais É um acoplamento muito ruim pois está escondido Uma chamada de método pode mudar um valor global e o código não deixa isso aparente Um tipo de acoplamento muito ruim Acoplamento de dados internos Um objeto altera os dados locais de um outro objeto Ocorrência comum: Friends em C++ Dados públicos, package visibility ou mesmo protected em java Use com cuidado! Consequências Uma classe fracamente acoplada não é afetada (ou pouco afetada) por mudanças em outras classes Simples de entender isoladamente Reuso mais fácil Exercício para casa Discuta os problemas de acoplamento (ou sua ausência) neste exemplo programa Página 8 de 8