Devo estrarre il metodo per ridurre la duplicazione se la funzionalità del metodo risultante varierà in base al tipo di raccolta dati?

1

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é?

    
posta Hassaan 13.07.2017 - 09:46
fonte

1 risposta

2

Potresti aver entrambi implementato con un DQueue e utilizzare semplicemente un selettore di fine per determinare se è usato FIFO o FILO, (First In First Out = Coda, First In Last Out = Stack). Quindi le due funzioni diventerebbero una singola con un identificatore di direzione. Molto più semplice e senza bisogno di specificatori di template.

    
risposta data 13.07.2017 - 09:59
fonte

Leggi altre domande sui tag