69

Orientação a Aspectos em PHP

Embed Size (px)

DESCRIPTION

Palestra proferida na VIII Latinoware, em 2011.

Citation preview

Page 1: Orientação a Aspectos em PHP
Page 2: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Palestrante: Flávio Gomes da Silva Lisboa

Page 3: Orientação a Aspectos em PHP

Flávio Gomes da Silva Lisboa

● www.fgsl.eti.br

● @fgsl

● www.facebook.com/flaviogomeslisboa

Page 4: Orientação a Aspectos em PHP

Flávio Gomes da Silva Lisboa

● www.fgsl.eti.br

● @fgsl

● www.facebook.com/flaviogomeslisboa

Page 5: Orientação a Aspectos em PHP

O Serpro

● O Serviço Federal de Processamento de Dados - SERPRO é uma empresa de 45 anos, vinculada ao Ministério da Fazenda, considerada uma das maiores Organizações do setor de prestação de serviços em Tecnologia da Informação e Comunicações para o setor público, na América Latina.

● O Serpro faz parte do Comitê Técnico para Implementação do Software Livre no Governo.

● O Serpro já possui dois projetos de software livre disponíveis no Portal do Software Público e planeja incluir outros.

Page 6: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

PHP no Serpro Utilizado em sistemas corporativos da empresa, como avaliação de funcionários, agendamento nacional de recursos e controle do ciclo de vida de tecnologia.Utilizado em sistemas para clientes, como Presidência da República e Incra.Padrão de desenvolvimento de aplicações da superintendência de operaçõesUtilizado no monitoramento de recursos de TI (Zabbix)Utilizado na suíte de comunicaçãoUtilizado nos sistemas de colaboraçãoUtilizado no rastreamento de bugs e requisição de novas Utilizado no ensino a distância (Moodle)

Page 7: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Agenda

O que são aspectosPra que servemComo aplicá-los no PHPQuais as novidades sobre isso na versão 5.4 do PHP

Programação Orientada a Aspectos em PHP

Page 8: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

O quesãoaspectos

Page 9: Orientação a Aspectos em PHP

Uma questãosemelhantefoi feitano passado

Page 10: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

O quesãoobjetos

Page 11: Orientação a Aspectos em PHP

E outra similarfoi feitaainda antes

Page 12: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

O quesãofunções

Page 13: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

As respostas clássicas não parecem ter relaçãoentre si....

Page 14: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Funções

Page 15: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Uma função associao argumento conhecidocomo entrada com ovalor da função conhecidocomo saída

Page 16: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Page 17: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Objetos

Page 18: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

“Um objeto é uma coisa”

Scott Ambler

Page 19: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

“Um objeto é qualquer coisa”

Scott Ambler

Page 20: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Page 21: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Aspectos

Arte de Alex Rezende

Page 22: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

“Um aspecto é uma característicaligada a muitas partes de um programa“

Page 23: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Page 24: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

“Qual a semelhança entre um corvo e uma escrivaninha?”

Page 25: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Funções

Objetos

Aspectos

Page 26: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Page 27: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Todo código é de execução sequencial

Page 28: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Para alterar a sequência, é preciso dar um salto

Page 29: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Ou um goto...

Page 30: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Que alguns gostam...

Page 31: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

E outros demonizam...

Page 32: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Mas independente disso, ele é feito internamente por todas as linguagens deprogramação que permitam estruturas de decisão e laços de repetição

Page 33: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

E isso inclui a versão atual do PHP

Page 34: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

“Mas qual a semelhança entre a função, o objeto e o aspecto?”

Page 35: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Reuso...

Page 36: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Funções são blocos de código reusáveis.

Classes são blocos de código reusáveis.

Aspectos são blocos de código reusáveis.

Page 37: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

É tudo a mesma coisa, então?

Page 38: Orientação a Aspectos em PHP

Na verdade, é uma evolução de reuso

Page 39: Orientação a Aspectos em PHP

