Projeto Orientado a Objetos Conjunto de atividades que têm como objetivo a criação de um modelo orientado a objetos de um sistema de software de acordo com os requisitos especificados Estratégia geral Projetistas pensam em termos de: Coisas ou objetos ( substantivos ), e depois operações ou funções ( verbos ) 2012 2
Paradigma de Orientação a Objetos (OO) decomposição orientada a objetos modularização objetos classes encapsulamento de dados e procedimentos 1960 1965 1970 1975 1980 1985 1990 1995 2000 2005 CLOS Simula 67 Smalltalk Eiffel C++ Java 3
Orientação a Objetos Modelo de Objetos Arcabouço conceitual objetos, classes herança, agregação troca de mensagens polimorfismo... Princípios [Booch] Abstração Encapsulamento Hierarquia Modularidade OCP, ISP,... Requisitos básicos [Cardelli & Wegner] objetos são abstrações de dados objetos possuem uma classe associada classes podem herdar propriedades de superclasses 2012 4
Modelo de Objetos Objetos são abstrações de entidades do mundo real ou do sistema Objetos encapsulam informação sobre seu estado e representação A funcionalidade do sistema é expressa em termos dos serviços de objetos Objetos se comunicam através de mensagens Objetos podem ser distribuídos e podem executar sequencialmente ou em paralelo 2012 5
Classes de objetos Classes são templates para criação de objetos. Objetos são criados de acordo com a definição da classe Classes podem herdar atributos e serviços de outras classes 2012 6
Herança Employee Classes podem herdar atributos e serviços de outras classes Ma nager budgetscontrolled dateappointed Programmer project proglanguage Project Manager projects Dept. Ma nager dept Strategic Manager responsibilities 2012 7
Generalização e herança Classes podem ser organizadas em hierarquia(s) uma classe (superclasse) é uma generalização de uma ou mais classes (subclasses) Uma subclasse pode herdar atributos e operações de superclasse(s) e pode: Adicionar novos atributos e operações Refinar operações herdadas Redefinir operações herdadas 2012 8
Herança e Projeto OO Há visões diferentes se a herança é fundamental ao projeto OO Visão 1. Identificar a hierarquia de herança é parte fundamental do OOD. A herança é um conceito útil para implementação que permite reutilizar definições de atributos e operações Visão 2. A herança introduz complexidade, o que não é desejável, especialmente em sistemas críticos. Identificar uma hierarquia de herança durante o projeto impõe restrições desnecessárias à implementação 2012 9
Associações Objetos e classes participam em relações com outros objetos e classes Associações são gerais, mas indicam que um atributo de um objeto é um objeto associado ou que um método depende de um objeto associado Employee is-member-of Department is-managed-by manages Manager 2012 10
Comunicação entre objetos Conceitualmente, objetos trocam mensagens para se comunicar v = circularbuffer.get () ; thermostat.settemp (20) ; 2012 11
Interação entre Objetos Objetos interagem e se comunicam através do envio de mensagens o1: C1 o3:c3 o4: C4 state o1 state o3 state o4 ops1() ops3 () ops4 () o2: C3 o6: C1 o5:c5 state o2 state o6 state o5 ops3 () ops1 () ops5 () 2012 12
Polimorfismo Mecanismo de uma LOO que permite algoritmos de alto nível sejam usados repetidas vezes com abstrações de nível mais baixo LOO: linguagens orientadas a objetos consequência natural da relação de herança. 2012 13
Orientação a Objetos Benefícios Expressividade + Legibilidade + Suporte à evolução + Potencial de reutilização + 2012 14
Herança versus Composição Técnicas de reuso e evolução Herança (entre classes) white-box reuse Composição (de objetos) black-box reuse 2012 15
Diagramas de Colaboração/Comunicação Diagrama de Classes de Projeto (DCP)
Projeto da Camada de Domínio Diagramas de Colaboração (Comunicação na UML 2) permitem realizar a modelagem dinâmica do sistema, ou seja, como os objetos que fazem parte da arquitetura trocam mensagens para realizar suas responsabilidades.
Em relação ao Modelo Conceitual, o DCP apresenta: Adição dos métodos Adição da direção das associações Possível detalhamento dos atributos e associações Possível alteração na estrutura das classes e associações Possível criação de atributos privados ou protegidos
Classe VideoLocadora fitas : Conjunto; clientecorrente : Cliente; Pseudocódigo concentrador Método emprestafita(fcodigo: String) fita : Fita; emprestimocorrente : Emprestimo; item : ItemDeEmprestimo; fita := fitas.get(fcodigo); emprestimocorrente := clientecorrente.getemprestimocorrente(); item := ItemDeEmprestimo.new(); item.associafita(fita); emprestimocorrente.associaitem(item); Fim Método; Fim Classe.
Diagrama de Colaboração
Código com Responsabilidades Distribuídas Classe VideoLocadora fitas : Conjunto ; clientecorrente : Cliente; Metodo emprestafita(fcodigo : String); fita : Fita; fita := fitas.get(fcodigo); clientecorrente.empresta(fita) Fim Metodo; Fim Classe. Classe Emprestimo itens : Conjunto; Metodo adiciona(fita : Fita); item : ItemDeEmprestimo; item := ItemDeEmprestimo.new(); self.associaitem(item); item.associafita(fita); Fim Metodo; Fim Classe. Classe Cliente emprestimocorrente : Emprestimo; Metodo empresta(fita : Fita); emprestimocorrente.adiciona(fita); Fim Metodo; Fim Classe.
Visibilidade Por associação. Quando as classes de dois objetos estão associadas no DCP Por parâmetro. Quando um objeto recebe outro como parâmetro em um método Localmente declarada. Quando um objeto recebe outro como retorno de um método Global. Quando um objeto é declarado globalmente
Visibilidade por Associação (para 1)
Visibilidade por Associação (para muitos)
Visibilidade por Parâmetro
Visibilidade Localmente Declarada
Visibilidade por Associação (qualificada sem qualificador)
Visibilidade por Associação (qualificada com qualificador)
Visibilidade por Associação (0..1)
Estabelecida por Pré-Condição de Contrato existe um Pagamento associado à Venda
Visibilidade de Classes de Associação
Do ponto de vista da classe de associação:
Com visibilidade para uma instância associada
Influência das Pré-Condições de Contrato nos Diagramas Garantia de Parâmetros (associação não qualificada)
Influência das Pré-Condições de Contrato nos Diagramas Garantia de Parâmetros (associação qualificada)
Realização das Pós-Condições dos Contratos nos Diagramas Mensagens básicas. São aquelas que efetivamente realizam aquilo que a pós-condição requer Mensagens delegadas. Passam adiante a responsabilidade de realizar uma operação básica quando o objeto que detém o controle da execução não possui visibilidade direta para o objeto que deve executar a operação
Mensagens Básicas Criação de instância Destruição de instância Criação de associação Destruição de associação Consulta de associação Alteração de valor de atributo Consulta de valor de atributo
Criação de Instância
Cria e imediatamente associa
Destruição de Instância
Criação de Associação Método implementado na origem da associação
Criação de Associação Associação bidirecional
Destruição de Associação Implementação na origem
Modificação de Valor de Atributo
Delegação Faculta o acoplamento fraco
Estilo de projeto sem delegação
Estilo de projeto com delegação
Pós-condição condicionada
Contribuições dos Diagramas de Colaboração ao DCP Métodos delegados. Sempre que um objeto receber uma mensagem delegada, a classe correspondente ao objeto deve registrar a implementação deste método Sentido das associações. O sentido das associações no DCP corresponderá ao sentido do envio das mensagens sobre as ligações de visibilidade baseadas em associações
Design Patterns Básicos Especialista Criador Acoplamento Fraco Coesão Alta
Especialista Quem implementa a consulta valortotaldavenda?
Pseudocódigo que não atende ao padrão Especialista Classe Supermercado clientecorrente : Cliente; consulta valortotaldavendacorrente(); venda : Venda; item : ItemDeVenda; total : Moeda = 0,00; venda := clientecorrente.getvendacorrente(); repita para cada item em venda.getitensdevenda(): total := total + (item.getquantidade() * item.getproduto().getpreco()); fim repita retorna total fim consulta Fim Classe.
Pseudocódigo que atende ao padrão especialista Classe Supermercado clientecorrente : Cliente; consulta valortotaldavendacorrente(); retorna clientecorrente.getvalortotaldavendacorrente(); fim consulta Fim Classe. Classe Cliente vendacorrente : Venda; consulta getvalortotaldavendacorrente(); retorna vendacorrente.getvalortotal(); fim consulta Fim Classe Classe Venda itens : Conjunto de ItemDeVenda; total : Moeda = 0,00; consulta getvalortotal() repita para cada item em itens: total := total + item.getsubtotal(); fim repita retorna total; fim consulta Fim Classe Classe ItemDeVenda produto : Produto; consulta getsubtotal() retorna getquantidade() * produto.getpreco(); fim consulta Fim Classe
Criador quem deve criar uma instância? Em primeiro lugar, verifique se o objeto é parte de uma agregação ou composição. Se for, o criador será o objeto agregador Caso contrário, verifique se alguma classe tem associação de 1 para * ou de 1 para 0..1 para a classe do objeto a ser criado. Se existir uma classe nessa situação e ela estiver em algum caminho possível na direção do controlador, então ela poderá ser a criadora Se houver empate, decida pela classe que parecer mais fortemente associada à classe a ser criada. Esse critério é subjetivo, mas é exatamente onde entra o julgamento o projetista sobre qual a opção mais adequada para fazer um caminho de delegação até a operação básica de criação de um objeto
Quem cria quem?
Acoplamento fraco Evite a criação de novos acoplamentos
Acoplamento definido pelo modelo conceitual e mantido pelo pseudocódigo que atende ao padrão especialista (anterior) Supermercado Cliente Produto Venda ItemDeVenda
Acoplamento definido pelo pseudocódigo que não atende ao padrão especialista (anterior) Supermercado Cliente Produto Venda ItemDeVenda
Coesão alta Verifique se o valor de algum atributo determina a possibilidade de outro atributo ser nulo ou não Verifique se existem subgrupos de atributos que estejam fortemente correlacionados Verifique se existem grupos de atributos que repetirão sempre os mesmos valores quando ocorrerem em diferentes instâncias
Exemplo de classe com baixa coesão
Solução com alta coesão