versión 2003 (Modificado)
Es difícil establecer un método definitivo para "programar bien", pero queremos hacer énfasis en las ventajas de estructurar bien los programas. La capacidad de programar estructuradamente en 4D puede ser de gran ayuda.
La compilación de una base bien estructurada puede obtener mejores resultados que en una base mal estructurada. Por ejemplo, si escribe un método genérico para manejar n métodos de objeto, obtendrá resultados de más calidad en modo interpretado y en compilado que en una situación donde n métodos de objeto componen n veces el mismo conjunto de instrucciones.
En otras palabras, la calidad de la programación tiene un impacto en la calidad del código compilado.
Con práctica, puede mejorar progresivamente su código 4D. El uso frecuente del compilador le da una retroalimentación correctiva que le permite alcanzar instintivamente la solución más eficiente.
Entre tanto, le podemos ofrecer algunos consejos y trucos para que ahorre tiempo realizando tareas simples y recurrentes.
Uso de comentarios en el código
Algunas técnicas de programación pueden hacer que su código no sea fácil de leer tanto para usted como para otra persona en el futuro. Por esta razón, le aconsejamos comentar detalladamente sus métodos. De hecho, mientras que los comentarios excesivos tienden a hacer lenta una base interpretada, no tienen ninguna influencia en el tiempo de ejecución de una base compilada.
Uso de directivas de compilación para optimizar el código
Las directivas de compilación pueden ayudarle a acelerar su código considerablemente. Cuando declara variables con base en su uso, el compilador utiliza el tipo de datos con el mayor alcance posible para no penalizarlo. Por ejemplo, si no declara la variable definida por la instrucción: Var:= 5, el compilador le dará el tipo Real, incluso si se puede declarar como Entero.
Variables numéricas
Por defecto, el compilador da el tipo Real a las variables numéricas (no declaradas por directivas de compilación) si las Preferencias no indican otra cosa. Los cálculos con Reales son más lentos que con Enteros largos. Si usted sabe que una variable numérica siempre será un entero, es conveniente declararla con las directivas de compilación C_INTEGER o C_LONGINT.
Por ejemplo, es una buena práctica declarar sus contadores de bucles como Enteros.
Algunas funciones estándar de 4D devuelven Enteros (ejemplo: Character code, Int...). Si usted asigna el resultado de una estas funciones a una variable no declarada de su base, el compilador le asigna el tipo Real en lugar del tipo Entero. Recuerde declarar estas variables con directivas de compilación siempre que esté seguro de que no se utilizarán en un contexto diferente.
Este es un ejemplo simple de una función que devuelve un valor aleatorio dentro de un rango dado:
$0:=Mod(Random;($2-$1+1))+$1
Siempre devolverá un entero. Escrito de esta manera, el compilador le dará a $0 el tipo Real en lugar de Entero o Entero largo. Es mejor incluir una directiva de compilación en el método:
C_LONGINT($0) $0:=Mod(Random;($2-$1+1))+$1
El parámetro devuelto por el método ocupará menos espacio en memoria y será mucho más rápido.
Este es otro ejemplo. Imagine que declara dos variables como Entero largo:
C_LONGINT($var1;$var2)
y una tercera variable no declarada recibe la suma de las otras dos variables:
$var3:=$var1+$var2.
El compilador declarará la tercera variable, $var3, como Real. Usted tendrá que declararla explícitamente como Entero largo si quiere que el resultado sea Entero largo.
Nota: Sea cuidadoso con el modo de cálculo en 4D. En modo compilado, no es el tipo de la variable que recibe el cálculo el que determina el modo de cálculo, sino el tipo de los operandos.
En el siguiente ejemplo, el calculo se efectúa sobre enteros largos:
C_REAL($var3) C_LONGINT($var1;$var2) $var1:=2147483647 $var2:=1 $var3:=$var1+$var2
$var3 es igual a 2147483648 tanto en modo compilado como interpretado.
Sin embargo, en este ejemplo:
C_REAL($var3) C_LONGINT($var1) $var1:=2147483647 $var3:=$var1+1
por razones de optimización, el compilador considera el valor 1 como un entero. En modo compilado, $var3 es igual a 2147483648 porque el cálculo se efectúa sobre Enteros largos. En modo interpretado, $var3 es igual a 2147483648 porque el cálculo se efectúa sobre Reales.
Los botones son un caso específico de Real que puede declararse como Entero largo.
Cadenas
El tipo por defecto asignado a las variables alfanuméricas es Texto si las Preferencias no indican otra cosa. Por ejemplo, si escribe:
MiCadena:="Hola", MiCadena será para el compilador una variable de tipo Texto.
Si esta variable se procesa frecuentemente, vale la pena declararla utilizando C_STRING. El proceso es mucho más rápido con variables tipo Alfa, las cuales tienen una longitud máxima definida, que con variables tipo Texto. Recuerde las reglas de comportamiento de esta directiva.
Si quiere probar el valor de un carácter, haga la comparación con su valor Character code en vez de con el carácter en sí mismo. La rutina de comparación de caracteres tiene en cuenta todas las variaciones del carácter, tales como acentuaciones.
Diferentes observaciones
Arrays de dos dimensiones
El procesamiento de arrays de dos dimensiones se maneja mucho mejor si la segunda dimensión es más larga que la primera.
Por ejemplo, un array declarado como:
ARRAY INTEGER(Array;5;1000)
será manejado mejor que un array declarado como:
ARRAY INTEGER(Array;1000;5)
Campos
Cuando necesite efectuar varios cálculos sobre un campo, puede mejorar el desempeño almacenando el valor del campo en una variable y realizando sus cálculos sobre la variable en lugar de sobre el campo. Considere el siguiente método:
Case of : ([Cliente]Dest="Nueva York") Transporte:="Mensajero" : ([Cliente]Dest="Puerto Rico") Transporte:="Correo aéreo" : ([Cliente]Dest="Exterior") Transporte:="Servicio de correo expreso" Else Transporte:="Servicio de correo regular" End case
Este método tomará más tiempo en ejecutarse que si se escribe de esta forma:
$Dest:=[Cliente]Dest Case of : ($Dest="Nueva York") Transporte:="Mensajero" : ($Dest="Puerto Rico") Transporte:="Correo aéreo" : ($Dest="Exterior") Transporte:="Servicio de correo expreso" Else Transporte:="Servicio de correo regular" End case
Punteros
Como en el caso de los campos, es más rápido trabajar con variables que con punteros sin referencia. Cuando necesite realizar varios cálculos sobre una variable referenciada por un puntero, puede ahorrar tiempo almacenando el puntero sin referencia en una variable.
Por ejemplo, suponga que utiliza un puntero, MiPtr, para hacer referencia a un campo o a una variable. Usted quiere realizar un conjunto de pruebas sobre el valor referenciado por MiPtr. Puede escribir:
Case of : (MiPtr-> = 1) Secuencia 1 : (MiPtr-> = 2) Secuencia 2 End case
El conjunto de pruebas se realizaría más rápido si se escribiera:
Temp:=MiPtr-> Case of : (Temp = 1) Secuencia 1 : (Temp = 2) Secuencia 2 End case
Variables locales
Utilice variables locales, siempre que sea posible, para estructurar su código. Utilizar variables locales tiene las siguientes ventajas:
Las variables locales ocupan menos espacio cuando se utilizan en una base. Se crean cuando se entra en el método donde se utilizan y se destruyen cuando el método termina su ejecución.
El código generado se optimiza para variables locales, especialmente para las de tipo Entero largo. Esto es útil para contadores en bucles.
Ver también
Detalles de sintaxis, Guía de declaración, Mensajes de error , Utilización de directivas de compilación.