Lançado Adianti Framework 7.6!
Clique aqui para saber mais
Usando Traits para não peder código ao (re)importar modelo XMI Quem usa o Adianti Studio tem à sua disposição uma excelente ferramenta de importação e geração de classes derivadas diretamente do diagrama de classes UML (salvas em formato XMI). E isso é uma mão na roda para acelerar o desenvolvimento. Porém torna-se um pesadelo quando inadvertidamente o desenvolvedor esquece de fazer um backup do código inserido após a importação e vez ou outra p...
WG
Usando Traits para não peder código ao (re)importar modelo XMI  
Fechado
Quem usa o Adianti Studio tem à sua disposição uma excelente ferramenta de importação e geração de classes derivadas diretamente do diagrama de classes UML (salvas em formato XMI). E isso é uma mão na roda para acelerar o desenvolvimento. Porém torna-se um pesadelo quando inadvertidamente o desenvolvedor esquece de fazer um backup do código inserido após a importação e vez ou outra perde horas de trabalho sobrescrevendo suas classes.

Com o PHP 5.4 surgiram novos conceitos e um deles é a Trait (traço), onde temos herança horizontal. Digamos que uma trait é como um traço adquirido no decorrer da vida de um objeto, e não propriamente uma característica herdada de seus pais. Quando herda dizemos ter herança vertical (ao estender de outra classe). Já na herança horizontal, não estende ou deriva de outra; simplesmente usa as características quando necessário. A ideia que em vez de ir empilhando várias classes derivadas gerando vários clones e adicionando novas características, simplesmente criamos uma combinação de traços com novos atributos e métodos.

Não vou entrar em mais detalhes sobre trais senão esse texto ficará muito extenso. Quem quiser saber mais Traits, veja um excelente material publicado pelo Flávio Gomes Lisboa no slideshare, nesse link: pt.slideshare.net/flaviogomesdasilvalisboa/traits-no-php-54-muito-al

Como um exemplo básico de utilização desse recurso, vejamos o diagrama de classes com uma única classe no link da figura abaixo:

i.imgur.com/ZZvz0cA.png

Código gerado pelo Adianti Studio com base diagrama:
  1. <?php
  2. /**
  3.  * Pessoa Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class Pessoa extends TRecord
  7. {
  8.     const TABLENAME 'pessoa';
  9.     const PRIMARYKEY'id';
  10.     const IDPOLICY =  'serial'// {max, serial}
  11.     
  12.     /**
  13.      * Constructor method
  14.      */
  15.     public function __construct($id NULL$callObjectLoad TRUE)
  16.     {
  17.         parent::__construct($id$callObjectLoad);
  18.         parent::addAttribute('nome');
  19.         parent::addAttribute('cor');
  20.         parent::addAttribute('sexo');
  21.         parent::addAttribute('nascimento');
  22.     }
  23.     
  24.     /**
  25.      * Method getAniversariantes
  26.      * @param $inicio, $fim
  27.      */
  28.     public function getAniversariantes$inicio$fim )
  29.     {
  30.         
  31.     }
  32. }
  33. ?>


Em vez de codificarmos o método getAniversariantes() na classe, excluímos o mesmo e o recriamos numa trait. Abaixo o código da trait já com o método:
  1. <?php
  2. trait PessoaTrait
  3. {
  4.     private $aniversariantes;
  5.     public function getAniversariantes$inicio$fim )
  6.     {
  7.         $repository = new TRepository('Pessoa');
  8.         $criteria = new TCriteria;
  9.         $criteria->add( new TFilter('nascimento' 'BETWEEN'$inicio$fim) );
  10.     
  11.         $this->aniversariantes $repository->load($criteria);
  12.         return $this->aniversariantes;
  13.     }
  14. }
  15. ?>


Agora na classe basta incluirmos a trait dentro da classe. Abaixo o código completo da classe já com os ajustes:
  1. <?php
  2. /**
  3.  * Pessoa Active Record
  4.  * @author  <your-name-here>
  5.  */
  6. class Pessoa extends TRecord
  7. {
  8.     use PessoaTrait// Pensem... (Usar) vários traços, é melhor que se inflar para herdar (Ter) esses traços
  9.     const TABLENAME 'pessoa';
  10.     const PRIMARYKEY'id';
  11.     const IDPOLICY =  'serial'// {max, serial}
  12.     
  13.     /**
  14.      * Constructor method
  15.      */
  16.     public function __construct($id NULL$callObjectLoad TRUE)
  17.     {
  18.         parent::__construct($id$callObjectLoad);
  19.         parent::addAttribute('nome');
  20.         parent::addAttribute('cor');
  21.         parent::addAttribute('sexo');
  22.         parent::addAttribute('nascimento');
  23.     }
  24.     
  25.     // método getAniversariantes foi movido para a trait
  26. }
  27. ?>


Bem à primeira vista pode parecer pouco, mas pense numa aplicação de porte pelo menos razoável com várias classes extensas e com muitos métodos que você precisa codificar manualmente. Seguindo essa ideia, fará apenas uma vez e não terá mais problemas caso precise importar novamente alguma classe do XML.

Coloque na trait apenas os métodos e atributos que você precisou adicionar ou codificar manualmente na classe, mantendo na classe os métodos completos gerados pela importação.

Pacotão Dominando o Adianti Framework 7
O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado! Versão 7.4


Dominando o Adianti 7 Quero me inscrever agora!

Comentários (8)


AS

banaca, mas não entendi a vantagem disso , ao usar uma herança
mas irei estudar a respeito, tudo que agrega é sempre bem vido
WG

Alexandre, Traits são um recurso novo e pouco explorado ainda... Essa foi só uma abordagem de como usar traits para reaproveitamento e de se safar de uma possível perda de código.

Você pode por exemplo ter uma classe que não te atende 100% então, vai criar uma nova classe estendendo dessa e assim por diante; então toda a carga irá para a próxima. Já com trait, você simplesmente usa o que precisa sem precisar instanciar novas classes.
AS

cara viciei nisso , para criar logo isso é lindo
WG

Alexandre, pode colocar um exemplo do que fez aqui pra gente acompanhar?
GF

Wemerson. Achei bem legal você falar sobre trait. Mas só tem um problema: não gosto de traits... ;)
WG

:-D

Porque não gosta Guilherme ?
GF

Bom... sempre tive o GOF ('Group of Four') como fonte das melhores práticas de desenvolvimento. E eles são bem enfáticos em dizer: "Prefira usar associações do que aplicar várias camadas de herança". Então, sempre utilizei objetos associados para fazer aquilo que as traits estão fazendo. ;) Então, ainda não vi um real motivo para usá-las.

Mas como já falei acima, achei bem legal você ter falado sobre. É importante conhecer os recursos existentes.

=D
WG

Traits são justamente uma forma de associação onde não precisa criar um objeto inteiro, apenas os traços(traits) que precisa acrescentar!