Una cosa da notare è che il codice viene letto frequentemente, a "profondità" diverse. Questo codice:
PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc");
wakeLock.acquire();
è facile "scremare". Sono 3 affermazioni. Per prima cosa ci viene in mente un PowerManager
. Quindi arriviamo a WakeLock
. Poi abbiamo acquire
la wakeLock
. Posso vederlo davvero facilmente solo guardando l'inizio di ogni riga; le assegnazioni di variabili semplici sono davvero facili da riconoscere parzialmente come "Digitare varName = ..." e sfiorare mentalmente il "...". Allo stesso modo l'ultima affermazione non è ovviamente la forma del compito, ma coinvolge solo due nomi, quindi la "sostanza principale" è immediatamente evidente. Spesso è tutto ciò che avrei bisogno di sapere se stavo solo cercando di rispondere "cosa fa questo codice?" a un livello elevato.
Se sto inseguendo un bug sottile che penso sia qui, allora ovviamente dovrò andare su questo in modo molto più dettagliato e in realtà ricorderò i "...". Ma la struttura separata delle istruzioni mi aiuta ancora a fare quella frase alla volta (particolarmente utile se ho bisogno di approfondire l'implementazione delle cose chiamate in ogni dichiarazione; quando torno ho capito perfettamente "un'unità" e può quindi passare all'istruzione successiva).
((PowerManager)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag")
.acquire();
Ora è tutta una frase. La struttura di livello superiore non è così facile da leggere; nella versione originale dell'OP, senza interruzioni di riga e rientri per comunicare visivamente qualsiasi struttura, avrei dovuto contare le parentesi per decodificarlo in una sequenza di 3 passaggi. Se alcune delle espressioni multiparte sono nidificate l'una nell'altra anziché disposte come una catena di chiamate di metodo, allora potrebbe comunque apparire simile a questo, quindi devo stare attento a fidarmi di ciò senza contare le parentesi. E se mi fido del rientro e guardo avanti fino all'ultima cosa come il punto presunto di tutto ciò, cosa .acquire()
mi dice da solo?
A volte, però, può essere quello che vuoi. Se applico la trasformazione a metà strada e scrivo:
WakeLock wakeLock =
((PowerManeger)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLockTage");
wakeLock.acquire();
Ora questo comunica a una breve scrematura "prendi a WakeLock
, allora acquire
". Ancora più semplice della prima versione. È immediatamente ovvio che la cosa acquisita è a WakeLock
. Se ottenere il PowerManager
è solo un sotto-dettaglio che è abbastanza insignificante fino al punto di questo codice, ma wakeLock
è importante, allora potrebbe effettivamente aiutare a seppellire la PowerManager
roba quindi è naturale passarci sopra se stai solo cercando di ottenere rapidamente un idea di cosa fa questo codice. E non nominando, comunica che viene usato solo una volta, e talvolta lo è ciò che è importante (se il resto dell'ambito è molto lungo, dovrei leggere tutto questo per dire se è mai stato usato di nuovo; sebbene l'uso di sotto-ambiti espliciti possa essere un altro modo per affrontarlo, se la tua lingua li supporta).
Il che fa capire che tutto dipende dal contesto e da cosa vuoi comunicare. Come per la scrittura di prosa in linguaggio naturale, ci sono sempre molti modi per scrivere una determinata parte di codice che sono sostanzialmente equivalenti in termini di contenuto informativo. Come con la scrittura in prosa in linguaggio naturale, come si sceglie tra di loro dovrebbero generalmente non essere quello di applicare regole meccanicistiche come "eliminare ogni variabile locale che si verifica solo una volta". Piuttosto comescegli di scrivere il tuo codice enfatizzerà alcune cose e ne de-enfatizzerà altre. Dovresti sforzarti di fare queste scelte consapevolmente (inclusa la scelta di scrivere codice meno leggibile per motivi tecnici a volte), in base a ciò che vuoi davvero sottolineare. Pensa in particolare a ciò che servirà ai lettori che hanno solo bisogno di "capire il codice" del tuo codice (a vari livelli), dal momento che ciò accadrà molto più spesso di una lettura espressione per espressione molto ravvicinata.