Si te sentiste obligado a expandir un trazador de líneas como
a = F(G1(H1(b1), H2(b2)), G2(c1));
No te culpo. Eso no solo es difícil de leer, es difícil de depurar.
¿Por qué?
- Es denso
- Algunos depuradores solo resaltarán todo de una vez
- Está libre de nombres descriptivos.
Si lo expandes con resultados intermedios obtienes
var result_h1 = H1(b1);
var result_h2 = H2(b2);
var result_g1 = G1(result_h1, result_h2);
var result_g2 = G2(c1);
var a = F(result_g1, result_g2);
y aún es difícil de leer ¿Por qué? Resuelve dos de los problemas e introduce un cuarto:
Es denso
Algunos depuradores solo resaltarán todo de una vez
- Está libre de nombres descriptivos.
- Está lleno de nombres no descriptivos
Si lo expande con nombres que agreguen un significado semántico nuevo, bueno, ¡incluso mejor! Un buen nombre me ayuda a entender.
var temperature = H1(b1);
var humidity = H2(b2);
var precipitation = G1(temperature, humidity);
var dewPoint = G2(c1);
var forecast = F(precipitation, dewPoint);
Ahora al menos esto cuenta una historia. Soluciona los problemas y es claramente mejor que cualquier otra cosa que se ofrezca aquí, pero requiere que se te ocurran los nombres.
Si lo hace con nombres sin sentido como result_this
y result_that
porque simplemente no puede pensar en buenos nombres, entonces realmente preferiría que nos ahorre el desorden de nombres sin sentido y lo expanda usando un buen espacio en blanco:
int a =
F(
G1(
H1(b1),
H2(b2)
),
G2(c1)
)
;
Es igual de legible, si no más, que el que tiene nombres de resultados sin sentido (no es que estos nombres de funciones sean tan geniales).
Es denso
Algunos depuradores solo resaltarán todo de una vez
- Está libre de nombres descriptivos.
Está lleno de nombres no descriptivos
Cuando no se te ocurren buenos nombres, es tan bueno como parece.
Por alguna razón, a los depuradores les encantan las nuevas líneas, por lo que debería encontrar que depurar esto no es difícil:
Si eso no es suficiente, imagine que G2()
se llamó en más de un lugar y esto sucedió:
Exception in thread "main" java.lang.NullPointerException
at composition.Example.G2(Example.java:34)
at composition.Example.main(Example.java:18)
Creo que es bueno que, dado que cada G2()
llamada estaría en su propia línea, este estilo lo lleva directamente a la llamada infractora en general.
Por lo tanto, no use los problemas 1 y 2 como excusa para seguir con el problema 4. Use buenos nombres cuando pueda pensar en ellos. Evite nombres sin sentido cuando no pueda.
Lightness Races en el comentario de Orbit señala correctamente que estas funciones son artificiales y tienen nombres muy pobres. Así que aquí hay un ejemplo de cómo aplicar este estilo a algún código de la naturaleza:
var user = db.t_ST_User.Where(_user => string.Compare(domain,
_user.domainName.Trim(), StringComparison.OrdinalIgnoreCase) == 0)
.Where(_user => string.Compare(samAccountName, _user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase) == 0).Where(_user => _user.deleted == false)
.FirstOrDefault();
Odio mirar ese flujo de ruido, incluso cuando no es necesario ajustar las palabras. Así es como se ve bajo este estilo:
var user = db
.t_ST_User
.Where(
_user => string.Compare(
domain,
_user.domainName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(
_user => string.Compare(
samAccountName,
_user.samAccountName.Trim(),
StringComparison.OrdinalIgnoreCase
) == 0
)
.Where(_user => _user.deleted == false)
.FirstOrDefault()
;
Como puede ver, descubrí que este estilo funciona bien con el código funcional que se mueve en el espacio orientado a objetos. Si puedes encontrar buenos nombres para hacer eso en un estilo intermedio, entonces tienes más poder para ti. Hasta entonces estoy usando esto. Pero en cualquier caso, por favor, encuentre alguna forma de evitar nombres de resultados sin sentido. Hacen que me duelan los ojos.