Hay cosas buenas que decir sobre tener un único punto de salida, así como hay cosas malas que decir sobre la inevitable programación de "flecha" que resulta.
Si uso múltiples puntos de salida durante la validación de entrada o la asignación de recursos, trato de poner todas las 'salidas de error' de manera muy visible en la parte superior de la función.
Tanto el artículo de Spartan Programming de "SSDSLPedia" como el artículo de punto de salida de función única de "Wiki Pattern Repository's Wiki" tienen algunos argumentos perspicaces al respecto. Además, por supuesto, hay que considerar esta publicación.
Si realmente desea un único punto de salida (en cualquier lenguaje no habilitado para excepciones), por ejemplo, para liberar recursos en un solo lugar, encuentro que la aplicación cuidadosa de goto es buena; vea, por ejemplo, este ejemplo bastante artificial (comprimido para guardar el espacio en pantalla):
int f(int y) {
int value = -1;
void *data = NULL;
if (y < 0)
goto clean;
if ((data = malloc(123)) == NULL)
goto clean;
/* More code */
value = 1;
clean:
free(data);
return value;
}
Personalmente, en general, no me gusta la programación de flechas más de lo que no me gustan los múltiples puntos de salida, aunque ambos son útiles cuando se aplican correctamente. Lo mejor, por supuesto, es estructurar su programa para que no lo requiera. Desglosar su función en varios fragmentos generalmente ayuda :)
Aunque al hacerlo, encuentro que de todos modos termino con múltiples puntos de salida como en este ejemplo, donde alguna función más grande se ha dividido en varias funciones más pequeñas:
int g(int y) {
value = 0;
if ((value = g0(y, value)) == -1)
return -1;
if ((value = g1(y, value)) == -1)
return -1;
return g2(y, value);
}
Dependiendo del proyecto o las pautas de codificación, la mayoría del código de la placa de caldera podría reemplazarse por macros. Como nota al margen, desglosarlo de esta manera hace que las funciones g0, g1, g2 sean muy fáciles de probar individualmente.
Obviamente, en un lenguaje habilitado para excepciones y OO, no usaría sentencias if como esa (o en absoluto, si pudiera salirse con la suya con poco esfuerzo), y el código sería mucho más simple. Y no flecha. Y la mayoría de los retornos no finales probablemente serían excepciones.
En breve;
- Pocos retornos son mejores que muchos retornos
- Más de una devolución es mejor que las flechas enormes, y las cláusulas de protección generalmente están bien.
- Las excepciones podrían / deberían reemplazar la mayoría de las 'cláusulas de protección' cuando sea posible.