Vous êtes sur la page 1sur 43

Implementando Enterprise Patterns em PHP

Pablo Dall'Oglio Adianti Solutions www.adianti.com.br

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

CHANGELOG

2008 :: FISL9.0 Enterprise Patterns em PHP; 2009 :: PHPMS Enterprise Patterns em PHP; 2009 :: GOPHP Enterprise Patterns em PHP;

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

Patterns

O que so Design Patterns ? Um pattern descreve um problema que ocorre com freqncia em nosso ambiente, e ento explica a essncia da soluo para este problema, de forma que tal soluo possa ser utilizada milhes de outras vezes... Christopher Alexander (1936 arquiteto)

ponte estaiada

ponte de viga

ponte em arco
3

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

Observaes

Padres so descobertos, no inventados. Na maioria das vezes, j utilizamos algum padro, sem saber; O conhecimento dos padres nos leva a distinguir em quais situaes utiliz-los; No existe padro melhor ou pior, existem padres que so mais indicados para determinadas situaes; Um padro no uma soluo pronta; Os cdigos a seguir so apenas UMA das formas de implementar os patterns, provavelmente no a melhor, visto que aqui o enfoque DIDTICO :-)
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

Observaes

Christopher Alexander utilizou o termo pattern inicialmente em 1977 aplicado arquitetura; Kent Beck e Ward Cunningham comearam a aplicar patterns programao em 1987; Design Patterns tornaram-se populares aps o livro de Gamma em 1994: Design Patterns: Elements of Reusable ObjectOriented Software; Aps, outras publicaes seguiram, focadas em padres para concorrncia em sistemas distribudos, em integrao de aplicaes, dentre outros. Martin Fowler desenvolve um trabalho focado em aplicaes corporativas em 2002: Patterns of Enterprise Application Architecture.
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

Mapeamento Objeto-Relacional (Persistncia)

Persisncia significa continuar a existir, perseverar, durar longo tempo ou permanecer; A possibilidade dos objetos existirem em um meio externo aplicao que os criou (ex. bancos de dados); BDR surgiram na dcada 70 (padro estruturado); BDR no suportam diversos conceitos OO (herana, composio, agregao, polimorfismo, mtodos, etc); BD OO ainda tem pouca adoo (desempenho inferior, pouca documentao, ferramentas no to maduras); BDR so amplamente utilizados para armazenar objetos, mas h uma dissonncia corrigida pelo uso de tcnicas de mapeamento objeto-relacional (MOR);
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

Persistncia

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

O que podemos melhorar ?


<?php // conecta ao banco $conn = pg_connect("dbname=livro user=postgres"); // string sql $sql = "select id, nome from cidade order by id"; echo '<table border=1>'; // abre tabela $result=pg_query($conn,$sql); // roda o sql while ($row=pg_fetch_array($result)) { detalhes de conexo // exibe resultados explicitos; echo '<tr>'; camada visual echo "<td>{$row['id']}</td>"; echo "<td>{$row['nome']}</td>"; misturada com acesso echo "</tr>"; ao banco de dados; } SQL espalhado pelo // fecha tabela cdigo -fonte; echo "</table>"; pg_close($conn); ?>
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

Gateways

Em algum momento, precisaremos armazenar as informaes da aplicao em um banco de dados; Deve-se evitar ter cdigo SQL juntamente com a camada de negcios. Maior acoplamento, menor reuso; Um Gateway uma interface que se comunica com um recurso externo, escondendo seus detalhes; Para implementar um gateway, criamos uma classe para manipular o acesso uma tabela do banco de dados;

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

Table Data Gateway

Um Table Data Gateway um objeto que possui mtodos para leitura, escrita e pesquisa de registros de uma tabela; Pode ser implementada por uma classe responsvel por persistir (inserir, alterar, excluir) e retornar dados do BD; comum encontrarmos em um Table Data Gateway mtodos como insert(), update(), delete(), get(), findByName(), dentre outros;
Obs: Table Data Gateway por natureza State Less, ou seja, no mantm o estado de suas propriedades, atua simplesmente como ponte entre o objeto de negcio e o banco de dados.
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

10

Table Data Gateway

Uma (1) classe por tabela do banco de dados. Apenas uma instncia desta classe ir manipular todos os registros; Um Table Data Gateway por definio stateless, uma vez que temos apenas um objeto para gerenciar todos registros de uma tabela; Por isto necessrio sempre identificar o registro sobre o qual o mtodo estar operando (ID ou RecordSet); Um Table Data Gateway pode ser utilizado como mecanismo de persistncia tanto para um Domain Model quanto para um Table Module; Devido sua natureza stateless, ele funciona de maneira mais natural quando a camada de negcios Table Module;
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

11

code, please...

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

12

Row Data Gateway

