È meglio chiamare una funzione che non ha un effetto in quel punto, SE migliora la chiarezza del codice?

60

Ho tre visualizzazioni nel mio programma (app per iOS). Solo uno di essi è sempre attivo allo stesso tempo, quindi ho impostato la visibilità su due di essi e ho cambiato la visibilità mentre l'utente preme i pulsanti. Le viste sono inizializzate come visibili, quindi ho impostato la visibilità su codice prima che la vista principale mostri.

Posso fare

[view1 setAlpha:0.0f];
[view2 setAlpha:0.0f];

per due delle viste, ma ora il terzo (quello che dovrebbe essere visibile all'inizio dell'app) non è indirizzato. Ho messo un

[view3 setAlpha:1.0f];

dopo i primi due, perché penso che sia chiaro che ci sono in realtà tre viste, non due come si potrebbe pensare vedendo il codice. Come fanno gli altri programmatori a fare questo? E 'puramente preferenziale o ci sono delle convenzioni?

Se la chiamata è molto pesante, è ovviamente meglio non chiamarla quando non è necessario, ma mi chiedevo cose piccole come il mio esempio.

    
posta Kevin 17.08.2015 - 09:55
fonte

4 risposte

134

Hai un invariante:

Only a single view (out of 3) is ever active (and visible).

Quindi, ti suggerisco di fornire una funzione per cambiare l'attività e la visibilità di TUTTE le viste contemporaneamente:

[setActiveView viewID:2]

Questa funzione:

  • controlla se la vista è già attiva, evitando il lavoro non necessario
  • imposta la vista come attiva e visibile
  • imposta le altre 2 viste come inattive e invisibili

Offre numerosi vantaggi rispetto a una chiamata non elaborata a setVisibility :

  • friendly: chiamarlo inutilmente non crea un problema di prestazioni
  • difensivo: il suo singolo parametro è molto più difficile da neutralizzare, mentre per setVisibility è più difficile ricordare che l'intervallo di valori è 0.0f - 1.0f e che solo uno deve essere impostato su 1.0f
  • resiliente: il prossimo ragazzo non può dimenticare per errore una delle viste
  • adattabile: l'aggiunta / rimozione di una vista non richiede la verifica approfondita di tutto il codice dell'applicazione per trovare dove sono gli switch, è necessario aggiornare una singola funzione (questa)

Idealmente, per aiutare a rafforzare l'invariante, nessuna altra funzione dovrebbe essere in grado di rovinare questa impostazione ...

    
risposta data 17.08.2015 - 11:48
fonte
12

Idea alternativa: se il tuo obiettivo è impedire che si verifichino dei bug perché le persone dimenticano che ci sono tre viste e fare qualcosa con solo due di esse che dovrebbero davvero fare con tutte loro, quindi creare una funzione che renda impossibile da dimenticare:

setViewVisibilities(0.0f, 0.0f, 1.0f)

Ora hai qualcosa di molto più potente - tempo di compilazione ti garantisce che non hai dimenticato . Se dimentichi un parametro, il compilatore ti urlerà contro. Questo è molto più utile dei commenti o del codice non necessario, poiché crea un protocollo con un nome rigoroso che impone la proprietà che ti interessa.

Per il caso in cui view3 non ha bisogno della sua visibilità modificata, potresti aggiungere un comportamento in cui il passaggio di un valore speciale come -1.0 o nil o qualcosa lungo quelle righe significa "non modificare la visibilità della vista affatto". Questo aggira il problema di impostare le visioni inutilmente.

    
risposta data 17.08.2015 - 10:58
fonte
8

Credo che aggiungere un commento che spieghi che la chiamata non è necessaria (e perché) è la migliore.

(forse, il fatto che una chiamata non sia necessaria, o che tu abbia bisogno di un commento al riguardo, potrebbe essere un odore di codice)

    
risposta data 17.08.2015 - 09:56
fonte
4

In questo caso particolare, @Mattieu M. ha la soluzione giusta.

Nel caso più generale, in cui non esiste una trasformazione simile, devi chiedertelo: c'è una possibilità qualsiasi che un programmatore futuro possa rovinarlo?

La risposta è di solito sì. Il che significa, sì, dovresti aggiungere la chiamata. Forse alcune versioni future del framework iniziano con tutte le viste OFF anziché ON.

    
risposta data 18.08.2015 - 09:29
fonte

Leggi altre domande sui tag