2011-01-30 8 views
14

Lo sé, hay otherquestions sobre la declaración goto presentada en PHP 5.3.¿Cuáles son los casos de uso válidos de goto en PHP?

Pero no pude encontrar ninguna decente respuesta allí, todos eran del tipo "último recurso", "xkcd", "malo", "malo", "mal !!!". Pero no hay un ejemplo válido. Solo declaraciones de que no hay ningún uso. O afirmaciones de que hay algunos casos de uso raros (nuevamente, sin ejemplos).

Entonces, la pregunta es: "¿Cuáles son los casos de uso válidos de goto en PHP?". Respuestas para "¿Es goto malvado?" no son bienvenidos y serán votados negativamente. Gracias :)

¿O alguien tiene un enlace a un RFC donde se explica la decisión? No pude encontrar uno.

+0

'goto' es conveniente como arenga roja en discusiones sobre la utilidad o la maldad de construcciones de lenguaje, independientemente de cualquier uso práctico. – mario

+1

@mario: Intenté dejar en claro en mi pregunta, que no estoy interesado en saber si es malvado o no. Tales preguntas son una pérdida de tiempo. Estoy interesado en ejemplos concretos. Y, por lo tanto, considero que esto no es una pregunta "subjetiva o argumentativa". – NikiC

+0

@NikiC, por cierto cuando dices que eres un ["desarrollador de PHP"] (http://stackoverflow.com/users/385378/nikic), ¿eso significa que conoces a C? – Pacerier

Respuesta

6

Un posible uso (que sin embargo puede implementarse por otros medios) es la implementación de un finite state machine.

+1

¿Es una máquina de estados finitos algo así como un analizador? – NikiC

+1

http://en.wikipedia.org/wiki/Finite-state_machine – Mchl

+0

Hm, eso no me ayuda mucho. ¿Podría dar un ejemplo de una máquina de estados finitos o dónde se usa? El artículo de Wiki es bastante teórico, no pude encontrar una aplicación allí. – NikiC

2

goto operador se puede utilizar para romper bucles de niveles múltiples.

Este ejemplo particular goto aplicación se da at goto manual page:

Tampoco se puede saltar en cualquier tipo de bucle o estructura de conmutación. Puede saltar de estos, y un uso común es usar un goto en lugar de un salto de varios niveles.

+3

¿No tenemos 'break x;' para eso? 'break 4;' romperá cuatro bucles. [Manual for 'break'] (http://php.net/break) – NikiC

+0

Sí, tenemos.Por cierto, si se usa correctamente, 'goto' puede conducir a un código poco más claro que' break x'. Tal vez este es un intento de proporcionar un mecanismo de ruptura similar a break/continue marcado en Java. – Kel

+3

Agradecería un ejemplo donde un 'goto' es más limpio cuando' break x'. No me puedo imaginar uno yo mismo. – NikiC

2

Goto ha sido en gran sustituido por declaraciones especializadas como continue, break, try...catch. En los años que estoy trabajando con PHP, no pensé que podría ayudarme una vez. En lenguajes como C++ que no tienen la instrucción break x, se puede usar para saltar desde bucles anidados, pero como PHP lo tiene, no hay razón.

Code Complete tiene un capítulo muy agradable y detallado sobre gotos. Citando los dos últimos párrafos:

El uso de gotos es una cuestión de religión. Mi dogma es que en los idiomas modernos, puede reemplazar fácilmente nueve de diez gotos con construcciones secuenciales equivalentes. En estos casos simples, debe reemplazar gotos por hábito. En los casos difíciles, aún puede exorcizar el goto en nueve de cada diez casos: puede dividir el código en rutinas más pequeñas, usar try-finally, usar if anidados, probar y volver a probar una variable de estado, o reestructurar un condicional. En estos casos, es más difícil eliminar el goto, pero es un buen ejercicio mental y las técnicas que se analizan en esta sección te dan las herramientas para hacerlo.

En el caso restante uno de cada 100 en el que un goto es una solución legítima al problema, documente con claridad y úselo. Si tiene puestas las botas de lluvia, no vale la pena caminar alrededor de la cuadra para evitar un charco de barro. Pero mantén tu mente abierta a los enfoques sin errores sugeridos por otros programadores. Podrían ver algo que tú no ves.

Me resulta muy difícil entender por qué el equipo PHP se molestó en agregarlo (después de todos esos años vivimos en paz sin él).

+4

En PHP, sin embargo, se agregó 'goto' cuando todas las afirmaciones que mencionas ya han estado disponibles por mucho tiempo. De ahí la pregunta que presumo. – Mchl

+0

@Mchl, Exactamente. La pregunta es por qué se agregó 'goto'. – Pacerier

5

Ver PHP Architect - GOTO in PHP 5.3: is it Really That Evil?

En este artículo se da una breve descripción de por qué GOTO puede ser útil, ¿por qué lo tenemos en PHP (desde 2004) y por qué era/es objeto de controversia. La respuesta general parece ser: GOTO es sobre todo inútil y debe evitarse a menos en los espacios de aplicación muy estrechas (como la construcción de un compilador):

Una cosa es cierta: hay alguna aplicación en la que un buen desarrollador puede poner GOTO para un buen uso para producir código que sea más simple y más eficiente, pero probablemente no sean el tipo de programas principales que el desarrollador promedio escribirá; por lo tanto, existe una preocupación legítima aquí que los programadores inexpertos usarán GOTO en detrimento general de su código.

también ver algunos de los originales discusión lista de noticias/controversia se ha mencionado en el artículo:

Véase también este lenguaje minuciosa discusión agnósticos sobre GOTO considered harmful at C2 Wiki

+1

Está bien, así que de nuevo el autómata de estado finito, el lexing, el análisis sintáctico, la compilación. Ese parece ser el caso de uso número uno (o incluso el único). – NikiC

+0

@nikic sí. absolutamente. – Gordon

3

Un caso donde lo uso es cuando tengo que realizar comprobaciones de varios niveles y no quiero agregar un código adicional cuando podía pasar a la sección correspondiente después de mis comprobaciones.

Por ejemplo, existe este sistema que verifica el estado de varias máquinas en un almacén y falla el almacén como un todo y envía una alerta si alguna parte de un sistema está muerta, en un pseudo-código va de esta manera:

if(hsensor[status] != OK) { 
    alert = Humidity sensor hsensor[fail_id] failed with error hsensor[fail_error] 
    goto sendAlert; 
} 

if(cosensor[status] != OK) { 
    alert = Co2 sensor cosensor[fail_id] failed with error cosensor[fail_error] 
    goto sendAlert; 
} 

esta manera, si nada falla, se puede omitir el resto de comprobaciones e ir directamente a través de la alerta. Quien está de guardia recibe la alerta y obtiene el resultado completo de cualquier función llamada alerta para que puedan solucionarlo.

+2

Este es el mejor caso de uso que conozco. La alternativa es un conjunto de sentencias if anidadas o una variable de estado global que se verifica en cada sentencia if. En mi opinión, goto es la forma más limpia de lograr esto. –

+1

Amigo esta debería ser la respuesta aceptada. – Pacerier

Cuestiones relacionadas