Diagramas de Colaboração e Padrões GRASP

Documentos relacionados
Aula 7 Visibilidade entre objetos e Diagramas de Classes

DIAGRAMA DE CLASSES DE PROJETO

GRASP: PADRÕES PARA ATRIBUIÇÃO DE RESPONSABILIDADES. SSC 124 Análise e Projeto Orientado a Objeto Profa. Dra. Elisa Yumi Nakagawa

Diagrama de Classes Aula 11 (parte 1)

Aula 6 Notação Básica dos Diagramas de Comunicação

Modelagem de Software

Análise do Sistema Casos de Uso

Diagramas de Classes. SSC-526 Análise e Projeto Orientados a Objeto Profa. Dra. Elisa Yumi Nakagawa 2º semestre de 2013

DIAGRAMA DE COMUNICAÇÃO

Notação Básica dos Diagramas de Comunicação

Diagrama de Comunicação. SSC 526 Análise e Projeto Orientado a Objeto Profa. Dra. Elisa Yumi Nakagawa

Aula 5 Diagramas de Seqüência do Sistema e Contratos de Operações

Diagramas de Sequência do Sistema e Contratos de Operações. SSC-121 Engenharia de Software I Profa. Dra. Elisa Yumi Nakagawa 2º semestre de 2012

Do Projeto à Codificação. SSC-526 Análise e Projeto Orientados a Objeto Profa. Dra. Elisa Yumi Nakagawa 2º semestre de 2013

Modelo Conceitual. Prof. Seiji Isotani Slides baseados no material da Profa Dra Rosana T. V. Braga

Projeto da Camada de Domínio. Diagramas de Colaboração/Comunicação Diagrama de Classes de Projeto (DCP)

Projeto Orientado a Objetos

Padrões de Projeto de Software

Notação Básica dos Diagramas de Comunicação

Projeto Orientado a Objetos

Engenharia de Software II

INF1013 MODELAGEM DE SOFTWARE

DIAGRAMA DE COMUNICAÇÃO. SSC 124 Análise e Projeto Orientado a Objeto Profa. Dra. Elisa Yumi Nakagawa

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

Introdução a Padrões, GRASP. Nazareno Andrade (baseado no material de Hyggo Almeida e Jacques Sauvé)

Frameworks O Problema da Persistência

Framework Hibernate/JPA

Padrões GRASP. Leonardo Gresta Paulino Murta

ANÁLISE E PROJETO ORIENTADO A OBJETO (Parte 3)

Padrões de Projeto. Conteúdo. Objetivos

PROJETO DE ARQUITETURA

Análise e Projeto de Software Parte II. Marcos Dósea

Análise e Projeto Orientados a Objetos: Visibilidade Diagrama de Classe de Projeto

Padrões de Projeto de Software

Análise e Projeto Orientados por Objetos

Conteúdo. 1. Introdução. 2. Levantamento de Requisitos. 3. Análise Orientada a Objetos. 4. Projeto Orientado a Objetos 5. UML. 6.

Projeto de software Estrutura do software e arquitetura SWEBOK

Modulo II Padrões GRASP

Roni Fabio Banaszewski UTFPR Universidade Tecnológica Federal do Paraná

Modelagem Orientada a Objeto

UNIVERSIDADE ESTADUAL PAULISTA INSTITUTO DE BIOCIÊNCIAS, LETRAS E CIÊNCIAS EXATAS DEPARTAMENTO DE CIÊNCIAS DE COMPUTAÇÃO E ESTATÍSTICA

Padrões para atribuir responsabilidades: Expert

PCS3413 Engenharia de Software e Banco de Dados

Introdução à Análise e Projeto de Sistemas

CONCEITOS BÁSICOS E MODELO DE PROJETO

Fase de Concepção (Início, Planejamento)

Fase de Concepção. Levantamento e Organização de Requisitos

15/04/2013. Pensar Orientado a Objetos. Projeto Orientado a Objetos. Características de Objetos. Classe de Objetos. Comunicação entre Objetos

Visões Arquiteturais. Visões Arquiteturais

PROJETO DE ARQUITETURA (PARTE 2)

Requisitos de sistemas

Introdução Diagrama de Classes Diagrama de Seqüência Diagrama de Atividades. Diagramas UML. Classe, Seqüência e Atividades. Marcio E. F.

UML. Modelando um sistema

