domingo, mayo 25, 2008

Ejercicios calisténicos para objetos (II)

En este segundo post, analizo el primero de los ejercicios calisténicos para objetos sugeridos por Jeff Bay de ThoughtWorks, en el libro "The ThoughtWorks Anthology", y que publiqué hace unos días.

1. Usa un sólo nivel de indentación por método.

Usa sólo un nivel de indentación por método. Si al escribir un método necesitas un nivel más, significa que tienes que crear un nuevo método al que llamarás desde aquél.

En mi opinión, este ejercicio favorece la reducción drástica de la complejidad ciclomática de un método, ¡tan drástica que su objetivo es reducirlo a uno! Creo que este ejercicio no es malo si lo vemos en su contexto, local, pero creo que pierde fuerza cuando se considera a un nivel un poco más alto.

En mi opinión, la complejidad de un problema es inherente a ese problema. Quiero decir que no puedes reducir la complejidad, no puedes hacer que el problema sea más sencillo. Si lo haces más sencillo cambias el problema. Lo que sí es posible es "esconderla" detrás de algún sitio. El principal mecanismo para esconder la complejidad es por medio de la abstracción, el medio de que dispone nuestra razón para crear un modelo simplificado de la realidad, obviando los detalles.

Así que, según lo que he dicho, en realidad no estamos reduciendo la complejidad, la estamos desplazando a otro sitio. ¿Dónde? La respuesta es: en el número de métodos. Considera un método con complejidad ciclomática moderada, di que sea 6 o 7. Eso significa que habrás de transformar un método en otros seis o siete. Ciertamente reduces de 6 a 1, pero multiplicas por seis el número de métodos. Aunque hemos reducido la complejidad del método, hemos aumentado la dificultad para comprender el módulo. Estaría por apostar además que el nombre de los métodos representarán en ellos la estructura del método original.

En conclusión, no creo que se reduzca la complejidad, sino que se reparte, a costa de reducir la inteligibilidad del sistema. En mi opinión, llevado al extremo, este ejercicio puede perder su efectividad. Creo que lo mejor es tener presente el objetivo final: no construir métodos con una complejidad por debajoencima de, por ejemplo, 7 u 8 (una justificación psicológica podría ser el trabajo de Miller).

No hay comentarios: