Switch case per una condizione

1

Sto facendo una revisione del codice al momento su codice Java Java. Sto osservando una funzione in cui un programmatore ha deciso di utilizzare un'istruzione switch per racchiudere una singola condizione.

Sto considerando di fare un commento che questo dovrebbe essere un blocco se invece. Quali sono i tuoi pensieri, cosa faresti se vedessi questo in codice?

Sembra un caso in cui lo switch sarà sempre l'unico caso e non si espanderà mai oltre (a causa dei codici che circondano il contesto). Le parole corrette sarebbero che questo è il costrutto sbagliato per questo caso d'uso?

codice pseudo della funzione:

trackAnalyticsEvent()

  switch
    case is device not supported
      analytics->trackEvent(device type not supported)
      // No break or return

note: The core analytics code is actually handled elsewhere in the project. This a very specific single case inside a class with a specific focused usage.

    
posta Dave Thomas 16.03.2017 - 19:45
fonte

5 risposte

2

Il fatto che la funzione sia chiamata trackAnalyticsEvent mi sembra che farà qualcosa di più del semplice controllo. In ogni caso (gioco di parole) un caso non sarebbe rilevante dal momento che sarebbe solo un semplice scenario if-else.

    
risposta data 16.03.2017 - 21:18
fonte
3

Ci sono situazioni in cui oggi ho un caso, ma so che aggiungerò altri casi domani.

Ci sono situazioni in cui molte funzioni seguono lo stesso schema, alcune terminano con una dozzina di casi, alcuni terminano con un caso.

Entrambe sono situazioni in cui vorrei usare una dichiarazione di un caso.

    
risposta data 16.03.2017 - 22:00
fonte
1

Se questo è un aggiornamento intermedio in un'attività più grande, e ha un commento (con una data) che dice che più casi verranno aggiunti più tardi quando tale e-tale sarà pronto, quindi direi che è OK. Ad esempio, se prevedi di supportare diversi dispositivi hardware intercambiabili e ha solo scritto il codice per il primo fino ad ora, allora va bene.

Ma se non ci sono piani immediati per casi aggiuntivi, dovrebbe usare invece un blocco If.

Inoltre, se si tratta di una modifica al codice esistente, potrebbero essersi verificati diversi casi in precedenza e li ha condensati / refactati. In una situazione del genere, ha ottenuto buoni risultati consolidando il codice, ma ha trascurato il fatto che avrebbe dovuto cambiare l'opzione Passa a un caso in cui rimaneva solo un caso singolo, il che sarebbe una semplice svista da fare. Vorrei lasciare un commento del tipo "non dimenticare che, dopo aver rimosso gli altri casi, puoi anche semplificarlo in un'istruzione If". Questo ha la connotazione che è sulla strada giusta, quindi è più incoraggiante.

    
risposta data 17.03.2017 - 20:42
fonte
1

Un'istruzione switch e una catena di if s generano le stesse istruzioni a livello di macchina. Scegli l'uno o l'altro in base alla chiarezza del codice.

Hai zero guadagni sull'espressività (e io potrei dire che hai una perdita) se crei un switch con un singolo caso.

Hai anche zero guadagni sulla velocità di codifica nel caso in cui sai che "in futuro" ci saranno più casi, dal momento che non ci vorrà più di qualche secondo per trasformare il tuo if in un %codice%.

Alcune altre risposte ci dicono che un interruttore segnala che "questo potrebbe crescere". Questo semplicemente va contro SOLID, in quanto non rispetta Open-Closed Principle , perché se quel codice è pronto, l'unico modo per modificarne il comportamento è cambiarlo.

    
risposta data 17.03.2017 - 23:45
fonte
0

Direi che è una questione di contesto.

Sono perfettamente contento di vedere un interruttore o un if.

Ma, se vedo un interruttore, penserò che potrebbe crescere.

Se vedo un if, non penserò che questo potrebbe crescere.

Quindi: se è qualcosa che potrebbe crescere, è perfetto come interruttore (anzi, preferirei questo). Se è qualcosa che non lo farà, suggerirei di cambiarlo in un if.

Per lo meno, chiedi informazioni sull'intento alla base dell'interruttore del caso singolo.

Per inciso, non mi aspetto che anche lo sviluppatore più inesperto possa essere confuso da un singolo switch: lo userei come una buona lezione su come scrivere (e leggere) il codice informativo facendo riferimento al potrebbe crescere? treno di pensieri.

    
risposta data 17.03.2017 - 23:37
fonte

Leggi altre domande sui tag