Eu disse uma evolução de reuso, entendeu?

Page 40: Orientação a Aspectos em PHP

Mais modularidade,Mais reusabilidade,Mais evolutibilidade

Evolução da Programação

Linguagemde Máquina

ProgramaçãoEstruturada

ProgramaçãoProcedural

ProgramaçãoModular

Programação Orientada a Objetos

Programação Orientada a Aspectos

Programação Orientada a Notificações

Page 41: Orientação a Aspectos em PHP

Programação Orientada a Objetos

● Tenta aproximar a modelagem do sistema com o negócio do cliente

● Facilita a criação de abstrações

● Sua estrutura induz ao encapsulamento dos dados

● Facilita o reuso de componentes (ao criar componentes reusáveis)

● Permite a aplicação de vários padrões de projeto

● Facilita a manutenção

A função não some na programação orientada a objetos, ela evolui para o método de classe ou deobjeto.

O método, diferente da função, tem um dono.Existe um agente para a ação.

Page 42: Orientação a Aspectos em PHP

Exemplo de reuso com classes

Page 43: Orientação a Aspectos em PHP

Características de um software bem construído

● Os módulos (blocos de código) tem um alto grau de coesão, o que significa que cada elemento em uma unidade do programa é essencial para aquela unidade atingir seu objetivo.

● As interações ou outros relacionamentos entre dois módulos no mesmo nível de abstração são tão fracas quanto possíveis.

● Os interesses no software ficam separados.

● Módulos coesos tornam as mudanças mais localizadas. Não é preciso alterar vários pontos do software, apenas um.

● O fraco acoplamento torna os módulos mais independentes e facilita o reuso, ao tratá-los como componentes.

Page 44: Orientação a Aspectos em PHP

Mas a Orientação a Objetos tem limites

● Ela não trata interesses transversais

Page 45: Orientação a Aspectos em PHP

Reuso limitado em OOP

● A arma de reuso da orientação de objetos é a herança de classes.

● Algumas linguagens limitam a herança (caso de PHP) de modo que uma classe filha tem apenas uma classe mãe.

● A herança é total. Tudo o que for público e protegido é herdado.

● Mas existem trechos de código que se repetem, dentro de métodos diferentes.

● Esses trechos de código ficam espalhados em vários métodos de várias classes.

● Se não existe herança de método, quanto menos de trecho!

Page 46: Orientação a Aspectos em PHP

A Tirania da Decomposição Dominante

● O programa pode ser modularizado de uma forma somente a cada vez, e muitos tipos de interesses que não se alinham com essa modularização terminam espalhados por muitos módulos e emaranhados uns com os outros.

● Sebastian Bergmann

Page 47: Orientação a Aspectos em PHP

Será que meu programa tem isso?

● Se for PHP, você pode verificar um dos sintomas com a ferramenta PHP Copy & Paste Detector (phpcpd).

Page 48: Orientação a Aspectos em PHP

A Orientação a Aspectos vem pararesolver esses problemas

Page 49: Orientação a Aspectos em PHP

Para que serve a Orientação a Aspectos

● Para modularizar interesses transversais do software em unidades chamadas aspectos.

● Interesses transversais geralmente são os trechos de código espalhados pela aplicação, como persistência, auditoria, controle de exceções, e quaisquer sequências que façam parte de métodos mas que não consigam ser transformados em métodos, ou que não possam ser herdados por todos que precisam deles.

● A Orientação a Aspectos não substitui a Orientação a Objetos. Ela é uma extensão que lida apenas com os interesses transversais.

Classe A Classe B Classe C Classe D

Page 50: Orientação a Aspectos em PHP

Orientação a Aspectos é injeção de dependência

Page 51: Orientação a Aspectos em PHP

Quais são as estruturas da AOP?

● Joinpoints

● São as instruções no fluxo do programa onde aspectos podem ser injetados

● Podem ser execuções de métodos, acesso a atributos, construções de objetos, controle de exceções e destruições de objetos.

