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 "skim". Son 3 declaraciones. Primero se nos ocurre un PowerManager
. Luego se nos ocurre un WakeLock
. Entonces nosotros acquire
el wakeLock
. Puedo ver eso realmente fácilmente solo mirando el comienzo de cada línea; las asignaciones de variables simples son realmente fáciles de reconocer parcialmente como "Escriba varName = ..." y simplemente repasar mentalmente el "...". De manera similar, la última afirmación obviamente no es la forma de la asignación, pero solo involucra dos nombres, por lo que la "esencia principal" es inmediatamente aparente. A menudo, eso es todo lo que necesito saber si estuviera tratando de responder "¿qué hace este código?" a un nivel alto.
Si estoy persiguiendo un error sutil que creo que está aquí, obviamente, tendré que repasar esto con mucho más detalle, y realmente recordaré los "..." s. Pero la estructura de sentencias por separado aún me ayuda a hacer esa enunciación a la vez (especialmente útil si necesito profundizar en la implementación de las cosas a las que se llama en cada enunciado; cuando vuelvo, 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 por encima; en la versión original del OP, sin saltos de línea ni sangría para comunicar visualmente cualquier estructura, habría tenido que contar paréntesis para decodificarla en una secuencia de 3 pasos. Si algunas de las expresiones de varias partes están anidadas una dentro de la otra en lugar de organizarse como una cadena de llamadas a métodos, entonces aún podría parecer similar a esto, así que debo tener cuidado al confiar en eso sin contar los paréntesis. Y si realmente confío en la muesca y simplemente me dirijo a la última cosa como el supuesto punto de todo esto, ¿qué me dice .acquire()
por sí solo?
Aunque a veces, eso puede ser lo que quieras. Si aplico tu 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 a un rápido skim "obtener un WakeLock
, luego acquire
it". Incluso más simple que la primera versión. Es inmediatamente obvio que lo que se adquiere es un WakeLock
. Si obtener el PowerManager
es solo un sub-detalle que es bastante insignificante hasta el punto de este código, pero el wakeLock
es importante, entonces en realidad podría ayudar a enterrar el PowerManager
por lo que es natural echarle un vistazo si solo estás tratando de obtener rápidamente una idea de lo que hace este código. Y al no nombrarlo, se comunica que se solo se usa una vez, y a veces 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 usa de nuevo, aunque el uso de sub-ámbitos explícitos puede ser otra forma de solucionarlo, si su idioma los admite).
Lo que hace que todo dependa del contexto y de lo que quieras comunicar. Al igual que con escribir prosa en lenguaje natural, hay siempre 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 no aplicar reglas mecanicistas como "eliminar cualquier variable local que solo ocurra una vez". Más bien, cómo elige escribir su código enfatizará ciertas cosas y desestimar otras. Debería esforzarse por tomar esas decisiones conscientemente (incluida la opción de escribir un código menos legible por razones técnicas a veces), en función de lo que realmente desea enfatizar. Especialmente piense en qué servirá a los lectores que solo necesitan "obtener la esencia" de su 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.