UNIVERSIDADE FEDERAL DE SANTA MARIA CENTRO DE TECNOLOGIA AULA 15 PROFª BRUNO CALEGARO

15/04/2013. Outro Diagrama de Classes. Primeiro Diagrama de Classes. Diagrama de Classes. Atributos. Eduardo Figueiredo

O Processo Unificado: Workflow de Análise. Graduação em Informática Profa. Dra. Itana Maria de Souza Gimenes 2009

Arquitetura de Software: Introdução. Prof. Fellipe Aleixo

Estudo de Caso TPV Projetando uma solução com objetos e Padrões GRASP

3 Arquitetura para a Coordenação e a Composição de Artefatos de Software

SEMINÁRIOS INTEGRADOS EM ADS PROGRAMAÇÃO ESTRUTURADA E ORIENTADA A OBJETOS

ARCHITECTURAL DESIGN. Ian Sommerville, 8º edição Capítulo 11 Aula de Luiz Eduardo Guarino de Vasconcelos

Modelagem de Casos de Uso (Parte 1)

Metodologias de Desenvolvimento (I)

Interface vs. Implementação Herança vs. Composição

Análise e projeto de sistemas

Contratos O diagrama de sequência não menciona a funcionalidade das operações. Isto é, o comportamento do sistema Contrato é um documento que

DCC004 - Algoritmos e Estruturas de Dados II

Estudo de Caso TPV: do Projeto para a Codificação

Análise Orientada a Objetos

Padrões de projeto 1

Orientação a Objetos e Java

Engenharia de Software. Projeto de Arquitetura

Levantamento de classes (Análise de casos de uso)

Tópicos da Aula. Diretrizes Gerais. Trabalho Prático (TP) Pontuação do TP. Tema do Trabalho. Projeto de Software Diagrama de Classes

Os princípios do desenho orientado a objetos

Campus Capivari Análise e Desenvolvimento de Sistemas (ADS) Prof. André Luís Belini /

PROJETO ARQUITETURAL PARTE II: PADRÕES DE PROJETO. Projeto de Programas PPR0001

Modelagem Orientada a Objetos

Estilos Arquiteturais

DIAGRAMAS DE CLASSE UML

Notas de Aula 03: Introdução a Orientação a Objetos e a UML

2

Diagramas de Sequência do Sistema. SSC 124: Análise e Projeto Orientados a Objetos Profa. Dra. Elisa Yumi Nakagawa

Lista de Exercícios AV1

Soluções reutilizáveis para situações ou problemas encontrados comumente em desenvolvimento de software orientado a objetos.

Análise de Sistemas. Aula 5

Mas o que é mesmo Padrão de Projeto?

Alguns Exercícios Resolvidos

Introdução a UML (Unified Modeling Language)

Análise e Projeto de Software

Engenharia de Software

Arquitetura de software

Engenharia de Software

UNIVERSIDADE FEDERAL DO PARANÁ - UFPR Bacharelado em Ciência da Computação

Diagramas de Sequência e Contrato das Operações

Engenharia de Domínio e Desenvolvimento Baseado em Componentes. Processo DBC-Arch-DE Apoio do Ambiente Odyssey no Processo Considerações Finais

Programação Orientada a Objetos

Transcrição:

UNIVERSIDADE ESTADUAL PAULISTA INSTITUTO DE BIOCIÊNCIAS, LETRAS E CIÊNCIAS EXATAS DEPARTAMENTO DE CIÊNCIAS DE COMPUTAÇÃO E ESTATÍSTICA Projeto e Desenvolvimento de Sistemas de Informação Diagramas de Colaboração e Padrões GRASP

O que vimos até agora Diagramas de Caso de Uso Casos de uso resumido e completo Modelo Conceitual Diagramas de Sequência do Sistema Contratos de Operações Notação dos Diagramas de Comunicação

Atendente nome 1..1 0..n registra 1..1 Leitor nome tipo : char ^ faz 0..n 0..n faz 1..1 0..n Reserva período situacao : char 0..1 Empréstimo/Devolução data do empréstimo situação : Char 0..1 corresponde a corresponde a 0..1 1..1 possui Bibliotecaria nome refere-se a > 1..1 Objetivo ao final da fase de projeto registra 1..1 0..n 1..1 Livro titulo : String[30] autor : String[30] ano : int ISBN : string[20] editora : int tipo : char possui 0..n CopiaDoLivro nro sequencial situacao : char liberadoparaemprestimo : char 1..n 0..1 LinhaDoEmpréstimo data_prevista_dev olução data_entrega_real 1..1 0..n < refere-se a