● Pointcuts

● São as expressões que utilizam os joinpoints para identificar os pontos do programa onde será injetado determinado código (aspecto)

● Os pointcuts usam wildcards (curingas) para criar expressões genéricas.

● * Todos os existentes

● + Todos com subclasses

● || “ou” para combinar

Page 52: Orientação a Aspectos em PHP

Quais são as estruturas da AOP?

● Advices

● São os comandos da AOP que introduzem código nos pointcuts

● Há três tipos:

● Before● Around● After

● Inter-Type Declaration

● É um tipo de declaração que introduz atributos, constantes e métodos em classes, ou aspectos, existentes.

Page 53: Orientação a Aspectos em PHP

Quais são as estruturas da AOP?

● Weaver

● É uma espécie de pré-compilador (ou compilador mesmo, no caso do PHP) que junta os aspectos com o código-fonte para gerar arquivos únicos, que formarão o programa final.

Page 54: Orientação a Aspectos em PHP

AOP é controle

● O emaranhado não desaparece. Ele é deslocado para o código final. Mas na fase de desenvolvimento, a estrutura fica muito mais organizada.

Page 55: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Como aplicaraspectosno PHP?

Page 56: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

● Você pode usar o projeto phpAspect (code.google.com/p/apdt)

● Com ele é possível desenvolver com orientação a aspectos usando o Eclipse.

● O projeto fornece um plugin (apdt) com um weaver. Você pode baixar pela URL http://apdt.googlecode.com/svn/trunk/org.phpaspect.apdt.updatesite/

Page 57: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Page 58: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Page 59: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

<?phpclass Catalog{private static $priceList = array('Largo Winch' => 9.31,'Asterix' => 8.46,'XIII' => 8.70);

public static function getPrice($reference){return self::$priceList[$reference];}}

Page 60: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

<?phprequire('Catalog.php');class Order{ private $items = array(); private $amount = 0; public function addItem($reference, $quantity){ $this->items[] = array($reference, $quantity); $this->amount += $quantity*Catalog::getPrice($reference); } public function getAmount(){ return $this->amount; }}

Page 61: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

<?phprequire('Order.php');$myOrder = new Order;$myOrder->addItem('Largo Winch', 1);$myOrder->addItem('Asterix', 2);

Page 62: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Page 63: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Page 64: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

<?phprequire_once 'PHPAspect/Model/Aspect.php';

class Log extends Aspect{}?>

Page 65: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

<?phprequire_once 'PHPAspect/Model/Aspect.php';

class Log extends Aspect{/*** @After(new(Order))*/public function logNewOrder(){echo "New Order\n";}

/** * @After(call(Order->addItem)) */public function logTotalAmount(Joinpoint $thisJoinpoint){printf("Total amount of the cart : %.2f euros\n",$thisJoinpoint->getSource()->getAmount());}

/** * @After(exec(Order::addItem)) */public function logAddItem(Joinpoint $thisJoinpoint){list($reference, $quantity) = $thisJoinpoint->getArgs();printf("%d %s added to the cart\n", $quantity, $reference);}}?>

Page 66: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Quais asnovidadessobre issona versão 5.4 do PHP

Page 67: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

● A versão 5.4 do PHP tem um novo aspecto interessante de programação. Mas não é o aspecto da orientação a aspectos.

● No entanto, é uma construção que também tem como objetivo melhorar o reuso.

● PHP 5.4 tem uma estrutura chamada trait (traço), que consiste em um bloco de código que contém métodos.

● Esse bloco pode ser usado por várias classes, que podem herdar de superclasses diferentes.

● Essa construção abre maiores possibilidades de reuso. E abre uma possibilidade de tratar os interesses transversais com uma construção nativa do PHP.

Page 68: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

trait [nome] {

[bloco de código]

}

class [nome] extends [nome] {

use [nome];

}

Page 69: Orientação a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Obrigado!● @fgsl● www.fgsl.eti.br