2009-09-28 12 views
5

A volte mi ritrovo con una gerarchia di classi in cui ho una classe base astratta con alcune funzionalità comuni e un paio di classi di implementazione che rientrano in due (raramente più) gruppi che voglio trattare in modo diverso in alcuni casi. Un esempio potrebbe essere una classe di nodo dell'albero astratto e diverse implementazioni di rami e foglie in cui voglio distinguere rami e foglie in qualche punto.È codicile avere classi vuote nel mezzo di una gerarchia di classi?

Queste classi intermedie vengono quindi utilizzate solo per le istruzioni "is-a" nel controllo di flusso e non contengono alcun codice, anche se ho avuto casi in cui hanno "sviluppato" del codice in un secondo momento.

Ti sembra maleodorante? Nell'esempio del mio albero, un'alternativa sarebbe quella di aggiungere /isBranch() metodi astratti alla classe base e implementare quelli nelle classi intermedie, ma non sembrava che fosse meglio per me, davvero, a meno che non intendessi avere classi che potrebbero essere più cose contemporaneamente.

+0

+1 bello esporre te stesso :-) – KLE

+0

@KLE :-) Beh, grazie per essere il mio pubblico.Ho lavorato per me quasi tutta la mia carriera e a volte può essere difficile ottenere opinioni esterne. –

+0

@Hanno Beh, stai andando alla grande, non preoccuparti. Vai avanti così. Sono davvero impressionato dalle tue 158 domande! ;-) – KLE

risposta

1

In generale, classi vuote sono un odore di codice.

Sono d'accordo che i tuoi metodi isLeaf o isBranch sono un'alternativa corretta. Essi aggiungono informazioni sugli oggetti, che è utile. (Questo perché, in super classe, non è possibile esprimere che le sottoclassi sono "o foglia o ramo").


I due metodi con risultati opposti potrebbe anche essere considerato come duplicazione del codice.

Si potrebbe usare solo uno ... Ma io consiglio di restituire un valore numerato LEAF o BRANCH.

2

Sì, le gerarchie di ereditarietà profonda sono un odore di codice in ogni caso.

0

Una classe che non contiene alcun codice è sicuramente un codice-odore ....

4

Per me, l'uso di test "is-a" nel controllo del flusso è altrettanto puzzolente quanto l'uso di switch/case. In un buon design OO, nessuno dei due è necessario.

+0

Sono d'accordo, questo è il problema più critico. –

+2

+1 Sono d'accordo. Anche se questo tipo di design non OO potrebbe essere usato temporaneamente prima del refactoring, o potrebbe anche essere usato se una classe diversa dovesse avere un aspetto (separando le responsabilità). ** Trovare l'esatto equilibrio delle gerarchie di classi è di solito un processo difficile ed evolutivo **. – KLE

+0

Sono d'accordo al 100 percento. Non posso dirti quanti argomenti sono stato in merito alle dichiarazioni switch non sono buone OO. –

2

Sì, sicuramente un odore di codice: non codificare queste classi vuote a meno che non siate pronti a scrivere quel codice. Pensa a YAGNI (non ne avrai bisogno) - non farlo se non ne hai già bisogno.

Inoltre, avete considerato casi in cui queste classi sono solo lì per fornire metodi astratti, o per raggrupparli in base alle capacità in termini di metodi o proprietà?

Se è questo il caso, forse ciò di cui hai veramente bisogno sono le interfacce, non altre classi astratte?

+0

Grazie per i suggerimenti aggiuntivi. I casi di cui sto parlando, tuttavia, le interfacce non mi aiuterebbero. –

0

Sembra giusto per me, se hai intenzione di inserire nuove funzionalità in seguito.

In caso contrario, un enumerazione viene generalmente utilizzata qui.

- Modifica

Anche se devo concordare con Ber, che non si dovrebbe in genere utilizzare 'è-un' comunque.

Problemi correlati