Metodi che tengono conto di tutti gli input al metodo

0

Questa è più una domanda concettuale. Diciamo che hai avuto la seguente enumerazione

public enum FooEnum {
    ALPHA,
    BETA,
    GAMMA,
    DELTA;
}

E diciamo che hai il seguente metodo:

public void doSomething(FooEnum value) {
    if (value == FooEnum.ALPHA) {
        // print something to the console
    }
    // other values ignored
}

Ora, questo esempio mi sembra un po 'strano, poiché stiamo completamente ignorando ogni altro valore di FooEnum . Pensa che non si limiti solo alle enumerazioni, ma diciamo qualcosa di simile

public class Person {

    public void doSomething(String s) {
        if (s.equals("asdf") {
            System.out.println("something");
        }
        // disregard all other values
    }
}

Per me sembra che dovremmo almeno fare qualcosa riguardo ad altri valori che non ci interessano. Ho spesso fatto una convalida dell'input in anticipo per ottenere qualcosa come

public void doSomething(String s) {
    if (s == null) {
        throw new IllegalArgumentException();
    }
    // do stuff
}

ma cosa succede in questo esempio

public void doSomething(FooEnum value) {
    if (value == null) {
        throw new IllegalArgumentException();
    }
    if (value == FooEnum.ALPHA) {
        // do something ALPHA specific
    }
    // ignore other logically grouped values in FooEnum
}

Quali sono (o sono alcuni) i modi suggeriti per evitare / refactare questo? Il modo principale a cui potrei pensare è di registrare che è stato intenzionalmente ignorato. Quali altri modelli potrebbero essere utilizzati.

    
posta Zymus 28.02.2015 - 03:54
fonte

1 risposta

1

Penso che tu stia cercando 2 cose, ma io ha risposto a questa domanda qualche tempo fa

Questo è un chiaro esempio del Pattern di comando

Fondamentalmente va così:

  1. Cerca la cosa da fare
  2. Fallo

Se usi una mappa di default (ci sono implementazioni in giro), nel caso in cui il comando non sia stato trovato, puoi fare il default che può usare Null Object Pattern

Per quanto riguarda la parte sulla convalida: il controllo delle precondizioni è un modo così semplice ma efficace per eliminare bug che ha la sua specifica Java JSR 303 . Quella specifica ti permette di fare qualcosa di simile:

public void doSomething(@NotNull String name, @Range(min = 0, max = 125) int age) {

}

e l'infrastruttura integrata nell'ambiente di esecuzione del tuo codice genererà eccezioni per te se queste precondizioni falliscono.

Oh, a proposito: Ada è stato in grado di fare questo genere di cose decenni fa.

    
risposta data 01.03.2015 - 19:11
fonte