Sto progettando una classe treeNode
. Durante l'implementazione dei metodi getPathToParentNode()
e getPathFromParentNode()
, ho notato che la loro funzionalità è essenzialmente la stessa: funzionano solo su strutture di dati differenti.
getPathToParentNode()
aggiunge ricorsivamente tutti i nodi principali in una coda , quindi crea il percorso utilizzando l'iteratore della coda.
getPathFromParentNode()
aggiunge ricorsivamente tutti i nodi principali in uno stack , quindi crea il percorso utilizzando lo stack iterator.
Per aderire al principio DRY, stavo pensando di estrarre il codice duplicato (aggiungendo ricorsivamente i genitori ad una collezione , e usando l'iteratore collection per generare il percorso) in una funzione separata, e passandogli una coda dalla prima funzione e una pila dalla seconda funzione.
// takes in a queue or a stack
// returns path to root node or path from root node respectively
List<ITreeNode<T>> getPath(Collection<ITreeNode<T>> pathCollection) {
pathCollection.add(this);
ITreeNode<T> parent = this.getParent();
pathCollection.add(parent);
while (parent.getParent() != null) {
pathCollection.add(parent.getParent());
}
return new ArrayList<ITreeNode<T>>(pathCollection);
}
Tuttavia, la funzione helper risultante non sembra corretta. Non penso che compia qualcosa di indipendente / vale la pena di giustificare la sua esistenza. Inoltre, il suo obiettivo cambia in base al tipo di raccolta che gli viene passato e, forse, come conseguenza di ciò, è difficile da nominare.
Un tale metodo è considerato "buono" alla luce dei principi del design orientato agli oggetti? Quale sarebbe un approccio migliore?
Modifica
Domanda simile riguardante l'estrazione del metodo in generale (ma le risposte non riguardano il mio caso specifico): Devo estrarre funzionalità specifiche in una funzione e perché?