La composizione dei tratti è una buona pratica?

5

Quindi, ora mi occupo di questa base di codice relativamente nuova che usa e, a volte, sembra abusa dei tratti. Dal momento che sono stato esposto all'uso dei tratti in modo piuttosto limitato, mi chiedevo se il modo in cui li stanno usando ha senso. Credo che preferiscano usare i tratti quando una buona vecchia ereditā funzionerebbe altrettanto bene.

Ecco un esempio di ciò di cui sto parlando:

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

Quindi, il tratto è usato più o meno come segue:

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

Non riesco a pensare a una ragione per cui qualcosa del genere sia necessariamente migliore rispetto a semplici metodi di classe. Alla fine della giornata, questi tratti particolari sono progettati in modo tale da non poter essere riutilizzati orizzontalmente.

C'è qualche ragione per cui questo potrebbe migliore del semplice collegamento dei metodi alla classe genitrice della gerarchia ?. Sto iniziando a credere che l'abuso di tratti potrebbe essere un odore di codice qui.

    
posta memo 16.09.2015 - 16:02
fonte

2 risposte

5

La composizione è generalmente preferibile all'ereditarietà, a meno che non sia necessaria la sostituibilità. I tratti sono un modo specifico per eseguire la composizione. Di solito usi i tratti quando hai bisogno di riusabilità orizzontale, ma è anche ragionevole usarli per modularità, per suddividere una classe che non può essere suddivisa per qualche motivo.

È relativamente raro che tu non possa semplicemente suddividere la classe normalmente. Di solito è guidato da un requisito esterno, come la necessità di fornire tutte le parti di un'API in una classe. In alternativa, i tratti vengono spesso utilizzati per assemblare una configurazione in fase di compilazione di una classe, ad esempio se si dispone di più scelte per un FindTrait , ad esempio, che diversi clienti sceglierebbero in modo diverso, anche se la specifica implementazione utilizza solo la una configurazione.

I tratti sono probabilmente sottoutilizzati e non molto ben compresi, perché molte delle prime e delle principali lingue dei programmatori non li hanno. Potrebbero essere abusati in questa particolare base di codice. Tuttavia, in generale, l'ereditarietà è molto più probabile che sia sovrautilizzata rispetto ai tratti. Se i tratti sono usati impropriamente qui, è altamente probabile che sostituendoli con l'ereditarietà peggiori.

    
risposta data 16.09.2015 - 23:40
fonte
1

Da quello che hai descritto, dovrei essere d'accordo sul fatto che l'ereditarietà sembra un approccio migliore. Ma le opinioni si basano sul non conoscere praticamente nulla sulla base del codice.

I tratti essenzialmente forniscono un modo per fare "ereditarietà multipla" e sì, a volte può essere utile. Supponiamo, ad esempio, che una classe figlia già erediti da un genitore, ma esiste un altro insieme fondamentale di funzionalità che deve essere condiviso in tutto l'albero di ereditarietà.

Se il problema può essere risolto solo con l'ereditarietà, quella dovrebbe sempre essere la tua prima scelta.

    
risposta data 16.09.2015 - 16:53
fonte

Leggi altre domande sui tag