A composição de traços é uma boa prática?

5

Então, estou lidando agora com essa base de código relativamente nova que usa e, às vezes, parece abusar de traços. Desde que eu fui exposto ao uso de traços de uma forma bastante limitada, eu queria saber se a maneira como eles estão usando faz sentido. Eu acredito que eles estão preferindo usar traços quando uma boa herança antiga funcionaria também.

Aqui está um exemplo do que estou falando:

trait CrudTrait
{
  use FindTrait;
  use ExistsTrait;
  use UpdateTrait;
}

Em seguida, o traço é usado mais ou menos da seguinte forma:

class <EntityName>ServiceAbstract extends ServiceAbstract 
{
  use CrudTrait;
}

Eu não consigo pensar em uma razão pela qual algo como isso é necessariamente melhor do que apenas fazer tais métodos para os membros da classe. No final do dia, essas características particulares são projetadas de tal forma que não podem ser reutilizadas horizontalmente.

Existe alguma razão por que isso poderia melhor do que apenas anexar os métodos à classe pai da hierarquia ?. Estou começando a acreditar que o abuso de traços pode ser um cheiro de código aqui.

    
por memo 16.09.2015 / 16:02
fonte

2 respostas

5

A composição é geralmente preferível à herança, a menos que você precise de substituibilidade. Os traços são uma maneira específica de executar a composição. Normalmente você usa traços quando precisa de reusabilidade horizontal, mas também é razoável usá-los para modularidade, para dividir uma classe que não pode ser quebrada por algum motivo.

É relativamente raro que você não possa simplesmente dividir a turma normalmente. Geralmente, ele é baseado em um requisito externo, como a necessidade de fornecer todas as partes de uma API em uma classe. Alternativamente, os traços são frequentemente usados para classificar uma configuração em tempo de compilação de uma classe, como se você tivesse várias opções para um FindTrait , por exemplo, que clientes diferentes escolheriam de maneira diferente, mesmo que sua implementação específica use apenas uma configuração.

Os traços são provavelmente subutilizados e não muito bem compreendidos, porque muitos dos primeiros e principais idiomas dos programadores não os possuem. Eles poderiam muito bem ser abusados nessa base de código específica. No entanto, em geral, a herança é muito mais provável de ser usada em excesso do que traços. Se traços são usados indevidamente aqui, é muito provável que substituí-los por herança tornaria isso pior.

    
por 16.09.2015 / 23:40
fonte
1

Do que você descreveu, eu tenho que concordar que a herança parece ser uma abordagem melhor. Mas essas opiniões são baseadas em saber praticamente nada sobre a base de código.

As características fornecem essencialmente uma forma de "herança múltipla" e, às vezes, pode ser útil. Digamos, por exemplo, que você já tenha uma classe filha herdando de um pai, mas há outro conjunto principal de funcionalidade que precisa ser compartilhado por toda a árvore de herança.

Se o problema puder ser resolvido apenas com herança, essa deve ser sempre sua primeira escolha.

    
por 16.09.2015 / 16:53
fonte

Tags