Come gestisco due algoritmi che sembrano uguali ma diversi?

1

Ho due algoritmi che condividono molti punti in comune. Uno esegue una procedura iterativa, l'altro esegue solo la prima iterazione. I risultati sono, ovviamente, diversi (una classe fornisce risultati che l'altro non può), così come l'impostazione (il processo iterativo richiede tolleranze e il numero massimo di iterazioni, che sono irrilevanti in quello non iterativo).

Dovrei avere una classe unica con ifs interni (come if (iterative) do this else do that ) o dovrei implementare due classi diverse (e potenzialmente inserire codice comune in un posto accessibile in modo che possa essere condiviso?) Cosa ne pensi?

    
posta Stefano Borini 21.01.2011 - 17:29
fonte

3 risposte

3

Sembra il modello di metodo dei modelli :

A template method defines the program skeleton of an algorithm. One or more of the algorithm steps can be overridden by subclasses to allow differing behaviors while ensuring that the overarching algorithm is still followed.

Ad esempio:

abstract class Base {
    void stepOne(Object item) {
        // Do some stuff on item...
    }

    void stepTwo(Object item) {
        // Do some stuff on item...
    }

    void stepThree(Object item) {
        // Do some stuff on item...
    }

    void allSteps(Collection<Object> data) {
        for (Object x : data) {
            stepOne(x);
            stepTwo(x);
            stepThree(x);
        }
    }
}

class SpecificOne extends Base {
    @Override
    void stepTwo(Object item) {
        // Do something different on item
    }
}

class SpecificTwo extends Base {
    @Override
    void allSteps(Collection<Object> data) {
        for (Object x : data) {
            // The order is altered
            stepThree(x);
            stepTwo(x);
            stepOne(x);
        }
    }
}

Quindi useresti i diversi algoritmi come questo:

public class TMTest {
    public static void main(String[] args) {
        Collection<Object> items = ...;

        Base one = new SpecificOne();
        Base two = new SpecificTwo();

        one.allSteps(items);
        two.allSteps(items);
    }
}
    
risposta data 21.01.2011 - 18:20
fonte
2

Sembra che la procedura stessa debba essere estratta e quindi avere due metodi diversi, uno che esegue le iterazioni e chiama quella procedura all'interno e l'altra che la chiama una sola volta.

Risposta al commento:

Ricorda Non ripeterti . Una delle parti più importanti dell'architettura è capire come organizzare il codice in modo che i metodi che hanno ancora parti simili abbiano parti simili separate in modo che possano essere condivise. Se sembrano eseguire lo stesso algoritmo ma con diversi parametri , questa è un'opportunità perfetta per un metodo (o, se ci sono più uscite, forse una classe).

    
risposta data 21.01.2011 - 17:31
fonte
1

Dai un'occhiata dal punto di vista dell'utente. Quando un utente di uno degli algoritmi avrà bisogno dell'altro? Quando un utente risolve un tipico problema per cui questi algoritmi si adattano bene, ha senso per lui passare da one-step a iterativo (o back) a seconda di alcune circostanze? Cioè, se dovessi semplicemente usare questi algoritmi, il parametro iterative avrebbe senso nel tuo lavoro quotidiano?

    
risposta data 21.01.2011 - 17:40
fonte

Leggi altre domande sui tag