Design Pattern: Algorithm varia in base agli argomenti di input

1

Darò un semplice esempio per aiutarti a capire la mia domanda. Supponiamo di avere un rettangolo e una classe di utilità con un metodo che crea un buffer attorno a una forma.

Il metodo .createBuffer ha richiesto e argomenti facoltativi:

  • richiesto: raggio

  • opzionale: direction (ad esempio "inside" o "outside", default è "outside")

... forse più argomenti ...

Ogni combinazione di argomenti richiede un algoritmo diverso.

Quale modello di progettazione è appropriato per risolvere problemi simili?

    
posta jorgeb 15.04.2014 - 17:46
fonte

2 risposte

3

Non mi è chiaro che hai bisogno di qualsiasi modello di progettazione - almeno non nel senso del libro "Gang of Four".

Dalla tua descrizione del problema:

Every combination of arguments needs a different algorithm

ciò di cui hai bisogno è un modo per ottenere da input - > uscita dove l'input è "combinazione di argomenti" e l'output è "algoritmo". Si tratta essenzialmente di una tabella hash (o di una funzione), in cui:

  • chiavi : alcune proprietà degli argomenti specifici presenti
  • valori : algoritmi (l'esatta implementazione potrebbe essere funzioni, oggetti, ecc. a seconda della lingua che stai usando e di quanto sia conveniente ogni scelta).

La seconda parte del problema - "Il metodo .createBuffer ha richiesto e argomenti facoltativi" - non è sufficientemente ben specificato per dare una risposta sicura e dipenderà anche dalla lingua scelta. Se la tua lingua supporta argomenti opzionali e valori predefiniti, questo problema si risolve quasi da solo:

def createBuffer(self, radius, direction="outside")
    ...

Se sei in Java, puoi usare i tipi di riferimento e controllare null , convertendoli in valori predefiniti dove necessario. O ancora meglio, prova questo - aiuta chiarisci la tua intenzione di utilizzare i tipi nullable ad altri programmatori!

public void createBuffer(float radius, Optional<Direction> direction) {
    if ( direction.isAbsent() ) {
        direction = new Direction("outside");
    }
    ....
}

Come altri hanno menzionato, potresti anche creare il pattern Builder, ma personalmente non lo farei a meno che non fossi sicuro di averne bisogno, perché un singolo metodo con una singola firma di tipo è più semplice e facile da usare.

    
risposta data 15.04.2014 - 19:39
fonte
0

Vorrei andare con un modello di builder. Dove shape è la forma da bufferare, 5 è il raggio richiesto, ho inventato altre cose che potresti volere che il tuo buffer abbia.

var bufferedShape = new BufferBuilder(shape, 5)
                     .Inside()
                     .SinglePixel()
                     .DropShadow(10)
                     .CreateBuffer();

Un po 'più di dettagli in questo post .

Modifica: il modello di build risolve la necessità di algoritmi diversi in quanto ogni chiamata ai diversi metodi della classe builder crea la classe di forma bufferizzata finale che sa come disegnare se stessa in base ai metodi chiamati durante la fase di costruzione. / p>     

risposta data 15.04.2014 - 18:10
fonte

Leggi altre domande sui tag