nome tipo Leitor calculardatadevolucao( ) 1 0..* faz Emprestimo data_do_emprestimo situacao : char adicionarcopia( ) devolvercopia( ) Mais a especificação das interfaces (métodos) LinhaDoEmprestimo data_prevista_devolução data_entrega_real possui 1..* refere-se a 1 CopiaDoLivro nro_sequencial situacao : char liberadoparaemprestimo : char codcopia( ) atualizardatadev( ) 0..* 1 mudarsituacao( ) codcopia( ) sinalizardevolucao( )

Como projetar as responsabilidades de cada objeto Sabemos que os objetos precisam se comunicar para completar as operações. Os Diagramas de comunicação mostram escolhas de atribuições de responsabilidades a objetos. Mas quem é o melhor candidato para realizar cada uma das operações ou métodos do sistema?

Como projetar as responsabilidades de cada objeto Responsabilidade: Um contrato ou obrigação de um tipo ou uma classe(booch e Rumbaugh) Responsabilidades estão relacionadas às obrigações de um objeto em termos de seu comportamento. Dois tipos de responsabilidades básicas: Fazer Fazer algo (criar um objeto, executar uma operação,...) Iniciar ações em outros objetos(delegação). Controlar e coordenar atividades em outros objetos. Conhecer Conhecer dados privados encapsulados. Conhecer objetos relacionados. Conhecer dados/atributos que podem ser derivados ou calculados.

Responsabilidades e Diagramas de Interação Diagramas de interação mostram escolhas de atribuição de responsabilidade a objetos. Exemplo: atribuir aos objetos do tipo Venda a responsabilidade de imprimirem a si próprios. imprimir() :Venda Responsabilidade de imprimir a si própria

Exemplo: Motivação para aplicação de Padrões Diagrama de Comunicação para a operação EmprestarFita(fcodigo) Implementação inchada ou concentradora X Implementação leve, distribuída

Sistema Videolocadora Cod Cópia fita Emprestar :Atendente Camada de Interface açãoexecutada(eventodaação) :CWindow emprestarfita(fcodigo) Camada do Domínio :????

Videolocadora Modelo Conceitual Sistema Videolocadora possui possui

Comunicação entre os objetos 2: emprestimocorrente := getemprestimocorrente emprestarfita(fcodigo)----> :Videolocadora clientecorrente: Cliente 3: criar() 1: fita:=get(fcodigo) 5: associaritem(item) 4: associarfita(fita) fitas: Fita emprestimocorrente: Emprestimo item: ItemDeEmprestimo Qual é o problema desta solução?

Pseudo-código Concentrador VideoLocadora Classe VideoLocadora fitas: Conjunto; clientecorrente: Cliente Método emprestarfita(fcodigo: String) fita:fita; emprestimocorrente: Emprestimo; item: ItemDeEmprestimo; fita := fitas.get(fcodigo); emprestimocorrente := clientecorrente.getemprestimocorrente(); item := itemdeemprestimo.new(); Item.associarFita(fita); EmprestimoCorrente.associarItem(item); Fim Método; FIM Classe;

Comunicação entre objetos (concentrador) 2: emprestimocorrente := getemprestimocorrente emprestarfita(fcodigo)----> :Videolocadora clientecorrente: Cliente 3: criar() 1: fita:=get(fcodigo) 5: associaritem(item) 4: associarfita(fita) fitas: Fita item: ItemDeEmprestimo emprestimocorrente: Emprestimo

Diagrama de Comunicação não Concentrador emprestarfita(fcodigo)----> :Videolocadora 5: associaritem() 1: fita:=get(fcodigo) emprestimocorrente: Emprestimo 2: emprestar(fita) 4: criar() fitas: Fita 3: adicionar(fita) 6: associarfita(fita) clientecorrente: Cliente item: ItemDeEmprestimo

