Si tratta di un uso "corretto" di un tratto in PHP?

0

In Laravel 5.6 una relazione Illuminate\Database\Eloquent\Relations\BelongsTo ha avuto la capacità di supportare i modelli predefiniti. Ciò consente un modello che verrà restituito se la relazione è vuota.

La maggior parte del codice per farlo vive nel tratto Illuminate\Database\Eloquent\Relations\Concerns\SupportsDefaultModels , che usa la relazione BelongsTo .

Ecco un esempio di un metodo nella relazione che chiama il metodo getDefaultFor dal tratto:

/**
 * Get the results of the relationship.
 *
 * @return mixed
 */
public function getResults()
{
    return $this->query->first() ?: $this->getDefaultFor($this->parent);
}

Il metodo getDefaultFor esiste solo nel tratto. Non è definito sulla classe stessa. Per qualche ragione ho sempre avuto l'impressione che questo non sia "corretto". In altre parole, se dovessi rimuovere il tratto, la classe si spezzerebbe. La classe non dovrebbe avere una sorta di metodo di fallback getDefaultFor definito su di esso che il tratto può sovrascrivere?

Mi rendo conto che questa è una domanda estremamente acuta e non ha molta importanza dal momento che il codice funziona, ma sto solo cercando di capire da una prospettiva di progettazione del codice se questo è il modo corretto di fare le cose.

Qualcuno ha qualche idea su questo?

    
posta flyingL123 21.09.2018 - 19:23
fonte

1 risposta

4

Lontano dall'essere un esperto, ma ho avuto la stessa domanda in mente per un po 'di tempo. Questo è quello che ho raccolto.

  • La definizione generica (tra lingue diverse) sottolinea che un tratto può estendere le funzionalità di una classe . Quindi, se aggiunto a una classe, la classe in effetti non funzionerebbe senza di essa.
  • Non c'è un chiaro consenso in merito nella comunità ( per esempio ), anche se era un'aggiunta fondamentale a php 5 +.
  • Quasi ogni pacchetto di ricerca per Laravel è un tratto e quindi il controller dipende in gran parte da esso senza un ripiego.
  • Il codice di Laravel spesso fa usi idiosincratici di modelli, come le loro facciate, ma è uno di quei casi in cui l'elefante da 800 libbre si siede dove vuole.

Nel mio codice, uso i tratti per operazioni comuni, come la manipolazione delle stringhe. I tratti sembrano essere modi fantasiosi per evitare il copia e incolla di funzioni che non hanno bisogno di classi.

Solo la mia opinione amatoriale.

    
risposta data 23.09.2018 - 18:29
fonte

Leggi altre domande sui tag