um objeto que representa um registro do banco de dados; Cada instncia (objeto) representa um registro diferente; Cada objeto se comporta exatamente como um registro, suas propriedades represem as colunas do banco de dados, alm de ter mtodos para armazen-lo no banco de dados;
Obs: Row Data Gateway StateFull, ou seja, mantm os valores de suas propriedades ao longo do seu ciclo de vida, no sendo necessrio passar todos valores novamente via parmetros, como no caso do Table Data Gateway.
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

13

Row Data Gateway

No Row Data Gateway temos um objeto para manipular cada registro de uma tabela; Diferente do Table Data Gateway, onde temos um objeto para manipular todos os registros de uma tabela; Assim como um objeto representa um registro, cada um de seus atributos representaro as colunas da tabela; Podemos tratar os objetos como statefull, uma vez que seus atributos correspondero aos dados armazenados na BD. No sendo necessrio passar ID's ou RecordSets; Assim como Table Data Gateway, o Row Data Gateway fornece um objeto com uma interface que permite que o desenvolvedor acesse o banco de dados sem precisar conhecer a linguagem SQL;
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

14

code, please...

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

15

Concluso parcial

Qual a diferena entre um gateway (Table Data Gateway ou Row Data Gateway) para um objeto de negcio (Domain Model ou Table Module) ? A diferena primordial que objetos de negcio contm regras de negcio, clculos, tomadas de deciso, mas no contm acesso direto dados. O acesso recursos externos como bancos de dados realizado justamente pelos gateways que s possuem mtodos de persistncia, sem nenhum mtodo de negcio (*); * Com exceo do padro Active Record, ainda no visto.

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

16

Active Record

Row Data Gateway no possui mtodos do modelo de negcios, somente mtodos de acesso base de dados; Quando adicionamos lgica de negcio um Row Data Gateway, temos um Active Record; Com o Active Record, temos uma nica camada, onde temos lgica de negcios (modelo conceitual) e mtodos de persisncia do objeto na base de dados (gateway);
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

17

Active Record

Um Active Record um objeto que se comporta como um registro do banco de dados, encapsulando o acesso este (persistncia) e contendo ainda a lgica de negcios relativa estes dados; Um Active Record pode ser visto como um Domain Model cujas classes possuem uma estrutura muito parecida com a estrutura do banco de dados; Active Records tem seu uso mais indicado quando a camada de negcios tiver uma estrutura similar estrutura do Banco de Dados; Em casos em que a lgica de negcios for de complexidade maior, utilizando combinaes de relacionamentos da orientao a objetos como herana, agregaes e composies, melhor usar Data Mapper;
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

18

code, please...

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

19

Identity Field

Os objetos em memria possuem sua unicidade garantida por meio de mecanismos da linguagem (ponteiros); Os objetos so acessados por meio de variveis que apontam para endereos de memria; Os registros de bancos de dados so identificados por chaves numricas, conhecidas como chaves primrias; Identity Field visa trazer tambm para a memria (objeto), o campo identificador do registro no BD (primary key); Isto possibilita carregarmos o objeto, alterarmos em memria e posteriormente persistirmos novamente; importante que cada tabela na base de dados possua apenas um campo como chave primria ( composto); No usar campos c/ significado (imutabilidade e unicidade);
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

20

Foreign Key Mapping - Associaes

As associaes so um tipo de relacionamento onde um objeto tem uma propriedade que referencia outro; Ex: $pessoa->cidade = new Cidade; Os objetos em memria esto relacionados por meio de ponteiros de memria, mecanismo que no existe no BD; No banco de dados, os registros so relacionados por meio de chaves primrias e chaves estrangeiras; Para mapearmos um objeto para o banco de dados, precisamos de um campo de identificao (Identity Field), ou seja, a chave primria tambm presente no objeto; Para mapearmos relacionamentos entre objetos, utilizamos a mesma tcnica, mas implementando o mapeamento atravs do uso de chaves estrangeiras (Foreign Keys);
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

21

Foreign Key Mapping - Associaes

Modelo de Objetos
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

22

Foreign Key Mapping - Associaes

Modelo Relacional
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

23

code, please...

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

24

Foreign Key Mapping - Composies

No relacionamento de composio, um objeto pode conter de uma vrias instncias de um outro objeto, sendo responsvel pela sua criao e destruio; class Pessoa ... $this->telefones[] = new Telefone; Uma pessoa poder ter vrios telefones que so armazenados na forma de um atributo no objeto Pessoa, chamado $telefones. Este atributo na verdade um array de objetos do tipo Telefone; Os objetos Telefone fazem so parte do objeto Pessoa, ou seja, um objeto Telefone (parte) far parte somente de um nico objeto Pessoa (todo). Quando o objeto Pessoa for destrudo, seus objetos telefone tambm sero;
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

25

Foreign Key Mapping - Composies

Modelo de Objetos
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