Código com Responsabilidade Classe VideoLocadora fitas: Conjunto; clientecorrente: Cliente; Distribuída Classe Emprestimo Itens:Conjunto; Metodo emprestarfita(fcodigo:string) fita:fita; fita:=fitas.get(tcodigo); clientecorrente.empresta(fita) Fim Metodo; Fim Classe; Classe Cliente emprestimocorrente: Empretimo; Metodo adicionar(fita:fita); item: ItemDeEmprestimo; item := ItemDeEmprestimo.new(); self.associaitem(item); item.associafita(fita); Fim Metodo; Fim Classe; Método emprestar(fita:fita); emprestimocorrente.adiciona(fita); Fim Método; Fim Classe;

Discussão Qual dos códigos é mais fácil de entender e manter? Em qual dos códigos as responsabilidades das classes parecem mais intuitivas? Para desenvolver um bom projeto, precisamos de princípios para nos guiar na atribuição de responsabilidades -> padrões de projeto OO.

Responsabilidade Responsabilidade não é a mesma coisa que um método. Métodos são implementados para satisfazer as responsabilidades Responsabilidades são implementadas usando métodos que agem sozinhos ou colaboram com outros métodos e objetos. Padrões de projeto são princípios para guiar a atribuição de responsabilidades aos objetos.

Padrões Desenvolvedores experientes em OO criaram um repertório de princípios gerais e boas soluções para guiar a construção de software. Essas soluções foram descritas em um formato padronizado (nome, problema, solução) e podem ser usadas em outros contextos(outros projetos). Surgiram com base no trabalho do arquiteto Christopher Alexander, 1977. (Padrões Arquitetônicos). Ganharam impulso após a publicação do livro sobre Padrões de Projeto (Design Patterns Gamma e outros GoF- 1994)

Padrões Padrões usualmente não contem novas idéias Organizam conhecimentos e princípios existentes, testados e consagrados. Padrão é uma descrição nomeada de um problema e uma solução, que pode ser aplicado em novos contextos. Nomear padrões melhora a comunicação (criase um vocabulário, ou idioma)

Padrões GRASP GRASP = General Responsability Assignment Software Patterns. Descrevem princípios fundamentais de atribuição de responsabilidades a objetos. A compreensão dos padrões de projeto durante a criação de diagramas de comunicação é importante, pois: São princípios de bons projetos Orientado a Objetos. Levam a projetos OO de qualidade.

Padrões GRASP Alguns padrões GRASP principais: Especialista (Expert) Criador (Creator) Coesão alta (High Cohesion) Acoplamento fraco (Low Coupling) Controlador (Controller) Esses padrões abordam questões básicas comuns e tópicos fundamentais de desenvolvimento.

O padrão Especialista (Expert) Problema: qual é o princípio mais básico para atribuir responsabilidades em projeto orientado a objetos? Solução: Atribuir responsabilidade ao especialista da informação a classe que tem a informação necessária para satisfazer a responsabilidade.

Exemplo No sistema biblioteca, quem seria o responsável por calcular a data de devolução de um livro?

Modelo Conceitual Biblioteca Atendente nome 1 0..n registra 1 Leitor nome tipo : char ^ faz 0..n 0..n faz 1 0..n Reserva período situacao : char 0..1 Empréstimo/Devolução data do empréstimo situação : Char 0..1 corresponde a corresponde a 0..1 1 possui Bibliotecaria nome refere-se a > 1 registra 1 0..n 1 Livro titulo : String[30] autor : String[30] ano : int ISBN : string[20] editora : int tipo : char possui 1..n 0..1 LinhaDoEmpréstimo data_prevista_devolução data_entrega_real 0..n < refere-se a 0..n CopiaDoLivro nro sequencial situacao : char liberadoparaemprestimo : char 1

Especialista A data de devolução ficará armazenada no atributo data_prevista_devolução do objeto LinhaDoEmprestimo Mas quem possui conhecimento necessário para calculá-la?

Modelo Conceitual Biblioteca Atendente nome 1 0..n registra 1 Leitor nome tipo : char ^ faz 0..n 0..n faz 1 0..n Reserva período situacao : char 0..1 Empréstimo/Devolução data do empréstimo situação : Char 0..1 corresponde a corresponde a 0..1 1 possui Bibliotecaria nome refere-se a > 1 registra 1 0..n 1 Livro titulo : String[30] autor : String[30] ano : int ISBN : string[20] editora : int tipo : char possui 1..n 0..1 LinhaDoEmpréstimo data_prevista_devolução data_entrega_real 0..n < refere-se a 0..n CopiaDoLivro nro sequencial situacao : char liberadoparaemprestimo : char 1

