ejemplos - for anidado php
¿Por qué es una buena idea evitar los bloques anidados en una función?(PHP) (4)
El código de lujo provoca pesadillas de mantenimiento ... Al menos en el modelo KISS, sea sencillo y su depuración será muy fácil.
Esta respuesta mantiene al modelo KISS, es una respuesta simple.
Instalé una versión beta de Netbeans 7.4, y hay una nueva sugerencia que dice "Demasiados bloques anidados en la declaración de función: es una buena práctica introducir una nueva función ...".
Trato de evitar los bloques anidados dentro de una función para una mejor legibilidad, pero hay alguna otra razón por la que esta sería una mejor "idea", específicamente para PHP, si eso importa.
El nombre formal para esto es Complejidad Ciclomática .
Esta es una medida de cuán compleja es una función, según el número de "puntos de decisión" en la función. Cuanto mayor sea el número, más compleja será la función.
La complejidad está determinada por el número de puntos de decisión en un método más uno para la entrada del método. Los puntos de decisión son "si", "mientras", "para" y "etiquetas de casos". Generalmente, 1-4 es de baja complejidad, 5-7 indica complejidad moderada, 8-10 es de alta complejidad y 11+ es de muy alta complejidad.
(tomado de http://phpmd.org/rules/codesize.html )
La razón por la que se considera malo tener valores de complejidad demasiado altos es porque hace que la función sea difícil de probar.
Para probar una función a su máximo potencial, debe tener una prueba separada para cada ruta de código posible. El número de rutas de código aumenta exponencialmente con cada nuevo punto de decisión, lo que significa que para cuando tenga más de un puñado de decisiones en una sola función, comenzará a necesitar cientos de pruebas para asegurarse de haber cubierto el toda la gama de funcionalidades que podría realizar.
Cientos de pruebas para una sola función son claramente demasiadas, por lo que la mejor opción es reducir el número de puntos de decisión por función dividiéndolo en varias funciones más pequeñas con menos decisiones cada una.
También debe hacer que las funciones sean discretas para que no se confíen unas con otras para ejecutarse. Esto les permite ser probados en forma aislada unos de otros. (de lo contrario, todavía tiene el problema original de demasiadas decisiones en una sola llamada)
Luego puede probar cada una de esas funciones con solo un puñado de la cantidad de pruebas que originalmente habría requerido.
El proceso de prueba de funciones aisladas unas de otras se denomina prueba de unidad . Este es un tema muy amplio en sí mismo, pero vale la pena investigar si desea saber más sobre las buenas prácticas de desarrollo de software.
Ya que has marcado esta pregunta PHP, te indicaré algunas herramientas que te ayudarán:
- Unidad de PHP : este es el paquete de prueba de unidad estándar de facto para PHP.
- PHPMD - "Detector de PHPMD PHP"; una herramienta para analizar su código para buscar cosas como complejidad excesiva.
- pDepend - Otra herramienta similar.
Hay muchas otras herramientas disponibles, pero eso es probablemente suficiente para comenzar; Conocerlos primero. Te encontrarás con otros naturalmente mientras investigas el tema.
Generalmente, las funciones / métodos están bien escritos si hacen solo una cosa pero lo hacen bien.
Cuando un método comienza a mostrar el anidamiento más allá de 1 o 2 niveles, es una señal segura de que está intentando hacer más de una cosa a la vez.
Cuando hay una gran cantidad de anidamientos y condicionales en una función, también hace que su lógica sea más complicada y difícil de seguir, así como más difícil de probar de forma robusta.
Finalmente, si hay una funcionalidad enterrada profundamente en un nido en otro método, no podrá reutilizarlo fácilmente. Tendrá que cortarlo y pegarlo donde desee usarlo (lo que siempre lleva a una pesadilla de mantenimiento) o agregar un interruptor adicional y otro condicional al método de alojamiento (que solo exacerba el problema). Si refactoriza esa funcionalidad en su propio método, la reutilización es trivial.
Un buen beneficio es frenar el alcance. Al reducir el bloque a un método separado, dejará en claro a los futuros lectores que esta porción de código solo depende de los parámetros dados.
En pseudo codigo
$some_variable = "something";
$some_other_variable = "something else";
if(x < y) {
... lots of code ...
some_method($some_variable);
... more code ...
}
Al extraer el condicional a un método separado, queda claro que la lógica dentro de esa rama NO depende de $some_other_variable
.
Si tiene métodos grandes con muchas ramificaciones y muchas variables, se vuelve más difícil mantener el método y es más probable que se rompa algo inadvertidamente.