26

Foreign Key Mapping - Composies

Modelo Relacional

Obs: Como a maioria dos bancos de dados relacionais no aceita campos multi-valorados, necessrio inverter a direo do relacionamento.
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

27

code, please...

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

28

Association Table Mapping

Na agregao, tambm temos uma relao todo/parte como na composio, mas desta vez o objeto-parte no est intrinsicamente ligado ao objeto-todo; Quando destrumos o objeto-todo, os objetos-parte ainda continuam a existir, isto por que uma eles ttambm pode pertencer diferentes objetos-todo (relao N-N); No caso a seguir, temos uma agregao, onde um objeto CestaCompras, representa uma cesta de compras em um sistema de comrcio eletrnico; A diferena para a composio que um produto pode fazer parte de cestas de compras diferentes e estes objetos so criados no contexto externo classe CestaCompras; No podemos representar a relao somente com PK<->FK;
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

29

Association Table Mapping

Modelo de Objetos

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

30

Association Table Mapping

Modelo Relacional

Obs: A tabela itens_cesta ser totalmente manipulada pela classe CestaCompras, ou seja, ser totalmente transparente ao programador.
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

31

Mapeamento de Heranas

Existem tipos de relacionamentos da orientao a objetos para os quais no existe suporte nativo na maioria dos BD relacionais (associao, composio, agrega); Outro relacionamento no suportado a herana; Pelo mecanismo de herana, podemos construir uma hierarquia de classes em nossa aplicao, onde estas podem herdar estrutura (atributos) e comportamento (mtodos); Salvo algumas excees de BD's que implementam um mecanismo objeto-relacional no temos presente na base de dados o relacionamento de herana entre classes; Mesmo assim, no so todos bancos de dados que o fazem, e os que implementam o fazem de maneira no padronizada, o que dificulta uma possvel migrao de banco de dados;
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

32

Mapeamento de Heranas

Existem basicamente trs formas de mapear um relacionamento de herana. Para exemplificar, iremos tomar por base o seguinte diagrama de classes:

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

33

Single Table Inheritance

Criao de uma tabela contendo os campos de toda a estrutura da herana, ou seja, a soma de todos atributos;

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

34

Single Table Inheritance

Como diferenciar quando um registro um livro ou quando um DVD ? Neste caso, se torna obrigatrio criarmos um campo indicando o tipo do objeto na tabela; Nunca teremos todos os campos da tabela preenchidos; Se o material for um Livro, artista, gravadora e durao ficaro vazios. Se o material for um DVD, autor, editora e pginas ficaro vazios; Os gerenciadores modernos de banco de dados otimizam bastante o armazenamento de informaes, diferentemente de bancos antigos como DBF ou Cobol; Mais simples e fcil de implementar, pois dispensa o uso de joins entre tabelas, e com um simples SELECT, conseguimos trazer quaisquer informaes na memria,
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

35

code, please...

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

36

Concrete Table Inheritance

Uma tabela para cada classe concreta da hierarquia, ou seja, para cada classe instancivel ou nodo-folha; Cada tabela deve ter alm dos atributos da prpria classe que ela est mapeando, todos atributos da classe pai; Cada tabela contm somente os campos relativos ao seu contexto, diferentemente do Single Table Inheritance; Apesar de estarmos trabalhando com tabelas diferentes, estamos armazenando um objeto da mesma hierarquia; No podemos ter dois materiais com o mesmo cdigo, s por que um Livro e o outro DVD; Os objetos devem ser tratado com unicidade entre as duas tabelas; No faz sentido uma listagem de materiais trazer materiais diferentes com o mesmo cdigo;
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

37

Concrete Table Inheritance

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

38

Class Table Inheritance

Criao de uma tabela para cada classe da estrutura de herana e relacionarmos estas tabelas atravs de pares de chaves primrias e chaves estrangeiras; Leva uma maior normalizao do banco de dados frente aos dois outros patterns; Cada classe e cada atributo do modelo de objetos encontram exatamente um correspondente no modelo do banco de dados; Para persistir os objetos torna-se necessrio inserir em vrias tabelas (cfe nveis), assim como para carregar objetos torna-se necessrio realizar joins entre tabelas (cfe nveis); Objetos podem trocar de tipo (transio na hierarquia), Estagirio pode vir a ser efetivado (hierarquia de pessoas);
Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

39

Class Table Inheritance

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

40

code, please...

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

41

Leitura Recomendada :-)

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

42

Obrigado!

E-Mail
pablo@php.net pablo@dalloglio.net

URL
http://www.adianti.com.br http://www.pablo.blog.br

Pablo Dall'Oglio [pablo@php.net] Enterprise Design Patterns:: com exemplos do livro PHP Programando com Orientao a Objetos www.adianti.com.br/phpoo

43

Vous aimerez peut-être aussi