Especialista Pelo padrão especialista, Leitor deve receber essa atribuição, pois conhece o tipo de Leitor (por exemplo, aluno de graduação, aluno de pós-graduação, professor, etc), que é utilizado para calcular a data em que o livro deve ser devolvido.

Especialista adicionarcopia(copialivro)---> : Emprestimo 1: d:=calculardatadevolução() 2: criar(d, copialivro) :Leitor Uso do padrão Especialista linh: LinhaDoEmprestimo

Especialista: alternativa mais detalhada adicionarcopia(copialivro) 4: associarlinha(linh) adicionarcopia(copialivro)---> : Emprestimo copialivro: CopiaDoLivro 2: criar(d) 1: d:=calculardatadevolução() :Leitor 3: associarcopia(copialivro) Uso do padrão Especialista linh: LinhaDoEmprestimo

Especialista Onde procurar pela classe especialista? Começar pelas classes já estabelecidas durante o projeto. Se não encontrar, utilizar o Modelo Conceitual. Lembrar que existem especialistas parciais que colaboram numa tarefa Informação espalhada -> comunicação via mensagens Existe uma analogia no mundo real.

Especialista Discussão É o padrão mais utilizado Tem uma analogia no mundo real Coad: Fazê-lo eu mesmo Lembrar que existem especialistas parciais Benefícios: Mantém encapsulamento -> favorece o acoplamento fraco. O Comportamento fica distribuído entre as classes que tem a informação necessária (classes leves ) -> favorece alta coesão. Favorece o reuso. Contra-indicações contra indicado quando aumenta acoplamento e reduz coesão Ex: quem é responsável por salvar um Empréstimo no banco de dados?

Padrão Criador (Creator) Problema: Quem deveria ser responsável pela criação de uma nova instância de alguma classe? Solução: atribua à classe B a responsabilidade de criar uma nova instância da classe A se uma das seguintes condições for verdadeira: B agrega objetos de A B contém objetos de A B registra instâncias de objetos de A B usa objetos de A B tem os valores iniciais que serão passados para objetos de A, quando de sua criação

Criador No sistema da Biblioteca, quem é responsável pela criação de uma linhadoemprestimo adicionarcopia(copialivro)---> : Emprestimo 1: d:=calculardatadevolução() 2: criar(d, copialivro) :Leitor Uso do padrão Criador: Emprestimo contém várias linhas de emprestimo linh: LinhaDoEmprestimo Empréstimo/Devolução data do empréstimo situação : Char CriarLinhaEmprest()

Discussão Criador O padrão guia a atribuição de responsabilidades relacionadas com a criação de objetos. Escolha adequada favorece acoplamento fraco Objetos agregados, contêineres e registradores são bons candidatos à responsabilidade de criar outros objetos Algumas vezes o candidato a criador é o objeto que conhece os dados iniciais do objeto a ser criado.

Acoplamento Acoplamento: dependência entre elementos (classes, subsistemas,...). Normalmente resultante de colaboração para atender a uma responsabilidade. O acoplamento mede o quanto um objeto está conectado a, tem conhecimento de ou depende de outros objetos Acoplamento fraco (ou baixo) um objeto não depende de muitos outros. Acoplamento forte (ou alto) um objeto depende de muitos outros.

Acoplamento Problemas do acoplamento alto: Mudanças em classes interdependentes forçam mudanças locais. Dificulta a compreensão do objetivo de cada classe. Dificulta a reutilização. Acoplamento fraco é o desejável

Padrão Acoplamento Fraco Problema: como apoiar a baixa dependência entre classes e aumentar a reutilização? Solução: Atribuir responsabilidade de Solução: Atribuir responsabilidade de maneira que o acoplamento permaneça baixo.

Padrão Acoplamento Fraco Exemplo: No sistema de biblioteca, suponha que queremos realizar a devolução da cópia do livro. Qual classe deve ser responsável por essa tarefa? Alternativas: A classe Leitor A classe Livro A classe Empréstimo

