Padores_projeto_GRASP.pdf

download Padores_projeto_GRASP.pdf

of 43

Transcript of Padores_projeto_GRASP.pdf

  • Padres GRASP

    Padres bsicos Information Expert Creator High Cohesion Low Coupling ControllerPadres avanados Polymorphism Pure Fabrication Indirection Protected Variations

    Padres GRASP refletem prticas mais pontuais da aplicao de tcnicas OO

    Padres GoF exploram solues mais especficas

    Padres GRASP ocorrem na implementao de vrios padres GoF

    179

  • Expert (especialista de informao)

    Problema Precisa-se de um princpio geral para atribuir

    responsabilidades a objetos Durante o design, quando so definidas interaes entre

    objetos, fazemos escolhas sobre a atribuio de responsabilidades a classes

    Soluo Atribuir uma responsabilidade ao especialista de informao:

    classe que possui a informao necessria para cumpri-la Comece a atribuio de responsabilidades ao declarar

    claramente a responsabilidade

    180

  • Expert No sistema abaixo, uma classe precisa saber o total

    geral de uma venda (Sale). Que classe deve ser a responsvel?

    Sale possui informaes sobreSalesLineItems (knowing)

    Fonte: [4] 181

  • Expert (2)

    A nova responsabilidade conduzida por uma operao no driagrama de interao

    Um novo mtodo criado

    Fonte: [4] 182

  • Expert(3)

    Mas como a classe Sale vai calcular o valor total? Somando os subtotais. Mas quem faz isto?

    A responsabilidade para cada subtotal atribuda ao objeto SalesLineItem (item de linha do pedido)

    183

  • Expert (4)

    O subtotal depende do preo. O objeto ProductSpecification o especialista que conhece o preo, portanto a responsabilidade dele.

    184

  • Creator

    Problema: Que classe deve ser responsvel pela criao de uma nova instncia de uma classe?

    Soluo: Atribua a B a responsabilidade de criar A se: B agrega A objetos B contm A objetos B guarda instncias de A objetos B faz uso de A objetos B possui dados para inicializao que ser passado

    para A quando ele for criado.

    185

  • Creator

    Que classe deve ser responsvel por criar uma instncia do objeto SalesLineItem abaixo?

    Sale agrega muitosSalesLineItems

    186

  • Creator

    A nova responsabilidade conduzida por uma operao em um diagrama de interaes Um novo mtodo criado na classe de design para expressar

    isto.

    187

    Este mtodo precisa ser definido em Sale

    Fonte: [4]

  • High Cohesion

    Problema Como manter a complexidade sob controle? Classes que fazem muitas tarefas no relacionadas

    so mais difceis de entender, de manter e de reusar, alm de serem mais vulnerveis mudana.

    Soluo Atribuir uma responsabilidade para que a coeso se

    mantenha alta.

    Voc sabe o que coeso?

    188

  • Coeso

    Coeso [Funcional] Uma medida de quo relacionadas ou focadas

    esto as responsabilidades de um elemento.

    Exemplo Uma classe Co coesa se tem operaes

    relacionadas ao Co (morder, correr, comer, latir) e apenas ao Co (no ter por exemplo, validar, imprimirCao, listarCaes)

    Alta coeso promove design modular

    189

  • High Cohesion

    Que classe responsvel por criar um pagamento (Payment) e associ-lo a uma venda (Sale)?

    Register assumiu responsabilidade por uma coisa que parte de Sale (fazer um pagamento no responsabilidade de registrar)

    190

  • High Cohesion

    Nesta soluo, Register delega a responsabilidade a Sale, diminuindo aumentando a coeso de Register A criao do processo de pagamento agora

    responsabilidade da venda e no do registro. Faz mais sentido pois o pagamento parte de Sale.

    191

  • Low Coupling (baixo acoplamento)

    Problema Como suportar baixa dependncia, baixo impacto devido a

    mudanas e reuso constante?

    Soluo Atribuir uma responsabilidade para que o acoplamento

    mantenha-se fraco.

    Acoplamento uma medida de quanto um elemento est conectado a, ou

    depende de outros elementos Uma classe com acoplamento forte depende de muitas

    outras classes: tais classes podem ser indesejveis O acoplamento est associado coeso: maior coeso,

    menor acoplamento e vice-versa.

    192

  • Low Coupling

    Como devemos atribuir uma responsabilidade para criar Payment e associ-lo com Sale?

    Payment

    Register

    Sale

    193

  • Low Coupling

    Qual das opes abaixo suporta o menor acoplamento?

    Opo 1

    Opo 2

    194

  • Controller

    Problema Quem deve ser o responsvel por lidar com um evento de

    uma interface de entrada?

    Soluo Atribuir responsabilidades para receber ou lidar com um

    evento do sistema para uma classe que representa todo o sistema (controlador de fachada front controller), um subsistema e um cenrio de caso de uso (controlador de caso de uso ou de sesso).

    Este padro semelhante (ou equivalente) a um padro GoF. Qual?

    195

  • Controller

    Um sistema contendo operaes de sistemaassociados com eventos do sistema.

    196

  • Controller: problema

    197

  • Controller: soluo

    A primeira soluo representa o sistema inteiroA segunda soluo representa o destinatrio ou

    handler de todos os eventos de um caso de uso

    198

    O diagrama acima no mostra o Controller, mas a transparncia da comunicao (chamada do cliente, objeto que recebe a mensagem)

  • Outros padres

    Padres GRASP avanados Domine primeiro os cinco bsicos antes de explorar

    estes quatro: Polymorphism Indirection Pure Fabrication Protected Variations

    Outros padres Dependency Injection (aplicao de Indirection) Aspectos

    199

  • GRASP: Polymorphism

    Problema: Como lidar com alternativas baseadas no tipo? Como criar

    componentes de software plugveis? Deseja-se evitar variao condicional (if-then-else): pouco

    extensvel. Deseja-se substituir um componente por outro sem afetar o

    cliente.

    Soluo No use lgica condicional para realizar alternativas

    diferentes baseadas em tipo. Atribua responsabilidades ao comportamento usando operaes polimrficas

    Refatore!

    200

  • GRASP: Pure Fabrication

    Problema Que objeto deve ter a responsabilidade, quando voc no

    quer violar High Cohesion e Low Coupling, mas as solues oferecidas por Expert no so adequadas?

    Atribuir responsabilidades apenas para classes do domnio conceitual pode levar a situaes de maior acoplamento e menos coeso.

    Soluo Atribuir um conjunto altamente coesivo de responsabilidades

    a uma classe artificial que no representa um conceito do domnio do problema.

    201

  • GRASP: Protected Variations

    Problema Como projetar objetos, subsistema e sistemas para que as

    variaes ou instabilidades nesses elementos no tenha um impacto indesejvel nos outros elementos?

    Soluo Identificar pontos de variao ou instabilidade potenciais. Atribuir responsabilidades para criar uma interface estvel

    em volta desses pontos. Encapsulamento, interfaces, polimorfismo, indireo e

    padres; mquinas virtuais e brokers so motivados por este princpio

    Evite enviar mensagens a objetos muito distantes.

    202

  • GRASP: Indirection

    Problema Onde atribuir uma responsabilidade para evitar

    acoplamento direto entre duas ou mais coisas? Como desacoplar objetos para que seja possvel suportar baixo acoplamento e manter elevado o potencial de reuso?

    Soluo Atribua a responsabilidade a um objeto intermedirio para

    mediar as mensagens entre outros componentes ou servios para que no sejam diretamente acoplados.

    O objeto intermedirio cria uma camada de indireo entre os dois componentes que no mais dependem um do outro: agora ambos dependem da indireo.

    Veja uma aplicao em: Dependency Injection

    203

  • Injeo de dependncias(inverso de controle)

    Um dos benefcios de usar interfaces Em vez de

    Use

    A B

    AintefaceInterB B

    A depende de BA precisa achar ou criar B

    class A {InterB b;A(InterB b) {

    this.b = b;}

    }A depende de uma interface IBB depende de uma interface IBA recebe implementao de B quando criado

    class A {B b = new B();

    }

    204

  • Injeo de dependncias (2)

    Se A depende de InterB, fica fcil testar ou medir A usando uma implementao/simulao de B para testes

    Interfaces devem ser pequenas Um objeto pode implementar vrias interfaces Facilita evoluo (interfaces grandes publicam um contrato grande que no

    pode ser revogado)

    Planeje interfaces em todos os objetos Principalmente objetos que oferecem servios, singletons, etc.

    AintefaceInterB SimulatedBATest

    AintefaceInterBATest

    205

  • Dependency Injection

    Problema Controle convencional: o prprio objeto cria ou

    localiza suas dependncias: acoplamento!

    CertificacaoProgramadorJava

    ProgramadorJavanome: Stringcertificacao:CertificacaoProgramadorJavainscrever(): Certificado

    CertificacaoArquitetoJ2EE

    newCertificacaoProgramadorJava()

    JNDIlookup(certificacaoSCEA)

    206

  • Exemplo: controle convencional

    Linha 9: dependncia fortemente acoplada Difcil de testar objeto sem testar dependncia

    1:package faculdade;2:3:public class ProgramadorJava {4: private String nome;5: private CertificacaoProgramadorJava certificacao;6:7: public ProgramadorJava(String nome) {8: this.nome = nome;9: certificacao = new CertificacaoProgramadorJava();10: }11:12: public Certificado inscrever() throws NaoAprovadoException {13: return certificacao.iniciarTeste();14: }15:}

    207

  • A dependncia

    1:package faculdade;2:3:public class CertificacaoProgramadorJava {4: public CertificacaoProgramadorJava() {}5: public Certificado iniciarTeste()

    throws NaoAprovadoException {6: Certificado certificado = null;7: // Realizar questoes8:9: return certificado;

    10: }11:}

    208

  • Diminuindo o acoplamento

    Melhor forma de eliminar acoplamento usar interfaces Implementao dependente da interface Cliente depende da interface, e no mais da implementao

    3:public interface Certificacao {4: public Object iniciarTeste() throws CertificacaoException;5:}

    3:public class CertificacaoProgramadorJava implements Certificacao {4: public CertificacaoProgramadorJava() {}5: public Object iniciarTeste() throws NaoAprovadoException {6: Certificado certificado = new Certificado();7: // Realizar questoes8: certificado.setNota(90);9:10: return certificado;11: }12:}

    209

  • Soluo

    Em vez do programador buscar ou criar sua prpria certificao, ela atribuda a ele Para isto, deve haver mtodo para criar a associao

    CertificacaoProgramadorJava

    ProgramadorJavanome: Stringcertificacao:CertificacaoProgramadorJavainscrever(): CertificadosetCertificacao(Certificacao);

    programador.setCertificacao(this)

    programador.setCertificacao(certJ2EE)

    CertificacaoArquitetoJ2EE

    Certificacao

    210

  • Inverso de controle

    public interface Programador {public Object inscrever() throws NaoAprovadoException;

    }

    211

    3:public class ProgramadorJava implements Programador {4: private String nome;5: private CertificacaoProgramadorJava certificacao;6:7: public ProgramadorJava(String nome) {8: this.nome = nome;9: }10:11: public Object inscrever() throws NaoAprovadoException {12: return certificacao.iniciarTeste();13: }14:15: public void setCertificacao(Certificacao certificacao) {16: this.certificacao = certificacao;17: }18:}

  • Aspectos: Separao de interesses

    A separao de interesses objetivo essencial do processo de decomposio da soluo de um problema

    Decomposio deve continuar at que cada unidade da soluo possa ser compreendida e construda

    Cada unidade deve lidar com apenas um interesse

    Separao de interesses eficiente promove cdigo de melhor qualidade

    Maior modularidade Facilita atribuio de responsabilidades entre mdulos Promove o reuso Facilita a evoluo do software Viabiliza anlise do problema dentro de domnios especficos

    212

  • Tipos de interesse

    Usando uma linguagem orientada a objetos, pode-se representar de forma eficiente e modular as classes e procedimentos

    Outros interesses so implementados como partes de classes e partes ou composio de procedimentos

    213

    Figuramover()desenhar()

    Tringulomover()desenhar()

    Crculomover()desenhar()

    Retngulomover()desenhar()

    validarCoords()// cdigo p/ moverlogarAcao()

    // cdigo p/ desenharlogarAcao()

    mover()

    desenhar()

    Aspectos genricosPoderiam ser usados em

    outras aplicaes

    Caractersticas mover() e desenhar() poderiam serreutilizadas em outros

    objetos

  • Problema: scattering e tangling

    214

    public class VeiculoAereoextends Veiculo {

    public void abastecer() {// cdigoLogger.log(nome() +

    " abastecido com " + x + " litros");

    // cdigo} ...

    }

    public class VeiculoPassageiroextends Veiculo {

    public void abastecer() {super.abastecer() + gasolina;Logger.log(nome() +

    " abastecido com gasolina");} ...

    } public class VeiculoCargaextends Veiculo {public void abastecer() {

    super.abastecer() + diesel;Logger.log(nome() +

    " abastecido com diesel");} ...

    }

    Scattering: acrescentar umrequerimento causa

    espalhamento do cdigoem vrias classes

    Tangling: cdigo para implementar o requerimento

    se mistura com lgica do cdigo existente

  • Incluso de nova funcionalidade

    Tambm sujeita a scattering e tangling Funcionalidade espalhada por vrias classes (funcionalidade

    consiste de mtodos contidos em vrias classes) Funcionalidade misturada com outros recursos (no

    representado por uma entidade separada)

    public class VeiculoPassageiroextends Veiculo {

    public void abastecer() {...}public void carregar() {...}public Apolice segurar() {

    Apolice a = new Apolice(...);

    // preenche apolice basicareturn a;

    }...

    } 215

    public class VeiculoCargaextends Veiculo {

    public void abastecer() {...}public Apolice segurar() {

    Apolice a = new Apolice();// preenche apolice p/// segurar carro e cargareturn a;

    }public void carregar() {...}...

    }

  • Como reduzir tangling e scattering?1. Criar subclasse que implemente

    recursos, sobreponha mtodos, etc. Problema: classes cliente tm que ser alteradas para que saibam como criar a nova subclasse:

    VeiculoCarga v = // new VeiculoCarga();new VeiculoCarga2();

    2. Design patterns como factory method resolveriam o problemaVeiculoCarga v =

    VeiculoCarga.create();

    mas sua interface precisariaser planejada antes!

    216

    package veiculos;public class VeiculoCarga

    extends Veiculo {public void abastecer() {

    super.abastecer()+ diesel;

    }}

    package veiculos.versao2;public class VeiculoCarga2extends veiculos.VeiculoCarga {public void abastecer() {

    super.abastecer() + diesel;Logger.log(nome() + " abastecido com diesel");

    }public Apolice segurar() {...}

    }

  • Soluo: Aspect-Oriented Programming

    217

    AOP divide interesses em dois grupos Componentes: quando interesse encapsulvel em unidades

    OO (classe, objeto, mtodo, procedimento). Aspectos: interesses que no so representados como

    componentes mas representar propriedades que interferem no seu funcionamento ou estrutura.

    Aspectos so interesses ortogonais Costurados ao cdigo principal durante compilao ou

    execuo (depende da implementao)

    Classes

    Aspectos

    Interesses dodomnio

    Weaver

    JoinPoints

    Aplicao

  • Soluo: Subject-Oriented Programming

    218

    Sujeitos (subjects) so abstraes diferentes de um mesmo conceito dentro de um domnio especfico

    Para implementar a aplicao, sujeitos so compostos gerando um objeto

    Regras definem forma como os sujeitos sero compostos

    Pode-se trabalhar com conceitossimples (domain-specific)

    Crculomover()

    Crculomover()

    Crculodesenhar()

    valida coor-denadas antes de mover

    simples-mente movea figura

    Crculocolorir()

    Coloridos Desenhveis Mveis Mveis.Vlidos

    Crculocolorir()desenhar()mover()

    Composio

    valida coor-denadas antes de mover

  • Soluo: MDSoC: HyperSpaces

    Representao de unidades de software em mltiplas dimenses de interesse

    Eixos representam dimenses de interesse Pontos nos eixos representam interesses Unidades de software so representadas no espao

    219

    Hyperslices Encapsulam interesses

    Hypermodule Conjunto de hyperslices

    e relacionamentos de integrao (informam como hyperslices se relacionam entre si)

    Neste modelo, aspecto apenas mais uma dimenso de interesse

    Validao

    Cor Crculocolorir()

    Retangulo

    colorir()Triangulo

    colorir()

    Movimento Crculomover()

    Retangulo

    mover()Triangulo

    mover()

    Aspecto

    Circulo Retngulo Tringulo

    Classe

    Recurso

    Outras dimensesde interesse

    ...

    Crculomover()

    Retangulo

    mover()Triangulo

    mover()

  • Uso de aspectos

    Antes Depois

    Cliente

    220

    Cliente

    bm.start()

    Isto feito usando wildcards sem introduzir

    cdigo no objetointerface

    Objeto

    ObjetoImpl

    mtodo()

    interfaceObjeto

    Proxy

    mtodo() bm.stop()

    ObjetoImpl

    mtodo() {bm.start();corpo do mtodobm.stop();}

  • Concluses

    Neste minicurso, introduzimos diversos padres usados em aplicaes OO Padres clssicos GoF, que descrevem solues para

    problemas comuns, elaborados Padres GRASP, que descrevem aplicao de princpios OO Padres e prticas emergentes como injeo de

    dependncias (aplicao de uma prtica GRASP) e aspectos (extenso do OO)

    Aprenda a usar os padres clssicos e encurte o tempo para ganhar tornar-se um programador experiente!

    Vrios outros padres existem e sero inventados Alguns sobrevivero por muito tempo, outros no Catalogue suas solues e crie seus prprios padres!

    221