Eliminazione if else

di il
4 risposte

Eliminazione if else

Ciao, come procedereste per rendere questo codice più aperto al cambiamento? Mi viene solo in mente uno switch case
PROGRAM SelectLogger {
 input(log)
 if(log == 0) selectedLogger = createLogger0()
 else if(log == 1) selectedLogger = createLogger1()
 else if(log == 2) selectedLogger = createLogger2()
 else if(log == 3) selectedLogger = createLogger3()
 else if(log == 4) selectedLogger = createLogger4()
 else if(log == 5) selectedLogger = createLogger5()
 else selectedLogger = null
 output(selectedLogger)
}

4 Risposte

  • Re: Eliminazione if else

    Giuso ha scritto:


    Ciao, come procedereste per rendere questo codice più aperto al cambiamento? Mi viene solo in mente uno switch case
    Innanzitutto cosa è .. pseudo-codice?
    Cosa è log? Dove/chi lo assegna? La scelta di uno tra N logger come si vede lì è da fare in un solo punto o potenzialmente molti punti?
    Senza un po' di "contesto" è parecchio difficile ragionare e valutare ..
  • Re: Eliminazione if else

    Si è pseudo codice, nel senso che non mi viene dato il contesto specifico, ma solo da fare del Refactoring per eliminare quei if statements. Le tue stesse domande sinceramente me le son chieste anch'io, per questo mi risulta difficile capire cosa fare. Non mi serve un codice preciso comunque. Non so se sono nella sezione giusta per parlare di design pattern in Java, ma credo ne vada usato uno (forse abstract factory)
  • Re: Eliminazione if else

    Giuso ha scritto:


    Si è pseudo codice, nel senso che non mi viene dato il contesto specifico, ma solo da fare del Refactoring per eliminare quei if statements. Le tue stesse domande sinceramente me le son chieste anch'io, per questo mi risulta difficile capire cosa fare. Non mi serve un codice preciso comunque. Non so se sono nella sezione giusta per parlare di design pattern in Java, ma credo ne vada usato uno (forse abstract factory)
    Abstract-factory no, non credo. Si usa quando si vuole astrarre la creazione di "famiglie" di oggetti correlati/dipendenti tra di loro.
    Potrebbe forse bastare un metodo statico di "factory" ma senza una visione più chiara del contesto è difficile valutare.

    Se la scelta di quale logger creare dipende da una variabile (quel log, appunto) di tipo intero, stringa o cose del genere, allora uno switch o catena if-else-if generalmente serve.
    Lo si può evitare solo facendo dei design un pochino più ampi, del tipo:
    - tenere una Map in cui la chiave è quei valori 0, 1, ecc... e come valori ci sono oggetti che sono i logger stessi o oggetti che fanno da "factory" per ciascun logger
    - usare come tipo di selezione una enum (che può avere un comportamento specifico per ciascuna costante), così se si riceve uno dei suoi valori si può ottenere quel suo specifico logger
    - fare cose più articolate ad esempio con la "reflection", si fanno in una classe tanti metodi createLogger0(), createLogger1() ecc... e poi tramite reflection si cerca appunto il metodo a fronte del valore numerico

    Robe del genere. Ma sono tutte da valutare in un contesto più concreto e chiaro.
  • Re: Eliminazione if else

    Si potrebbe fare, però non mi sembra che queste soluzioni portino a un refactoring che, per come è definito, dovrebbe migliorare leggibilità, efficienza e facilità nel cambiamento del codice. Penso che da questo punto di vista sia molto più semplice uno switch case.
    L'unica idea che mi era venuta in mente era quella di inizializzare log come un oggetto di tipo Factory(astratta) e in SelectLogger richiamare la create di ciascuna Factory concreta che implementa quella astratta. Quindi ogni create avrebbe un suo comportamento. Però ci vorrebbero comunque 6 factory diverse.
Devi accedere o registrarti per scrivere nel forum
4 risposte