Modelo Conceitual Biblioteca Atendente nome 1 0..n registra 1 Leitor nome tipo : char ^ faz 0..n 0..n faz 1 0..n Reserva período situacao : char 0..1 Empréstimo/Devolução data do empréstimo situação : Char 0..1 corresponde a corresponde a 0..1 1 possui Bibliotecaria nome refere-se a > 1 registra 1 0..n 1 Livro titulo : String[30] autor : String[30] ano : int ISBN : string[20] editora : int tipo : char possui 1..n 0..1 LinhaDoEmpréstimo data_prevista_devolução data_entrega_real 0..n < refere-se a 0..n CopiaDoLivro nro sequencial situacao : char liberadoparaemprestimo : char 1

Projeto 1: responsabilidade atribuída ao Leitor cop:=busca(codcopia) devolver(datadehoje) Leitor conhece copias do livro? devolvecopia(codcopia)--> leit: Leitor 4: atualizarsituacao('devolvida') 2: devolver(datadehoje) cop: CopiaDoLivro 1: cop:=busca(codcopia) 3: atualizardatadev(datadehoje) copias: CopiaDoLivro Copia conhece linha do empréstimo? linh: LinhaDoEmprestimo

Projeto 2: responsabilidade atribuída ao Livro devolvecopia(codcopia)--> liv: Livro 2: devolver(datadehoje) 3: atualizarsituacao('devolvida') 1: cop:=busca(codcopia) cop: CopiaDoLivro copias: CopiaDoLivro 4: atualizardatadev(datadehoje) linh: LinhaDoEmprestimo Eficiente? Cópia conhece a linha de empréstimo?

Projeto 3: responsabilidade atribuída ao Empréstimo 1: *[enquanto encontrou=false] linh:==proximo() devolvercopia(codcopia)---> : Emprestimo :LinhaDoEmprestimo 2: * [enquanto encontrou = false] cc:=obtercodigocopia() 4: [encontrou] atualizadatadev(datadehoje) 6: mudarsituacao('devolvida') 3: cc :=CodigoCopia() linh: LinhaDoEmprestimo cop: CopiaDeLivro 5: sinalizadevolucao() encontrou := false enquanto encontrou == false linh := proxima linha do emprestimo cc:=linh.obtercódigocópia() encontrou:=(cc==codcopia) fim-enquanto se encontrou linh.atualizadatadevolucao(datadehoje) fim-se

Qual projeto é melhor? Qual dos projetos anteriores favorece o acoplamento fraco? Projeto 1 e 2 acoplamento aumenta (entre cópia do livro e linha do empréstimo, entre leitor e cópia do livro) Projeto 3 não aumenta acoplamento PREFERÍVEL

Formas de Acoplamentos Um objeto tem um atributo que referencia um objeto de outra classe. Um objeto tem um método que referencia um objeto de outra classe. Parâmetro, variável local ou retorno Um objeto invoca os serviços de um objeto de outra classe. Uma classe é subclasse de outra, direta ou indiretamente.

Discussão: Acoplamento Fraco Acoplamento fraco -> classes mais independentes. Reduz impacto de mudanças. Favorece reuso de classes. Considerado em conjunto com outros padrões Extremo de acoplamento fraco não é desejável Fere princípios da tecnologia de objetos comunicação por mensagens Projeto pobre: objetos inchados e complexos, responsáveis por muito trabalho -> baixa coesão

Acoplamento Fraco Discussão: Dica: concentre-se em reduzir o acoplamento em pontos de evolução ou de alta instabilidade do sistema. Benefícios: Classes são pouco afetadas por mudanças em outras partes. Classes são simples de entender isoladamente. Conveniente para reutilização.

Coesão Mede o quanto as responsabilidade de um elemento (classe, objeto, subsistema,...) são fortemente focalizadas e relacionadas. (coesão funcional) Objeto com Coesão Alta -> objetos cujas responsabilidades são altamente relacionadas e que não executa um volume muito grande de trabalho. Objeto com Coesão Baixa -> objeto que faz muitas coisas não relacionadas ou executa muitas tarefas. Difícil de compreender, reutilizar e manter. constantemente afetado por mudanças.

Coesão Alta Problema: Como manter a complexidade sob controle? Solução: Atribuir responsabilidade de tal forma que a coesão permaneça alta.

Coesão Alta Exemplo 1: ( o mesmo para o acoplamento fraco): No sistema de biblioteca, suponha que queremos realizar a devolução da cópia do livro. Qual classe deve ser responsável por essa tarefa? Leitor Livro Empréstimo

