Upload
flavio-lisboa
View
1.774
Download
2
Embed Size (px)
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