Orientação a Aspectos em PHP

Preview:

DESCRIPTION

Palestra proferida na VIII Latinoware, em 2011.

Citation preview

Programação Orientada a Aspectos em PHP

Palestrante: Flávio Gomes da Silva Lisboa

Flávio Gomes da Silva Lisboa

● www.fgsl.eti.br

● @fgsl

● www.facebook.com/flaviogomeslisboa

Flávio Gomes da Silva Lisboa

● www.fgsl.eti.br

● @fgsl

● www.facebook.com/flaviogomeslisboa

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.

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)

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

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

O quesãoaspectos

Uma questãosemelhantefoi feitano passado

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

O quesãoobjetos

E outra similarfoi feitaainda antes

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

O quesãofunções

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....

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Funções

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

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Objetos

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

“Um objeto é uma coisa”

Scott Ambler

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

“Um objeto é qualquer coisa”

Scott Ambler

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Aspectos

Arte de Alex Rezende

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“

Programação Orientada a Aspectos em PHP

Programação Orientada 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?”

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Funções

Objetos

Aspectos

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Todo código é de execução sequencial

Programação Orientada a Aspectos em PHP

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

Programação Orientada a Aspectos em PHP

Ou um goto...

Programação Orientada a Aspectos em PHP

Que alguns gostam...

Programação Orientada a Aspectos em PHP

E outros demonizam...

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

Programação Orientada a Aspectos em PHP

E isso inclui a versão atual do 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?”

Programação Orientada a Aspectos em PHP

Reuso...

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.

Programação Orientada a Aspectos em PHP

É tudo a mesma coisa, então?

Na verdade, é uma evolução de reuso

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

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

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.

Exemplo de reuso com classes

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.

Mas a Orientação a Objetos tem limites

● Ela não trata interesses transversais

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!

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

Será que meu programa tem isso?

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

A Orientação a Aspectos vem pararesolver esses problemas

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

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

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

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.

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.

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.

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Como aplicaraspectosno 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/

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada 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];}}

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; }}

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);

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Programação Orientada 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{}?>

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);}}?>

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

Quais asnovidadessobre issona versão 5.4 do 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.

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];

}

Programação Orientada a Aspectos em PHP

Programação Orientada a Aspectos em PHP

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

Recommended