Projeto 1: responsabilidade atribuída ao Leitor cop:=busca(codcopia) devolver(datadehoje) O Leitor fica parcialmente encarregado da devolução da cópia do livro. Neste exemplo, isso seria aceitável, mas o que aconteceria se houvesse 50 mensagens de outro tipo recebidas por Leitor? devolvecopia(codcopia)--> leit: Leitor 4: atualizarsituacao('devolvida') 2: devolver(datadehoje) cop: CopiaDoLivro 1: cop:=busca(codcopia) 3: atualizardatadev(datadehoje) copias: CopiaDoLivro linh: LinhaDoEmprestimo

Projeto 2: responsabilidade atribuída ao Livro devolvecopia(codcopia)--> liv: Livro 2: devolver(datadehoje) 3: atualizarsituacao('devolvida') 1: cop:=busca(codcopia) cop: CopiaDoLivro copias: CopiaDoLivro 4: atualizardatadev(datadehoje) linh: LinhaDoEmprestimo cop:=busca(codcopia) devolver(datadehoje) Parece uma solução melhor. Mas se houver inúmeras operações a serem feitas com o livro, ocorre o mesmo problema de Leitor.

Projeto 3: responsabilidade atribuída ao Empréstimo 1: *[enquanto encontrou=false] linh:==proximo() devolvercopia(codcopia)---> : Emprestimo :LinhaDoEmprestimo 2: cc:=codigocopia() 4: [encontrou] atualizadatadev(datadehoje) 6: mudarsituacao('devolvida') 3: cc := codigocopia() linh: LinhaDoEmprestimo cop: CopiaDeLivro encontrou := false enquanto encontrou == false linh := proxima linha do emprestimo cc:= linh.obter o código da cópia() encontrou:=(cc==codcopia) fim-enquanto se encontrou linh.atualizadatadev(datadehoje) fim-se 5: sinalizadevolucao() Esta é a melhor solução. O objeto empréstimo representa eventos bem definidos no sistema de biblioteca (empréstimo e devolução), por isso é mais intuitivo que ele assuma esta responsabilidade.

Coesão Alta Discussão: Coesão alta, assim como Acoplamento Fraco, são princípios que devem ser considerados para a avaliação de projetos de objetos Má coesão traz acoplamento e vice-versa Má coesão traz acoplamento e vice-versa Regra prática: classe com coesão alta tem um número relativamente pequeno de métodos, com funcionalidades relacionadas, e não executa muito trabalho. Analogia com mundo real Pessoas que assume muitas responsabilidades não associadas podem tornar-se (e normalmente tornam-se) ineficientes.

Coesão Alta Benefícios: Mais clareza e facilidade de compreensão do projeto. Simplificação de manutenção e de acréscimo de funcionalidade/melhorias. Favorecimento do acoplamento fraco. Aumento no potencial de reutilização Classe altamente coesa pode ser usada para uma finalidade bastante específica.

Será que a solução dada para o evento de devolução da cópia é ideal? Ainda temos um problema: quando ocorre o evento de devolução da cópia, o objeto empréstimo ao qual a cópia emprestada se refere ainda não é conhecido. Portanto, é preciso eleger alguma classe, que conheça os empréstimos, para receber a mensagem devolvercopia. Essa classe terá que identificar o objeto empréstimo cujo código de cópia seja igual ao parâmetro fornecido.

A pergunta anterior não está respondida nos slides a seguir. Voltaremos a ela no fim deste assunto.

Controlador É um objeto de interface (entre sistema e mundo externo) responsável por tratar um evento externo (evento de sistema). Define (implementa) o método para a operação de sistema. Operações de sistema associadas aos eventos de sistema: Sistema iniciardevo(idlei) devolver(codcop) FinalizarDevol() Sistema entraritem() terminarvenda() efetuarpagamento()

Padrão Controlador Problema: Quem deve ser responsável por tratar um evento do sistema (gerado por um ator externo)? Solução: A responsabilidade de receber ou tratar as mensagens de eventos do sistema (operações) pode ser atribuída uma classe que: Representa o sistema todo, representa o negócio ou organização, um dispositivo ou um subsistema (chamado de controlador fachada) Representa algo no mundo real que é ativo (chamado de controlador do papel) Representa um tratador artificial de todos os eventos de sistema de um caso de uso (Controlador do caso de uso) TratadorDe<NomeDoCasoDeUso> ControladorDe<NomeDoCasoDeUso>

