sábado, 7 de setembro de 2013

Traits do PHP 5.4

Bem amigos(as) hoje vou falar finalmente das TRAITS adicionadas no PHP 5.4, é verdade que já faz um ano que lançaram o PHP 5.4 e eu sempre quis falar rápido sobre as poderosas traits mas sempre fiquei enrolando então, agora é a hora.


Afinal, o que são Traits? Traits são mecanismos que ajudam o problema de multipla extensão  auxiliando de forma elegante o reuso de código. Essa é basicamente a explicação da documentação mas a minha visão sobre Traits é que além de facilitar o reuso do código elas ajudam e muito uma arquitetura melhor da sua aplicação PHP e vocês vão ver pq eu acho isso.

Vamos imaginar uma situação real, vc está desenvolvendo um portal de notícias e toda interação dos usuários no site (Autenticação, comentário em notícia, adicionar agenda, comprar ingressos para show, etc...)  precisamos registrar em uma funcionalidade que grava o comportamento do usuário nesse site, não sendo necessáriamente um log mas sim uma funcionalidade para traçar perfil. 

Vamos imaginar o básico da classe de usuario e da classe de traçar perfil(vamos chamar ela de perfil apenas para estudo certo?)
Classe PERFIL RESPONSÁVEL PARA REGISTRAR E TRAÇAR PERFIL DE AÇÕES
  1. <?php
  2. class Perfil{    
  3.     public function registra($acao){
  4.         //registra uma ação
  5.     }
  6. }
E ai a nossa de usuario com uma pequena ação de alterar foto
Classe PESSOA
  
  1. <?php
  2. class Pessoa extends AppEntityPessoa{
  3.    
  4.     private $nome;    
  5.     /**
  6.      * Getters and setters
  7.      */        
  8.    
  9.    
  10.     public function alteraFoto($acao){
  11.         //faz algo...
  12.         // preciso registrar a acao na perfil como tornar isso um comportamento desse contexto?
  13.     }
  14.    
  15. }

Legal agora temos um problema que deve ser tratado seriamente como um padrão de arquitetura, se por obrigação todas minhas classes que representem dados precisam estender de uma entity da aplicação(vamos imaginar que essa é a estrutura imaginada), como eu soluciono esse problema? Existem diversas formas, mas as mais utilizadas seriam duas, a primeira seria criar uma estrutura de heranças em que em uma parte dela teriamos a classe perfil e essa por questões obvias é muito feia e sem sentido, mas ainda assim é uma solução utilizada. A segunda solução e mais recomendade seria no construtor da classe pessoa eu instânciar a classe Perfil e ai eu teria a instância injetada nessa classe utilizando esse contexto facilmente.

Pois bem apesar de uma solução melhor ainda assim não e boa e as traits resolvem isso mesmo, utilizando essa solução em traits criariamos a classe perfil como uma trait e apenas usariamos nas classes que julgamos necessário basicamente assim:
TRAIT PERFIL RESOLVENDO NOSSO PROBLEMA
  1. <?php
  2. trait Perfil{    
  3.     public function registra($acao){
  4.         //registra uma ação
  5.     }


E ai a classe pessoa utilizaria a trait com o use dentro da classe, herdando assim as características dela sem precisar instancia-la:
UTILIZANDO A TRAIT PERFIL
  1. <?php
  2. class Pessoa extends Perfil{
  3.     use Perfil;
  4.    
  5.     private $nome;    
  6.     /**
  7.      * Getters and setters
  8.      */        
  9.    
  10.    
  11.     public function alteraFoto($acao){
  12.         //faz algo
  13.         $this->registra($acao);
  14.     }
  15.    
  16. }

Conclusão

Traits resolvem de fato um problema de arquitetura sendo mais fácil pensar em como consumir classes fóra de contexto sem instancia-las ou herdar elas criando uma estrutura maluca. Frameworks vão utilizar isso com muita felicidade pois essa funcionalidade acaba com uma porrada de hierarquias gigantes criadas anteriormente.

Bem... é isso.


Referência: Documentação Oficial http://br1.php.net/manual/en/language.oop5.traits.php

Nenhum comentário:

Postar um comentário