Regla
Evitar el uso de goto.
La sentencia goto crea un flujo de control
no estructurado que dificulta el seguimiento y mantenimiento del código.
Lenguajes compatibles: 45+Introducción
goto salta directamente a puntos arbitrarios en el código, rompiendo el flujo natural de ejecución. Esto dificulta enormemente el razonamiento sobre el estado, el manejo de errores y el rendimiento. Mantener código con goto aumenta el riesgo de errores sutiles y comportamientos inesperados. Las alternativas estructuradas producen código predecible, legible y mantenible.
Por qué es importante
Implicaciones de seguridad: Los saltos no estructurados pueden eludir las comprobaciones de validación o autorización, exponiendo potencialmente operaciones sensibles.
Impacto en el rendimiento: Las cadenas 'goto' complejas dificultan la elaboración de perfiles y la optimización, aumentando el riesgo de rutas de ejecución ineficientes.
Mantenibilidad del código: El `goto` crea un flujo de control tipo espagueti que es difícil de refactorizar o extender de forma segura.
Superficie de ataque: Los saltos incorrectos pueden exponer involuntariamente rutas de código inseguras o saltarse secciones críticas para la seguridad.
Ejemplos de código
❌ No conforme:
<?php
for ($i = 0; $i < 10; $i++) {
if ($i == 3) {
goto end;
}
echo "$i\n";
}
end:
echo "Jumped out!";
?>
Por qué está mal: Las sentencias goto crean bucles no estructurados, lo que dificulta razonar sobre el flujo o insertar lógica adicional de forma segura.
✅ Conforme:
<?php
for ($i = 0; $i < 10; $i++) {
if ($i == 3) {
break;
}
echo "$i\n";
}
echo "Jumped out!";
?>
Por qué es importante: El uso de un bucle `for` hace que el flujo de control sea explícito, predecible y mantenible, a la vez que conserva un comportamiento idéntico.
❌ No conforme:
function process(items) {
for (const item of items) {
if (!item) {
console.error('Invalid item detected');
return false;
}
}
return true;
}Por qué es incorrecto: los saltos `goto` oscurecen la ruta de error y la ejecución normal, dificultando su seguimiento o extensión.
✅ Conforme:
function process(items) {
for (const item of items) {
if (!item) {
console.error('Invalid item detected');
return false;
}
}
return true;
}¿Por qué esto importa? Los bucles estructurados y las salidas anticipadas clarifican la lógica, hacen explícita la gestión de errores y facilitan el mantenimiento.
Conclusión
Evitar el uso de goto para mantener un código estructurado, legible y seguro. Utilizar bucles, funciones y retornos anticipados para un flujo de control predecible. Esto reduce los costes de mantenimiento, previene errores sutiles y asegura rutas de ejecución seguras.
.avif)
