• Nenhum resultado encontrado

aula04 mapeamentoProjetoCodigo PadroesGRASP 2012.2

N/A
N/A
Protected

Academic year: 2021

Share "aula04 mapeamentoProjetoCodigo PadroesGRASP 2012.2"

Copied!
49
0
0

Texto

(1)

Mapeamento do Projeto para o

Código-Fonte

e Padrões para Atribuição de

Responsabilidades (GRASP)

(2)

MAPEAMENTO DO PROJETO PARA

O CÓDIGO-FONTE

(3)

Relação com outros artefatos

• O código-fonte é o principal artefato da fase de implementação

• A partir do diagrama de classes de projeto (DCP), chega-se à implementação em código-fonte

• O código-fonte pode ser testado através de testes de unidade e testes de integração

(4)

Criando classes, atributos e métodos a

partir do DCP

• Pode ser feito sistematicamente, até mesmo automaticamente

(5)
(6)

Realização de uma associação

unidirecional, um-para-um

Account

Advertiser 1 1

public class Advertiser { private Account account; public Advertiser() {

account = new Account(); }

public Account getAccount() { return account;

} }

(7)

Associação bidirecional um-para-um

public class Advertiser {

/* O atributo account é

* inicializado no construtor * e nunca é modificado. */

private Account account; public Advertiser() {

account = new Account(this); }

public Account getAccount() {

Account

Advertiser 1 1

public class Account {

/* O atributo owner é

* inicializado durante o * o construtor e nunca * é modificado. */

private Advertiser owner;

public Account(owner:Advertiser)

{

this.owner = owner;

}

(8)

Associação unidirecional um-para-muitos

public class Advertiser { private Set accounts; public Advertiser() {

accounts = new HashSet(); }

public void addAccount(Account a) { accounts.add(a);

}

public void removeAccount(Account a) {

accounts.remove(a); }

}

public class Account { }

(9)

Associação bidirecional um-para-muitos

public class Advertiser { private Set accounts; public Advertiser() {

accounts = new HashSet(); }

public void addAccount(Account a) {

accounts.add(a); a.setOwner(this); }

public void removeAccount(Account a)

{

accounts.remove(a); a.setOwner(null);

public class Account {

private Advertiser owner;

public void setOwner(Advertiser

newOwner) {

if (owner != newOwner) {

Advertiser old = owner; owner = newOwner; if (newOwner != null) newOwner.addAccount(this); if (oldOwner != null) old.removeAccount(this); } } Advertiser 1 * Account

(10)

Associação unidirecional muitos-para-muitos

public class Tournament { private List players; public Tournament() {

players = new ArrayList(); }

public void addPlayer(Player p) { if (!players.contains(p)) { players.add(p); } } }

public class Player { }

(11)

Associação bidirecional muitos-para-muitos

public class Tournament { private List players; public Tournament() {

players = new ArrayList(); }

public void addPlayer(Player p) {

if (!players.contains(p)) { players.add(p);

p.addTournament(this); }

public class Player {

private List tournaments; public Player() {

tournaments = new ArrayList(); } public void addTournament(Tournament t) { if (!tournaments.contains(t)) { tournaments.add(t); t.addPlayer(this); } Tournament * * Player

(12)

- Parta da menos conectada para a mais conectada

- Implemente e teste cada classe antes de passar adiante

SalesLineItem quantity : Integer getSubtotal() ProductCatalog ... getProductDesc(...) ProductDescription description : Text price : Money itemID : ItemID ... Store address : Address name : Text addSale(...) Payment amount : Money 1..* 1..* Register ... endSale() enterItem(...) makeNewSale() makePayment(...) Sale isComplete : Boolean time : DateTime becomeComplete() makeLineItem(...) makePayment(...) getTotal() ... 1 1 1 1 1 1 * 1 2 3 4 5 6 7

(13)

PADRÕES PARA ATRIBUIÇÃO DE

RESPONSABILIDADES (GRASP)

(14)

O que são padrões (patterns)?

• Princípios e soluções codificadas em um formato estruturado descrevendo um problema e uma solução

• Um par nomeado problema/solução que pode ser aplicado em novos contextos

• É o conselho de projetistas experientes para ajudar novos projetistas em dadas situações

(15)

A ideia por trás de padrões de design é simples:

Escreva e catalogue interações comuns entre objetos que programadores acharam

frequentemente úteis.

Resultado:

Facilitar o reuso de código orientado a objetos entre projetos e entre

(16)

Características de um bom padrão

• Resolve um problema • É um conceito provado • A solução não é óbvia

• Descreve um relacionamento

• O padrão tem um componente humano significativo

(17)

Tipos de padrões

Padrões arquiteturais

Expressa uma organização ou esquema estrutural fundamental para sistemas de software.

Padrões de projeto (Design Patterns)

Proveem um esquema para refinar os subsistemas ou componentes de um sistema de software, ou as

relações entre eles.

Expressões idiomáticas (Idioms)

Uma expressão idiomática descreve como

implementar aspectos específicos de componentes ou das relações entre eles usando as características de

(18)

Descrevendo padrões

Nome: O padrão deve ter um nome significativo. Problema: Uma descrição do problema.

Contexto: Explica a aplicabilidade do padrão.

Forças: Uma descrição das forças relevantes e restrições e como

elas interagem/conflitam entre si.

Solução: Relações estáticas e regras dinâmicas descrevendo

como implementar o resultado desejado.

Consequências: Implicações (boas e ruins) do uso da solução. Exemplos: Uma ou mais amostras de aplicações do padrão.

(19)

Padrões GRASP

Qual a classe, no caso geral, que é responsável por... • Atribuir uma responsabilidade a uma classe?

• Evitar ou minimizar dependências adicionais?

• Maximizar a coesão e minimizar o acoplamento? • Aumentar o reuso e diminuir a manutenção?

• Maximizar a compreensão? • ... etc.

(20)

Padrões GRASP

General Responsibility Assignment Software Patterns

• Expert • Creator • Low Coupling • High Cohesion • Controller • Polymorphism • Pure Fabrication • Indirection • Law of Demeter

(21)

Expert

Problema:

Qual o princípio mais básico pelo qual as responsabilidades são atribuídas no design orientado a objetos?

Solução:

Atribua uma responsabilidade à classe que tem a informação necessária para cumprir esta responsabilidade.

(22)

Expert : Exemplo

Quem é responsável por conhecer o total geral de uma venda em uma típica aplicação de ponto de vendas?

Sale date time Sales LineItem quantity Product Specification description price UPC Described-by * Contain s 1.. *

(23)

Expert : Exemplo

• A classe necessita de todas as instâncias de SalesLineItem e seus subtotais. Somente Sale conhece isto. Assim, Sale é o expert na informação.

• Portanto: Sale date time total() :Sale t := total() New method

(24)

Expert : Exemplo

• Mas subtotais são necessários para cada linha de item (multiplicar quantidade por preço).

• Pelo Expert, SalesLineItem é o especialista, pois conhece quantidade e tem associação com ProductSpecification, que conhece o preço.

Sale date time total() :Sale t := total() sli:SalesLineItem SalesLineItem quantity subtotal() 2: st := subtotal() :Product Specification 2.1: p := price() Product Specification description price UPC SalesLineItem :SalesLineItem 1*: [for each] sli := next()

(25)

Expert : Exemplo

Assim, atribua responsabilidades a três classes:

Classe Responsabilidade

Sale Conhece o total da venda

SalesLineItem Conhece o subtotal da linha de item de venda

(26)

Expert

• Mantém encapsulamento da informação • Promove baixo acoplamento

• Promove classes altamente coesivas • Pode fazer uma classe tornar-se

(27)

Creator

Problema:

A quem atribuir a responsabilidade por criar uma nova instância de uma classe?

Solução:

Determinar que classe deveria criar instâncias da outra classe baseado no relacionamento entre potenciais classes criadoras e a classe a ser instanciada.

(28)

Creator

Quem tem a responsabilidade de criar um objeto?

Por creator, atribua à classe B a responsabilidade de criar uma instância da classe A se:

B agrega objetos A B contém objetos A

B registra instâncias de objetos A B usa de perto objetos A

B tem os dados de inicialização para criar objetos A Quando houver opções de escolha, prefira:

(29)

Creator : Exemplo

Quem é responsável por criar objetos SalesLineItem?

Procure por uma classe que agregue ou contenha objetos SalesLineItem.

Sale date time Sales LineItem Product Specification Described-* Contain s 1.. *

(30)

Creator : Exemplo

O padrão Creator sugere Sale.

Sale date time makeLineItem() total() :Sale makeLineItem(quantity) :SalesLineItem

(31)

Creator

• Promove baixo acoplamento tornando

instâncias de uma classe em responsáveis por criar objetos que elas precisam referenciar

• Criando elas próprias os objetos, elas evitam ficar dependentes de outra classe que crie o objeto para elas

(32)

Low Coupling

Problema:

Como dar suporte à baixa dependência entre classes e ao aumento do reuso?

Solução:

Atribua responsabilidades de modo que o acoplamento permaneça baixo.

(33)

Sobre acoplamento em linguagens OO

Em linguagens orientadas a objetos, formas comuns de acoplamento entre TipoX e TipoY incluem:

• TipoX tem uma atributo (variável de instância) que se refere a uma instância TipoY, ou ao próprio TipoY.

• TipoX tem um método que referencia uma instância do TipoY, ou o próprio TipoY, de algum modo. Estes métodos

tipicamente incluem um parâmetro ou variável local do TipoY, ou o objeto do TipoY retornado de uma mensagem.

• TipoX é uma subclasse direta ou indireta de TipoY.

(34)

Low coupling

• Classes ficam mais fáceis de se manter • Mais fáceis de se reusar

(35)

Low Coupling

Como podemos tornar classes independentes de outras classes?

Quem tem a responsabilidade de criar um Payment?

(36)

Low Coupling

Duas possibilidades: :POST p : Payment :Sale makePayment() 1: create() 2: addPayment(p) 1. POST

2. Sale :POST :Sale

:Payment makePayment() 1: makePayment()

1.1. create()

Low coupling sugere Sale porque Sale tem de ser acoplada a Payment de qualquer jeito (Sale conhece o seu total).

(37)

High Cohesion

Problema:

Como manter a complexidade gerenciável?

Solução:

Atribua responsabilidades de modo que a coesão permaneça alta.

(38)

Sobre coesão em linguagens OO:

• Coesão Muito Baixa: Uma classe é a única

responsável por muitas coisas em muitas áreas funcionais diferentes

• Coesão Baixa: Uma classe é a única responsável por uma tarefa complexa em uma área funcional.

• Coesão Alta: Uma classe tem responsabilidades

moderadas em uma área funcional e colabora com outras classes para realizar tarefas.

(39)

High cohesion

• As classes ficam mais fáceis de se manter • Mais fáceis de se compreender

• Frequentemente dá suporte a baixo acoplamento

• Dá suporte ao reuso por causa da

(40)

High Cohesion

Quem tem a responsabilidade de criar um Payment?

1.Post

:POST p : Payment

:Sale

makePayment() 1: create()

2: addPayment(p)

Parece OK se makePayment for considerado

isoladamente, mas, adicionando mais operações de sistema, POST teria mais e mais responsabilidades e ficaria menos coesivo.

(41)

High Cohesion

Dar a responsabilidade a Sale dá suporte a maior coesão em POST, assim como baixo acoplamento.

:POST :Sale

:Payment

makePayment() 1: makePayment()

(42)

Controller

Problema:

A quem atribuir responsabilidade para tratar um evento de sistema?

Solução:

Se um programa recebe eventos de fontes externas além de sua interface gráfica,

adicione uma classe de eventos para desacoplar a(s) fonte(s) de eventos dos objetos que de fato tratam os eventos.

(43)

Escolhas de controladores

O padrão Controller dá orientação para escolhas geralmente aceitáveis.

Atribua a responsabilidade para tratar uma mensagem de evento de sistema para uma classe representando uma das seguintes escolhas:

1. O negócio ou a organização geral (um controlador de fachada); 2. O “sistema” geral (um controlador de fachada);

3. Uma coisa animada no domínio que realizaria o trabalho (um controlador de papel);

(44)

Benefícios:

• Aumento no potencial de reuso. Usar um objeto controlador mantém fontes de eventos externos e tratadores de eventos internos independentes de seus tipos e comportamento.

• Permite refletir sobre os estados de um caso de uso e assegurar que as operações do sistema ocorrem na sequência determinada.

• Permite refletir sobre o estado atual de uma atividade e as operações dentro do caso de uso.

(45)

Controller : Exemplo

Eventos de sistema no caso de uso Comprar Itens entrarItem()

terminarVenda() fazerPagamento()

(46)

Controller : Exemplo

Por controller, nós temos quatro escolhas

O sistema geral Post

O negócio geral Store

Alguém no mundo real que

é ativo na tarefa Cashier

Um tratador artificial de todos os eventos

de sistema de um caso de uso BuyItemsHandler

:POST enterItem(upc, quantity) :Store enterItem(upc, quantity) :Cashier enterItem(upc, quantity) :BuyItemsHandler enterItem(upc, quantity)

A escolha de qual utilizar será influenciada por outros fatores tais como coesão e acoplamento

(47)

Bom design: camada de apresentação desacoplada do domínio do problema

Object Store

Enter Item End Sale UPC Make Payment Total Quantity Tendered Balance Cashier :POSTCommand presses button onEnterItem() 1: enterItem(upc, qty) Presentation Layer (Command Object)

system event message

(48)

Mau design: camada de apresentação acoplada ao domínio do problema

Object Store

Enter Item End Sale UPC Make Payment Total Quantity Tendered Balance Cashier :POSTCommand presses button onEnterItem() :Sale 1: makeLineItem(upc, qty) Presentation Layer (Command object) Domain Layer

It is undesirable for a presentation layer objects such as a Java applet to get involved in deciding how to handle domain processes.

Business logic is embedded in the presentation layer, which is not useful.

POSTApplet should not send this message.

(49)

Controller

• Usar um objeto controlador mantém fontes de eventos externos e tratadores de eventos

internos independentes de seus tipos e comportamento

• Os objetos controladores podem se tornar

altamente acoplados e sem coesão com mais responsabilidades

Referências

Documentos relacionados

Em outras palavras, a necessidade de contextualizar os conteúdos matemáticos tem se apresentado na Educação Matemática com o valor de máximas quase inquestionáveis, as quais

A adaptação com a sociedade paulistana foi um processo que costumou levar pouco tempo segundo os entrevistados, tanto que foi observada a intenção de seguir mantendo

Como apresentado, o primeiro protótipo da or- quídea como flor cibernética converteu os sinais vitais da flor para a impressora 3D, que imprimiu em tempo real formas dinâmicas

Medicamentos que você não deve tomar durante o tratamento com Nizoral ® comprimidos: - certos medicamentos para alergia: terfenadina, astemizol e mizolastina;.. -

Seria possível, em tese, que o Brasil tivesse a pretensão de submeter à sua jurisdição quaisquer demandas que fossem propostas perante seus juízes. Todavia, dificilmente muitas de

Para contrapor as duas perspectivas, será proposta uma análise entre a teoria proposta por Ducrot, estudioso que concentra seu trabalho no nível linguístico, pois defende

Parte significativa do aporte, cerca de U$ 70 milhões, será direcionada para a construção de uma ponte entre Foz do Iguaçu (PR) e Presidente Franco, no Paraguai.. A empresa

Corte entendeu que seria necessário aplicar um critério econômico para tanto, isto é, que haveria de se identificar um ―fluxo e refluxo através das