Dragon Ball Clean code - Distinciones con sentido
En Clean Code de Robert C. Martin se nos recomienda encarecidamente nombrar de forma correcta clases, funciones, variables…
En ocasiones nos encontramos con múltiples variables o funciones que continenen o hacen cosas parecidas y sin pensarlo mucho les damos nombres similares, demasiado similares:
getGod()
getGods()
getGodList()
getGodInfo()
getGodData()
getGodObject()
getTheGod()
getAGod()
En Dragon Ball hay Dioses para todos los gustos:
- El Dios de la Tierra (que es un extraterrestre de color verde)
- El Dios del cuadrante Norte del Universo (Kaito de toda la vida)
- El Dios de Dioses (Dios de los 4 dioses de los 4 cuadrantes)
- Los Dioses supremos (los Kaioshin y sus pendientes Pothala)
- Hay distintos rangos de Kaioshins y los hay especializados como la Kaioh del Tiempo
- Dioses de la destrucción (uno por cada Universo!)
- Luego están los Ángeles que vigilan a los Dioses de la destrucción, que no son dioses, pero están ahí a ahí
- Y por supuesto Zen O sama, literalmente El Dios de Todo.
Podríamos decir que están cerca de sufrir una KamisamaOverflowException
, pero a las excepciones llegaremos en otro post.
¿Qué problema hay con las funciones descritas anteriormente?
La nomenclatura no es errónea persé, pero si las combinas todas sí empiezas a tener un problema.
- ¿Qué diferencia a
getGod()
degetGodObject()
? - ¿Qué diferencia a
getGodInfo()
degetGodData()
? - ¿Qué diferencia a
getGods()
degetGodList()
? - ¿Qué diferencia a
getTheGod()
degetAGod()
?
Con la información que tenemos ahora mismo, es imposible saberlo, habría que ir al detalle de implementación a descubrirlo.
Y AHI ESTÁ LA CUESTIÓN!!!
Cuando desarrollamos, hemos hecho el modelo de datos nuestro y lo tenemos todo en nuestra cabeza, sabemos perfectamente que godInfo
y godData
son cosas totalmente distintas que, getGodList()
nos devuelve un ArrayList<God>
mientras que getGods()
una lista de nombres de dioses, y que getTheGod()
nos retorna a Zen O Sama y getAGod()
nos devuelve un dios aleatorio.
Explicado ahora, hasta parece evidente ¿verdad? Esta explicación, rara vez la tendrás en un escenario real, tendras que bajar al detalle de todas las funciones para alcanzar ese conocimiento. ¿Cuanto tiempo te puede llevar eso?
Hay que poner nombres con sentido.
No es nada fácil, de hecho, un buen nombre puede dejar de serlo conforme el código crece y evoluciona. Veamos algunas mejoras sobre las funciones descritas:
getGods() -> getGodNames()
getGodList() -> getGods() // El tipo devuelto ya nos lo dice el IDE
getGodInfo() -> getGodPersonalInfo()
getGodData() -> getGodBattleData()
getGodObject() -> getGod()
getTheGod() -> getZenOSama()
getAGod() -> getRandomGod()
¿Sabías que Mr. Popo puede comer Kamehames?
Agradecimientos
Gracias a mis compañeros y compañeras de Basetis por el acceso a este libro y la flexibilidad para escribir este contenido que comparto con vosotras.