Opinion Do While Return

633 views
Skip to first unread message

Ariel

unread,
Jan 5, 2017, 12:19:58 PM1/5/17
to Comunidad de Visual Foxpro en Español
Buenos días colegas, hoy se me ocurrió probar algo que pensaba que no era correcto, y todavía no se si lo es, pero funciona sin problemas. Les quería pedir su opinión. Siempre para salir de un bucle DO WHILE utilizo EXIT pero esta vez puse un RETURN .F. y quedo de esta forma:

DO WHILE .T.
   IF lbVar
       LOOP
  ELSE
      RETURN .F.  &&Aqui siempre utilize Exit
  ENDIF
ENDDO


Que les parece? puede traer algún problema?

Carlos Hidalgo

unread,
Jan 5, 2017, 12:26:06 PM1/5/17
to publice...@googlegroups.com
Según la ayuda de FoxPro...

"RETURN termina la ejecución de un programa, procedimiento o función. El control se devuelve al programa que llama, al programa que llama de mayor nivel, a otro programa o a la ventana Comandos.

Cuando se ejecuta RETURN, Visual FoxPro libera las variables PRIVATE.

RETURN se coloca generalmente al final de un programa, procedimiento o función para devolver el control a un programa de nivel superior. No obstante, se ejecutará un RETURN implícito si se omite RETURN."


No le veo nada de malo..

ArturoPC

unread,
Jan 5, 2017, 12:27:29 PM1/5/17
to Comunidad de Visual Foxpro en Español
Ariel, buenas tardes.

A la larga sí te puede traer problemas, ya que no es una buena práctica de programación.

Es mucho más saludable tener una sola salida de un programa, evento o función (procedimiento) porque así puedes controlar dicha salida.

Pongamos que el programa donde tienes el código que pusiste, en el tiempo necesita un cambio y debe devolver un tipo numérico o carácter. Tendrás que buscar todos los "RETURN" para cambiarlos. Si tienes una salida única, pues el cambio es sencillo. Y así entre otras cosas, que pueden aparecer en el camino.

Saludos.

Arturo PC.

Ariel Octavio D'Alfeo

unread,
Jan 5, 2017, 12:36:09 PM1/5/17
to publice...@googlegroups.com
Gracias Carlos, no habia mirado la ayuda.

Arturo, es correcto lo que decís, el tema es que este proceso se encarga de enviar comando a una impresora fiscal, y si en algún comando falla, necesito que retorne y no siga ejecutando los demás, ya que seguramente seguiría dando error, o quedaría la secuencia incompleta que tampoco me sirve. En general lo que hacia era setear una bandera para saber si había dado error y luego antes de mandar el próximo comando preguntaba si esa bandera estaba baja y la verdad que eran muchos IF. Si el día de mañana hay que hacer la sustitución del RETURN boolean por numeric, utilizare alguna herramienta de reemplazo como gofish, la que trae VFP u otras.

Muchas gracias por sus opiniones!
--

Ariel Octavio D'Alfeo
Córdoba, Argentina

Irwin Rodriguez

unread,
Jan 5, 2017, 12:46:34 PM1/5/17
to publice...@googlegroups.com
No es recomendable hacerlo de esa manera, yo me iria mas bien por:

LOCAL lbSeguir
lbSeguir = .T.
DO WHILE lbSeguir
   IF lbVar
       LOOP
  ELSE
      lbSeguir = .F.
  ENDIF
ENDDO

Si bien es cierto que es la misma cosa, la razón es que mi cerebro no se espantaria al ver un DO WHILE .T. porque da la impresion de que quedaria para siempre el bucle. En fin solo es una opinión subjetiva.

Saludos...!
--
DISTRIBUIDORA IRSESU, C.A
J-29947174-7
Irwin Rodríguez
- Director
Analista Programador - Freelance
+584125210679

Barquisimeto - Venezuela
Desarrollos online dentro y fuera del país

Luis Maria Guayan

unread,
Jan 5, 2017, 12:51:27 PM1/5/17
to publice...@googlegroups.com

Para salir de un ciclo DO WHILE se utiliza EXIT, tu estas utilizando un RETURN que es el retorno de una función o procedimiento.

Para tu caso que quieres controlar errores, debes utilizar una estructura de control de errores TRY ... CATCH ... FINALLY


Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com

El 05/01/17 a las 14:19, Ariel escribió:

Antonio Meza

unread,
Jan 5, 2017, 12:52:13 PM1/5/17
to Comunidad de Visual Foxpro en Español
Para todo hay buenas practicas y son difíciles de llevar a cabo, pero tienen un solo fin y es mejorar las cosas no empeorarlas, lo que te dicen Arturo es una buena practica, ya que omitas no hacerla por comodidad es una mala idea. es decir ya sabes que lo debes hacer y como, pero ya esta en ti mejorar o seguir igual (ser del montón). Cuando se va a prendiendo por internet hay códigos y ejemplos con un porcentaje muy alto de malas practicas, pocos blogs como el del Maestro Fernando Bozzo https://fdbozzo.blogspot.mx/ , que explica y enseña a usar las buenas practicas, FoxyDb es un ejemplo de usar mal el Return pues no tenia claro ese punto y otros mas, en la versión 3 estoy depurando malas practicas, pues poco a poco me voy quitando los malos hábitos y el siempre pensar o hacer cosas como "mañana, al rato, total así funciona, nadie lo va a ver, etc, etc."

Lo que necesitas tan solo agrega una variable local y ya tienes tu proceso mejorado, es una suposición ya que no presentas mas código.

local _estado as boolean

_estado = .t.

DO WHILE .T.
   IF lbVar
       LOOP
  ELSE
      _estado = .f.
      Exit
  ENDIF
ENDDO

if _estado = .t.
   * Continuar procesando 
else
   * No hacer nada
Endif

Return _estado

saludos
Antonio Meza

Ariel Octavio D'Alfeo

unread,
Jan 5, 2017, 12:52:14 PM1/5/17
to publice...@googlegroups.com
En ese caso, debería agregar un IF adicional luego del bucle, porque lo que busco es que si lvar es .F. no continué ejecutando el método y retorne, ese era el tema, yo estoy acostumbrado a ver el DO While .T. y solo hay que buscar donde esta el EXIT 

LOCAL lbSeguir
lbSeguir = .T.
lbRetorna=.F.
DO WHILE lbSeguir
   IF lbVar
       LOOP
  ELSE
      lbSeguir = .F.
    lbRetorna=.T.
  ENDIF
ENDDO

IF lbRetorna
  Return .F.
ENDIF

Irwin Rodriguez

unread,
Jan 5, 2017, 12:55:04 PM1/5/17
to publice...@googlegroups.com
No hay necesidad de otra variable, retorna la negación de la variable lbSeguir

Return !lbSeguir


Ariel Octavio D'Alfeo

unread,
Jan 5, 2017, 12:57:55 PM1/5/17
to publice...@googlegroups.com
Luis, El tipo de errores que tengo que controlar son de falta de papel, papel atascado, impresora apagada, tapa abierta, etc. son estados que me devuelve la impresora.

Antonio, es verdad, por hacer las cosas rápido o vagancia siempre caigo en las malas practicas, voy a seguir el consejo de Arturo y tuyo.

Irwin, si lbseguir es ,T, tiene que seguir ejecutando las siguientes lineas de comandos, no retornar.

Muchas gracias a todos.

Antonio Meza

unread,
Jan 5, 2017, 1:00:07 PM1/5/17
to Comunidad de Visual Foxpro en Español
Ariel!!

El Return NUNCA debe ir condicionado debe existir uno solamente y al final del código, por eso comento que foxydb hace mal uso del return porque lo tengo condicionado y es lo que estoy cambiando.

* Mala practica
IF lbRetorna
  Return .F.
ENDIF


saludos
Antonio Meza

Carlos Hidalgo

unread,
Jan 5, 2017, 1:11:28 PM1/5/17
to publice...@googlegroups.com
Y yo que ni hago uso del return, ni exit en estos comandos
Return solo al final de un Procedure/Function si es que lo  necesito..

Solo es un comentario 

Antonio Meza

unread,
Jan 5, 2017, 4:54:55 PM1/5/17
to Comunidad de Visual Foxpro en Español
No lo usas porque VFP lo hace por ti jajajaja 

Hay muchas cosas que VFP nos mal acostumbra por ello cambiar de lenguaje se nos hace difícil

Carlos Miguel FARIAS

unread,
Jan 5, 2017, 6:48:06 PM1/5/17
to Grupo Fox
El como se hace es muy subjetivo, la buena práctica es que funcione bien, prevea todas las eventualidades y si no que informe bien (try catch) y que esté bien documentado.
Usas DO WHILE .T., eso ya de por si es una mala práctica.
Como vas a hacer un bucle que no sabes de antemano como puede terminar?
El bucle que planteas no hace nada, porque si se da la condición, pasa al ciclo siguiente (como la condición no es funcional, como cambia de valor?, no planteas que el bucle está esperando un evento asincrónico que cambie el valor de la variable) y si no sale.
El uso del return en medio de una función, si sirve para clarificar o simplificar el código no lo veo mal, siempre y cuando este bien documentado.
Se mencionó que muchos returns al medio puede ser problemático. Si es cierto, si está mal documentado, y si igual es problema, quiere decir que la función/procedimiento es muy largo (salvo procesos especiales), más de 50 líneas es mucho).
El bucle do while prácticamente no lo uso (es difícil no encontrar una forma de reemplazarlo por una estructura FOR..ENDFOR, o una SCAN...ENDSCAN.
En VFP, si el código de un PRoc/func termina y no hay return es equivalente a un RETURN .T., que no hace falta poner.
En VFP un procedimiento puede devolver un valor, lo que por definición es incorrecto, pero en definitiva es util.
Un proc/func puede devolver varios valores (con parámetros por referencia).
Lo importante, es usar las características del lenguaje que simplifican, minimizan la cantidad de líneas de código. Si uso bien el lenguaje, la documentación esta en le manual del mismo.
Ojo. Un return dentro de un WITH ENDWITH produce error no inmediato (es como una falla parcial acumulativa, no se liberan las referencias a objetos del WITH y en algún momento, no siempre el mismo, se produce un cuelque.
Saludos: Miguel, La Pampa (RA)
Larga Vida y Prosperidad
Que la Fuerza los acompañe

Fidel Charny

unread,
Jan 6, 2017, 9:28:00 AM1/6/17
to Comunidad de Visual Foxpro en Español
Es importante tener en cuenta que RETURN no puede usarse dentro de una estructura TRY/CATCH/FINALLY/ENDTRY.
VFP no avisará sobre el uso de RETURN en esa estructura, ni tampoco saltará el problema si la línea no se ejecuta.




Carlos Hidalgo

unread,
Jan 6, 2017, 9:43:11 AM1/6/17
to publice...@googlegroups.com
Pues la "Mala Practica"  viene desde el principio de los tiempos entonces.
porque aquí usaron DO WHILE .T....

Ni el Grupo de Traductores como dice hasta abajo lo arreglo.. jejeje Feliz Viernes

Imágenes integradas 1



Antonio Meza

unread,
Jan 6, 2017, 9:50:12 AM1/6/17
to Comunidad de Visual Foxpro en Español
Escribir código espagueti funciona, traer todos los registros de la tabla de un servidor de base de datos cuando solo vas a agregar un registro nuevo o a modificar un registro también funciona, no usar capas también funciona, pero entonces por que funciona es correcto o es lo mejor? 

Un claro ejemplo usar variables publicas a diestra y siniestras funciona perfectamente pero es lo correcto? los que las usan dirán que si, que entonces para que están ahí jajajaj etc. pero en las buenas practicas no se recomiendan.

Documentar los sistemas desde luego que es la mejor practica!!! 

saludos
Antonio Meza

Mario López

unread,
Jan 6, 2017, 11:35:29 AM1/6/17
to Comunidad de Visual Foxpro en Español

@Ariel: en “mi” opinión si el RETURN sirve para hacer el código más legible entonces es válido, como opina Steve McConell en Code Complete, uno de los libros “definitivos” en prácticas de programación. En el capítulo 17 se habla específicamente de las estructuras de control inusuales y su utilización: igualmente si podés leer el libro completo seguramente te va a hacer un mejor programador.

Yo suelo usar RETURN .F. por ejemplo en determinadas rutinas complicadas de validaciones cuando detecto una condición que ya hace que los datos ingresados no sean válidos (aunque nunca dentro de un bloque WITH como mencionó Miguel)

HTH
Mario


Carlos Hidalgo

unread,
Jan 6, 2017, 12:05:39 PM1/6/17
to publice...@googlegroups.com
Para los que padecen...
Quizá el Do While .T. sea el problema
jajaja
Saludos



Imágenes integradas 2





Víctor Hugo Espínola Domínguez

unread,
Jan 6, 2017, 2:00:01 PM1/6/17
to publice...@googlegroups.com
DO WHILE .T.
    ....
    ....
    IF CondicionSalidaBucle
        EXIT
    ENDIF
ENDDO

No es mala práctica si se usa como implementación de la estructura de control REPEAT/UNTIL (Repetir/Hasta que) que existe en otros lenguajes y no en foxpro.


Saludos,
Víctor.
Lambaré - Paraguay.

HernanCano

unread,
Jan 8, 2017, 10:47:17 PM1/8/17
to Comunidad de Visual Foxpro en Español
Siempre hay un pero:

Para poder definir si es válido o no, debes responder a la sgte pregunta:
 ¿Hay código después de ENDDO?

1. Sí.
Entonces el RETURN donde lo ubicas es incorrecto.

2. No.
Entonces el RETURN donde lo ubicas puede ser correcto.

----------------------------
Pero pueden hacerse más consideraciones:

 ¿Está el código que expones dentro de una estructura WITH/ENDWITH?

1. Sí.
Entonces el RETURN donde lo ubicas se considera desacertado: es una mala práctica: conduce a errores del tipo C0005.

2. No.
Entonces el RETURN donde lo ubicas puede ser correcto.




El jueves, 5 de enero de 2017, 12:19:58 (UTC-5), Ariel escribió:

HernanCano

unread,
Jan 8, 2017, 11:28:30 PM1/8/17
to Comunidad de Visual Foxpro en Español
Carlos:
Lo que pasa es que las "buenas prácticas" se adquieren con la experiencia. Las de VFP ha sido una recopilación "histórica" de diversos conceptos de colegas como tú y como yo que han compartido su experiencia, tanto práctica como sólo de recopilación.

La ayuda de VFP no debe ser cambiada en lo que mencionas, pues se pierde la esencia de lo que el "programador original" haya querido exponer sobre el uso que él quiere/propone de cada comando/sentencia.


Te cuento que la ayuda de VFP9 ha sido actualizada y compartida varias veces.
La última es dv_foxhelp_vfp9sp2_v1.07.zip fechada June 12 2014 Version 1.07 .

Veo que tienes la ayuda de VFP8 que fue la última que se tradujo.
https://sites.google.com/site/archivosvfp/archivos/AyudaVFP8Español.zip
erasable.png
Reply all
Reply to author
Forward
0 new messages