Padrão Controlador Exemplo: Quem vai tratar os eventos do sistema de biblioteca? :Atendente Sistema 1: iniciarempréstimo(id_leitor) 2: nome e situação do leitor 3: emprestarlivro(id_livro) 4: datadedevolução * mais livros a emprestar 5: encerrarempréstimo()

Cod Cópia Livro Emprestar :Atendente Camada de Interface açãoexecutada(eventodaação) :CWindow emprestarlivro(codcopia) Camada do Domínio Objeto de Interface :????

Exemplo1: Opções de Controlador todo o sistema (controlador fachada): Biblioteca um tratador artificial do caso de uso: ControladorDeEmprestarLivro iniciaremprestimo( ) :Biblioteca iniciaremprestimo( ) :ControladorDe EmprestarLivro emprestarlivro( ) :Biblioteca emprestarlivro( ) :ControladorDe EmprestarLivro encerraremprestimo() :Biblioteca encerraremprestimo() :ControladorDe EmprestarLivro 61

Discussão : Controladores Fachada Um controlador fachada deve ser um objeto (do domínio) que seja o ponto principal para as chamadas provenientes da interface com o usuário ou de outros sistemas pode ser uma abstração de uma entidade física ex: TerminalDeAtendimento pode ser um conceito que represente o sistema ex: Biblioteca São adequados quando não há uma quantidade muito grande de eventos de sistema Ou quando não é possível redirecionar mensagens do sistema para controladores alternativos (ex: outros subsistemas )

Discussão : Controladores de Caso de Uso Deve existir um controlador diferente para cada caso de uso Por exemplo, o ControladorDeEmprestarLivro será responsável pelas operações iniciarempréstimo, emprestarlivro e encerrarempréstimo Não é um objeto do domínio, e sim uma construção artificial para dar suporte ao sistema. Ex: ControladorDeEmprestarLivro, ControladorDeDevolverLivro Pode ser uma alternativa se a escolha de controladores fachada deixar a classe controladora com alto acoplamento e/ou baixa coesão (controlador inchado por excesso de responsabilidades) É uma boa alternativa quando existem muitos eventos envolvendo diferentes processos.

Controladores inchados Classe controladora mal projetada - inchada coesão baixa falta de foco e tratamento de muitas responsabilidades Sinais de inchaço: uma única classe controladora tratando todos os eventos, que são muitos. Comum com controladores fachada o próprio controlador executa as tarefas necessárias para atender o evento, sem delegar para outras classes (coesão alta, não especialista) controlador tem muitos atributos e mantém informação significativa sobre o domínio, ou duplica informações existentes em outros lugares

Possíveis soluções para controladores inchados Acrescentar mais controladores. Projetar o controlador de forma que ele possa delegar o atendimento da responsabilidade de cada operação de sistema a outros objetos. Cuidado: Controladores de papéis podem conduzir a maus projetos(armadilha de projetar objetos semelhantes a pessoas para fazer todo o trabalho é preciso delegar)

Corolário do Padrão Controlador Objetos de interfaces HM ( como objetos janela ) e da camada de apresentação não devem ter a responsabilidade de tratar eventos do sistema (arquitetura em camadas)

Benefícios do Padrão Controlador e seu corolário Benefícios: aumento das possibilidades de reutilização de classes e do uso de interfaces plugáveis. conhecimento do estado do caso de uso controlador pode armazenar estado do caso de uso, garantindo a seqüência correta de execução de operações

Cod Cópia Livro Devolver :Atendente Camada de Interface :CWindow açãoexecutada(eventodaação) devolver Copia? devolvercopia(codcopia) Camada do Domínio???? devolvercopia(codcopia) :Emprestimo

Voltando ao problema do slide 57... Qual era o problema: devolvercópia x Empréstimo Qual é a solução? Classe Fachada ou Controladora

Cod Cópia Livro Devolver :Atendente Camada de Interface :CWindow açãoexecutada(eventodaação) devolver Copia? devolvercopia(codcopia) Camada do Domínio :Biblioteca devolvercopia(codcopia) :Emprestimo

Próximo assunto Refinar Plano Sincronizar artefatos Analisar Projetar Construir Testar Padrões GRASP Estudo de Caso TPV : Projetar uma solução com objetos e Padrões GRASP