Una cosa da notare è che il codice viene letto frequentemente, a diverse "profondità". Questo codice:
PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc");
wakeLock.acquire();
è facile da "sfiorare". Sono 3 dichiarazioni. Per prima cosa abbiamo un PowerManager
. Quindi arriviamo a WakeLock
. Quindi acquire
wakeLock
. Lo capisco molto facilmente osservando l'inizio di ogni riga; semplici assegnazioni di variabili sono davvero facili da riconoscere in parte come "Tipo varName = ..." e solo mentalmente sfiorano il "...". Allo stesso modo l'ultima affermazione non è ovviamente la forma del compito, ma coinvolge solo due nomi, quindi la "sintesi principale" è immediatamente evidente. Spesso è tutto ciò che avrei bisogno di sapere se stavo solo cercando di rispondere "cosa fa questo codice?" ad un livello elevato.
Se sto inseguendo un bug sottile che penso sia qui, ovviamente dovrò approfondire questo aspetto in modo molto più dettagliato, e in realtà ricorderò i "..." s. Ma la struttura dell'istruzione separata mi aiuta ancora a fare quell'unica affermazione alla volta (particolarmente utile se devo approfondire l'implementazione delle cose che vengono chiamate in ogni affermazione, quando torno indietro ho capito perfettamente "una sola unità" e può quindi passare alla successiva dichiarazione).
((PowerManager)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag")
.acquire();
Ora è tutta una dichiarazione. La struttura di livello superiore non è così facile da leggere; nella versione originale dell'OP, senza interruzioni di riga e rientranza 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 dentro l'altra piuttosto che disposte come una catena di chiamate di metodo, allora potrebbe ancora apparire simile a questa, quindi devo fare attenzione a fidarmi di ciò senza contare le parentesi. E se mi fido della rientranza e sfiora l'ultima cosa come il punto presunto di tutto ciò, cosa mi dice .acquire()
da solo?
A volte però, può essere quello che vuoi. Se applico la tua trasformazione a metà strada e ho scritto:
WakeLock wakeLock =
((PowerManeger)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLockTage");
wakeLock.acquire();
Ora questo comunica con una rapida panoramica "ottieni un WakeLock
, poi acquire
it". Ancora più semplice della prima versione. È immediatamente evidente che la cosa acquisita è una WakeLock
. Se ottenere il PowerManager
è solo un sub-dettaglio che è alquanto insignificante al punto di questo codice, ma wakeLock
è importante, quindi potrebbe effettivamente aiutare a seppellire il PowerManager
roba quindi è naturale scorrerlo sopra se stai solo cercando di farti un'idea di cosa fa questo codice. E non nominare comunica che è usato solo una volta, e qualche volta questo è ciò che è importante (se il resto dello scope è molto lungo, dovrei leggere tutto ciò che per dire se è mai usato di nuovo, anche se l'utilizzo di sotto-ambiti espliciti può essere un altro modo per affrontarlo, se la lingua li supporta).
Il che dimostra che tutto dipende dal contesto e da ciò che si desidera comunicare. Come per la scrittura di prosa in linguaggio naturale, ci sono sempre molti modi per scrivere un dato pezzo di codice che sono sostanzialmente equivalenti in termini di contenuto informativo. Come con la scrittura di prosa in linguaggio naturale, in genere la scelta tra loro dovrebbe non essere applicare regole meccanicistiche come "eliminare qualsiasi variabile locale che si verifica una volta sola". Piuttosto come scegli di scrivere il tuo codice metterà in risalto alcune cose e de-enfatizzerà gli altri. Dovresti sforzarti di fare consapevolmente queste scelte (inclusa la scelta di scrivere codice meno leggibile per motivi tecnici, a volte), in base a ciò che in realtà vuoi sottolineare. Pensa soprattutto a ciò che servirà ai lettori che hanno solo bisogno di "ottenere il succo" del tuo codice (a vari livelli), poiché ciò avverrà molto più spesso di una lettura di espressioni per espressione molto ravvicinata.