Una cosa a tener en cuenta es que el código se lee con frecuencia, a diferentes "profundidades". Este código:
PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE);
WakeLock wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "abc");
wakeLock.acquire();
es fácil de "descremar". Son 3 declaraciones. Primero se nos ocurre un PowerManager
. Entonces llegamos a un WakeLock
. Entonces nosotros acquire
los wakeLock
. Puedo ver eso fácilmente con solo mirar el comienzo de cada línea; las asignaciones de variables simples son realmente fáciles de reconocer parcialmente como "Tipo varName = ..." y solo se pasa por alto mentalmente el "...". De manera similar, la última declaración obviamente no es la forma de la tarea, sino que solo involucra dos nombres, por lo que la "esencia principal" es evidente de inmediato. A menudo, eso es todo lo que necesitaría saber si solo estuviera tratando de responder "¿qué hace este código?" a un nivel alto.
Si estoy persiguiendo un error sutil que creo que está aquí, entonces obviamente tendré que repasar esto con mucho más detalle, y realmente recordaré el "..." s. Pero la estructura de declaración separada todavía me ayuda a hacer esa declaración a la vez (especialmente útil si necesito profundizar en la implementación de las cosas que se llaman en cada declaración; cuando regreso, entiendo completamente "una unidad" y luego puede pasar a la siguiente declaración).
((PowerManager)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakelockTag")
.acquire();
Ahora es todo una declaración. La estructura de nivel superior no es tan fácil de leer; En la versión original del OP, sin saltos de línea y sangría para comunicar visualmente cualquier estructura, habría tenido que contar paréntesis para decodificarlo en una secuencia de 3 pasos. Si algunas de las expresiones de varias partes están anidadas entre sí en lugar de estar dispuestas como una cadena de llamadas a métodos, entonces podría parecer similar a esto, por lo que tengo que tener cuidado al confiar en eso sin contar paréntesis. Y si confío en la sangría y solo paso rápidamente a lo último como el supuesto punto de todo esto, ¿qué .acquire()
me dice por sí solo?
Sin embargo, a veces, eso puede ser lo que quieres. Si aplico su transformación a mitad de camino y escribí:
WakeLock wakeLock =
((PowerManeger)getSystemService(POWER_SERVICE))
.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLockTage");
wakeLock.acquire();
Ahora esto se comunica con un rápido vistazo "obtener un WakeLock
, luego acquire
". Incluso más simple que la primera versión. Es obvio de inmediato que lo que se adquiere es a WakeLock
. Si obtener el PowerManager
es solo un sub-detalle que es bastante insignificante hasta el punto de este código, pero wakeLock
es importante, entonces podría ayudar a enterrar el PowerManager
material, por lo que es natural pasarlo por alto si solo está tratando de obtener rápidamente un idea de lo que hace este código. Y no nombrar que se comunica que se sólo se utiliza una vez, ya veces eso es lo que es importante (si el resto del alcance es muy largo, tendría que leer todo eso para saber si alguna vez se volvió a usar; aunque usar sub-ámbitos explícitos puede ser otra forma de abordar eso, si su idioma los admite).
Lo que saca a relucir que todo depende del contexto y de lo que desea comunicar. Al igual que con la escritura en prosa en lenguaje natural, siempre hay muchas formas de escribir una determinada pieza de código que son básicamente equivalentes en términos de contenido de información. Al igual que con la escritura en prosa en lenguaje natural, la forma de elegir entre ellos generalmente no debería ser aplicar reglas mecanicistas como "eliminar cualquier variable local que solo ocurra una vez". Más bien cómoSi elige escribir su código, enfatizará ciertas cosas y desestimará otras. Debe esforzarse por tomar esas decisiones conscientemente (incluida la opción de escribir código menos legible por razones técnicas a veces), en función de lo que realmente desea enfatizar. Piensa especialmente en lo que servirá a los lectores que solo necesitan "entender la esencia" de tu código (en varios niveles), ya que eso sucederá con mucha más frecuencia que una lectura muy cercana de expresión por expresión.