Refactoring a una gerarchia ereditaria in anticipo

1

Sto costruendo uno strumento di gestione per le ricette. Le ricette hanno un sacco di dati, tra cui cose molto generiche come un ID, tag, valutazioni e curiosità. Attualmente gestisco solo le ricette, ma desidero aggiungere il supporto per ingredienti, prodotti, ecc. Anche in futuro. Questi condivideranno gli stessi attributi sopra menzionati.

Ha senso rifattorizzare presto una gerarchia dell'ereditarietà o è una violazione del principio YAGNI?

Se ha senso, ci sono delle buone regole su come impostare i limiti per le superclassi e come chiamarli? Mi sento come TaggableRatableTriviaEntity è un nome piuttosto brutto.

    
posta Luca Fülbier 23.07.2016 - 14:44
fonte

2 risposte

4

Diamo un'occhiata al tuo dominio:

1) Hai ricette

Le ricette sono una raccolta di ingredienti e le fasi da seguire per ottenere risultati.

2) Gli ingredienti hanno un nome e forse una categoria (»verdura«, »spezia«, »qualunque«)

Non vedo alcun luogo in cui l'ereditarietà entri in gioco.

Does it make sense to refactor to an inheritance hierarchy early on, or is that a violation of the YAGNI principle?

In questo caso non è in realtà una violazione di YAGNI. Ma non ha senso. Se vuoi tag sulle tue ricette, puoi inserire i tag. Se vuoi tag nei tuoi prodotti / ingredienti, inserisci i tag. Tutto qui.

A questo punto non vedo alcun motivo, perché una ricetta e un ingrediente dovrebbero ereditare da qualcosa di astratto che è taggable e / o rateable .

Per prima cosa, opterei per la soluzione semplice. Il tuo obiettivo è scrivere software, dove uno è in grado di raccogliere ricette, investire un minimo di sforzo per ottenere questo risultato.

Aggiungi feature per feature e ti renderai conto quando è il momento (cioè "abbastanza doloroso" per il refactoring.

I feel like TaggableRatableTriviaEntity is a pretty bad name.

Sì. È davvero. Ma non si dovrebbe pensare in termini di ereditarietà degli oggetti, ma più in termini di ereditarietà comportamentale - spesso chiamata ereditarietà interfaccia . Le interfacce forniscono solo un comportamento.

Diciamo che stai facendo Java, hai una classe Product che implementa Rateable e Taggable e eredita solo da Base , che fornisce i metadati (chi ha creato l'elemento, quando è stato modificato l'ultima volta ecc.)

Il problema con le gerarchie di ereditarietà è che, con livelli crescenti, la complessità aumenta.

Quindi fai un favore a te stesso e mantieni le cose semplici. Lasciare l'astrazione in un primo momento e aggiungere quando necessario.

    
risposta data 23.07.2016 - 16:14
fonte
0

A seconda della lingua, non è necessaria alcuna strategia di ereditarietà. Ad esempio, in Java definiresti un'interfaccia, in Objective-C definiresti un protocollo, includendo tutte le cose che una ricetta che gestisci avrebbe bisogno di essere gestita, e che altre cose che potresti gestire in futuro avrebbero bisogno di essere gestito

Qualsiasi nuova classe che si desidera gestire non deve essere correlata a una ricetta per ereditarietà, ma deve solo implementare l'interfaccia / supportare il protocollo.

    
risposta data 23.07.2016 - 14:56
fonte

Leggi altre domande sui tag