L'ereditarietà parallela produce un codice buono?

3

Sto scrivendo un'interfaccia database in PHP e ho una classe base dbTables , oltre a una classe base dbTableFields .

dbTables ha una funzione, getFields() , che crea un'istanza di dbTableFields oggetti, ognuno dei quali contiene dati essenziali su ogni campo della tabella e lo inserisce in dbTableFields->fields=array();

dbTables ha diversi figli.

Ora mi sono reso conto che i bambini devono utilizzare diverse versioni di getFields() . Ma differiscono solo in un punto: hanno bisogno di istanziare dbTableFields figli, invece che dbTableFields oggetti.

Ho risolto questo problema. Ho approfittato della capacità di PHP di usare le variabili per rappresentare i nomi delle classi. Tutto quello che dovevo fare era, in dbTables->getFields() sostituire:

$this->fields = new dbTableFields();

con

$this->fields = new self::$field_model();

Dove self::$field_model = 'dbTableFields'; // string value for class

Ora, nelle classi figlie, devo semplicemente sovrascrivere la proprietà $field_model con il nome del% discendente appropriato di% deoenti.

Questo schema di ereditarietà parallela è una buona forma? O sto creando un pasticcio senza compromessi? Esiste un altro metodo più elegante e più manutenibile per ottenere lo stesso effetto?

    
posta Buttle Butkus 05.05.2012 - 10:24
fonte

2 risposte

3

Il principio che vuoi è "favorire la composizione sull'eredità". Questo è un esempio abbastanza classico di dove sarebbe utile lo schema della strategia: separa la logica "getFields" in diversi oggetti FieldStrategy e fai riferimento a quella appropriata per tuo padre e i tuoi figli.

Non lo sto spiegando molto bene, ma per favore google "modello di strategia" e gioca con esso.

    
risposta data 05.05.2012 - 20:38
fonte
1

NO, di solito.

Le gerarchie di ereditarietà parallele sono cattivo odore nel codice .

Ho sentito che Martin Fowler ha indicato questo come un odore di codice nel suo famoso libro "Refactoring: Improving the Design of Existing Code".

Tuttavia, non è qualcosa di assoluto. A volte la gerarchia dell'ereditarietà parallela può essere il miglior design tra le alternative che il tuo team potrebbe fornire.

Google con "Gerarchia di ereditarietà parallela". Chi sa che un design migliore potrebbe uscire!

    
risposta data 05.05.2012 - 20:45
fonte

Leggi altre domande sui tag