Code Blocks, función: IF()

Post Reply
JMFS-D
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm

Code Blocks, función: IF()

Post by JMFS-D »

Estimados colegas:

¿Es conveniente, pasar a Code Blocks, todas las líneas, que se puedan de un fuente?.

¿Y sustituir, todos los IF ELSE ENDIF, por IF()?

¿Poner, todo lo que sea factible, de los IF(), a IF( condición, EVAL( bCode1 ), EVAL( bCode2 ) )

Ya que los, Code Blocks, y la función IF(), son más rapidos. Me podrías decir, que ya me he contestado yo mismo, pero nunca esta de más segundas, terceras,... opiniones. Por las experiencias de cada uno.

Por ello, pido opinión, a todos los que quieran participar.

Saludos, y ¡¡¡GRACIAS!!! anticipadas.
User avatar
leandro
Posts: 958
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia
Contact:

No afecta

Post by leandro »

JMFS-D, no se que procesos estes corriendo y son muy pesados, pero dejame decirte que según mi experiencia la verdad no afecta mucho en manera que definas tus if(). IF;ELSE;ENDIF.

Pero por calidad de codigo. Lo haria con los codebloks.
Saludos
LEANDRO ALFONSO
SISTEMAS LYMA - BASE
Bogotá (Colombia)
[ FWH 19.09 ] [ xHarbour 1.2.3 Intl. (SimpLex) (Build 20190613) ] [ Embarcadero C++ 7.30 for Win32 ]
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Post by manuramos »

La verdad es que a nuestro nivel no se nota mucho, a no ser que crees alguna clase que necesite rapidez de refresco o algo así.

Pero sin duda lo más importante de los Codeblocks es que se encapsulan en una variable y se ejecutan del tirón sin necesidad de tener que buscarlos por la memoria a cada llamada a función. Son como las funciones INLINE pero transportables. Adermás la variable sirve de transporte y puedes pasorlos a una función o a un método de una clase con sus variables internas y todo. No se pueden concebir las clases de FW sin ellos. ¿Como sinó llamarías al Valid de un Get o a una accion al pulsar un botón. Tendrían que inventar otra cosa o aplicar los punteros de función.

En cuanto a los IF(). Idem de los mismo. Son INLINE y se pueden anidar y utilizar dentro de una variable, una llamada a función, etc. Ahorran mucho código. Por Ejemplo:

ColorearObjeto(if(oBJ=1,CRL_RED,if(oBJ=2,CLR_BLUE,CLR_GREEN)))

A ver como lo traduces a if / else / endif. Como mínimo 6 líneas con sus ciclos de reloj correspondiente.

O mejor: bColObj := { |oBj| if(oBJ=1,CRL_RED,if(oBJ=2,clr_blue,CLR_GREEN)), MsgBeep() }
ColorearCaja(bColObj,oCaja)
Por decir algo sencillo...
Nos Gusta Programar
JMFS-D
Posts: 40
Joined: Thu Jan 12, 2006 5:10 pm

Os pongo un ejemplo de mi codigo.

Post by JMFS-D »

IF( oParamtros:lPresupu , ;
( oDbfPresup:Load() , ;
nSiguiente := oDatos:Current()[ 1 ] , ;
oDatos:Current()[ 1 ] := nAnterior , ;
oDbfPresup:tipo := oPresupu:nTipo , ;
oDbfPresup:estado := oPresupu:nEstado , ;
oDbfPresup:codigo := oCliente:cCodigo , ;
oDbfPresup:numpresup := oPresupu:cNumero , ;
oDbfPresup:fechapres := oPresupu:dFecha , ;
oDbfPresup:descripcio := oDatos:Current()[ 2 ] , ;
oDbfPresup:cantidad := oDatos:Current()[ 3 ] , ;
oDbfPresup:precio := oDatos:Current()[ 4 ] , ;
oDbfPresup:Save() , ;
oDbfPresup:GoTo( nSiguiente ) ) , ;
( nSiguiente := oDatos:Current()[ 1 ] , ;
oDatos:Current()[ 1 ] := nAnterior , ;
oDbfFactC:tipo := oFactura:nTipo , ;
oDbfFactC:estado := oFactura:nEstado , ;
oDbfFactC:codigo := oCliente:cCodigo , ;
oDbfFactC:numfactura := oFactura:cNumero , ;
oDbfFactC:fechafactu := oFactura:dFecha , ;
oDbfFactC:descripcio := oDatos:Current()[ 2 ] , ;
oDbfFactC:cantidad := oDatos:Current()[ 3 ] , ;
oDbfFactC:precio := oDatos:Current()[ 4 ] , ;
oDbfFactC:Save() , ;
oDbfFactC:GoTo( nSiguiente ) ) )

Poner las lineas de codigo, para cuando se cumple la condición del IF, y para cuando no se cumple, en un EVAL, ¿sería lo más conveniente?.

Saludos, José Mª
User avatar
Antonio Linares
Site Admin
Posts: 37481
Joined: Thu Oct 06, 2005 5:47 pm
Location: Spain
Contact:

Post by Antonio Linares »

Jose Mª,

Practicamente no habrá diferencia en la velocidad de ejecución y el código se volverá más complicado de mantener.

Piensa que tanto las líneas de código de un PRG como el contenido de un codeblock, el compilador lo convierte a pcode (una serie de bytes) que la maquina virtual procesa.

Sólo en procesos en los que se requiere la máxima velocidad, la solución es codificar ciertas partes en C para que la máquina virtual no intervenga y así ganar ciclos de reloj.
regards, saludos

Antonio Linares
www.fivetechsoft.com
manuramos
Posts: 219
Joined: Mon Dec 26, 2005 7:25 pm
Location: Jerez de la Frontera (Spain)

Post by manuramos »

No hay que buscarle tres pies al gato, los manuales de programación dicen que siempre hay que buscar velocidad y ahorro de memoria, o elejir uno de los dos cuando no se no se pueden cumplir ambos.
De lo que se olvidan es de nuestra comodidad y de la claridad del código, y reza por no saltarte un paréntesis.
En el caso de tu trozo de codigo, lo mas convenientes es un IF / ELSE / ENDIF sin lugar a dudas. Otras veces serán más adecuados los DO CASE. Otras veces te convendrá encapsular el código vía IF() y CodeBloks. Busca siempre lo que más cómodo te resulte y no te calientes la cabeza.
Un saludo....
Nos Gusta Programar
Post Reply