Come rendere il mio codice decidere quale classe istanziare in base a un parametro?

1

Ho un sistema in cui eseguirò le query su un database. Desidero Query1, Query2 e Query3 per utilizzare gli stessi metodi nel loro percorso verso il livello di origine dati.

Per farlo vorrei fare qualcosa di simile a Strategia o Template Pattern, dove ho una parte del codice che è un comportamento predefinito per tutte le query (raggiungendo il livello del database, connessione, esecuzione della query e così via) e una parte variabile (costruendo la query stessa).

Penso che questa idea sia buona e fattibile. Ricevo un parametro dal client che specifica la query da costruire, lo costruisco ed eseguo. L'unica domanda è: dato questo parametro, come posso decidere quale metodo chiamare per costruire la query? Questa è la mia soluzione attuale: (questa soluzione è un modello?)

public Query QueryFactory(string queryIdentifier){
   if(queryIdentifier == "query1")
      return BuildQuery1();
   else if(queryIdentifier == "query2")
      return BuildQuery2(); 
}

Funziona, ma non penso che sia abbastanza "carino", mi piacerebbe qualcosa di più bello. Sarebbe perfetto se non richiedesse allo sviluppatore di aggiungere una nuova istruzione if quando ha creato una nuova query. C'è un modo per migliorare questa catena if / else? E rendere questa decisione automatica?

Modifica: Il problema che voglio risolvere è: ho delle query che verranno chiamate contro un database. Voglio avere lo stesso flusso in modo da non avere codice duplicato per le query a cui non è stata applicata alcuna logica di business (ad esempio: ottenere tutti gli utenti, ottenere tutti gli studenti e così via)

    
posta JSBach 16.04.2014 - 01:06
fonte

1 risposta

2

Come afferma Steve Evers, utilizzando un'enumerazione come chiave e una classe da istanziare (o un'istanza di Query pre-costruita) da restituire. Se non ti piace il modello if / else, so che Java ha implementazioni Map, di cui l'EnumMap sarebbe una buona scelta (dove ottimizza l'utilizzo di Enumerazioni come valori chiave nella mappa.

Quindi il tuo codice ha un aspetto simile a

public Query QueryFactory(QueryType type){
   return localMap.get(type);
}

Partendo dal presupposto che si definisce un'enumerazione denominata QueryType e la propria localMap contiene le istanze Query appropriate per ciascun tipo.

Se non volevi effettuare un'istanziazione preliminare delle query, il codice userebbe la mappa per memorizzare la classe, il che consentirebbe di istanziare l'oggetto in quel momento

public Query QueryFactory(QueryType type){
   Class queryClass = localMap.get(type);
   return (Query) queryClass.newInstance();
}

Ancora una volta, tutto questo utilizza Java come esempio. Ho appena realizzato che non hai menzionato quale lingua. Ma può essere ripulito come preferisci.

    
risposta data 16.04.2014 - 03:23
fonte

Leggi altre domande sui tag