Come abbreviare la dichiarazione del caso da hades? [duplicare]

1

Sto refactoring il codice e ho raggiunto una dichiarazione switch terribilmente gigantesca. Ogni singolo metodo API disponibile per gli utenti finali è rappresentato come enum e abbiamo un'istruzione switch che itera sull'enumerazione e risponde a ogni possibile chiamata API.

Ogni singola opzione enum ha solo poche righe di codice. Qualsiasi comando sufficientemente complicato ottiene una chiamata al metodo che viene effettuata. Tuttavia, con così tante enumerazioni mai una mezza dozzina di righe per enum diventa piuttosto grande.

Qual è l'approccio corretto per rendere questo più pulito? Potrei scrivere un metodo unico per ogni comando, ma ho già spostato tutte le complicate funzionalità nelle loro classi. Avere un nuovo metodo per 4-5 linee di codice chiamato sempre solo una volta aggiunge davvero molta più pulizia al codice nel suo complesso?

Sembra piuttosto noioso creare metodi unici per tutti questi casi, e lo switch sarebbe comunque un po 'brutto anche se assegnasse solo due righe a ogni enum (metodo call and break). C'è un modo migliore per evitare completamente l'istruzione switch?

Come si potrebbe cercare di mantenere questo pulito?

ps. questo è in java, la programmazione funzionale non è chiaramente un'opzione.

    
posta dsollen 04.02.2014 - 22:43
fonte

3 risposte

5

Il mio consiglio sarebbe di lasciare bene da solo.

Un interruttore è il meccanismo di ramificazione più efficiente possibile, soprattutto quando è accoppiato con un enum.

Qualunque altra cosa produrrà un successo in termini di prestazioni.

Potrebbe valere la pena di scomporre il codice inline in metodi separati per la leggibilità (il compilatore JIT probabilmente si limiterà a ricollegarli di nuovo, quindi niente overhead).

Personalmente non trovo nulla di sbagliato con due o tre metodi di linea, se questo aiuta la leggibilità.

Inoltre, per motivi di leggibilità, potresti considerare di mettere ogni caso su una singola riga in questo modo: ----

switch {humungous_ENUM) {
    case OPTION_1:      exOption_1();            break;
    case OPTION_2:      exOption_2();            break;
     ......
    case OPTION_99:     exOption_99();           break;
    default:            exOption_error();   
}
    
risposta data 06.02.2014 - 06:49
fonte
4

Questo proviene da una prospettiva C #, ma quello che farei in questo caso è il seguente:

  1. Rifatta tutti i "piccoli bit di codice" in metodi separati.
  2. Crea un dizionario che è inserito nell'enumerazione e che contiene un delegato di azione (un delegato che restituisce void ed è senza parametri).
  3. Crea un metodo che aggiunge ciascuna coppia enum / delgate al dizionario.
  4. Utilizza il dizionario come ricerca per eseguire il codice corretto.

E per gli utenti più avanzati:

  • Crea un attributo che prende il valore enum come parametro. Al caricamento, riflettere sull'assieme e aggiungere automaticamente ogni coppia di valori / metodi di enumerazione al dizionario (ciò salverà su tutto il codice "aggiunta al dizionario").
risposta data 04.02.2014 - 23:47
fonte
2

Dici che ogni case nella tua grande switch corrisponde a un metodo API pubblico (anche pubblicato?). Da ciò deduco che le chiamate a quei metodi dell'API sono, in realtà, chiamate ad alcune funzioni comuni con il parametro enum corrispondente. Presumo anche che tu abbia la possibilità di cambiare questa interfaccia API pubblica.

Non ha importanza la dimensione di questi metodi; se sono indipendenti, dovrebbero essere isolati in funzioni pubbliche separate. Questo è vero per i metodi che implementano un comportamento non correlato ed è ortogonale alla loro implementazione in sé (quelle classi che hai menzionato per avere tutte le cose complicate). Una cosa diversa è avere diversi metodi con un comportamento simile, nel qual caso potrebbe essere aggiunto un singolo metodo parametrico. La principale linea guida per ridurre la quantità di funzioni pubbliche eviterebbe la duplicità del comportamento su di loro.

Ultimo, ma non meno importante, prova a raggruppare i metodi semanticamente correlati (magari usando le classi statiche), in modo da introdurre qualche struttura nell'array di funzioni altrimenti piatto.

    
risposta data 04.02.2014 - 23:28
fonte

Leggi altre domande sui tag