PDA

Ver la Versión Completa : ¿Es adecuado usar Typed Constants?


andre
10-12-2003, 19:52:41
Hola amigos,

Recientemente he descubierto ese tipo de constantes y me gustaría saber si es recomendable su uso porque pareciera ser que no es bueno por el hecho de tener que habilitar la opción en las opciones del proyecto o utilizar la directiva {$J+}. Parece ser que no es algo natural del lenguaje pero realmente lo encuentro útil.

Alguien ha tenido alguna experiencia o me podría recomendar su uso, ¿porque?.

Saludos.

delphi.com.ar
10-12-2003, 20:00:53
Con la directiva {$J+} lo que logras es que no sean constantes puras, ya que pueden cambiar de valor en tiempo de ejecución, por lo que realmente son variables estáticas con valores por defecto. Cuando no esta activa esta directiva, si son realmente constantes.

Saludos!

andre
10-12-2003, 20:06:57
Muchas gracias delphi.com.ar, vos recomiendarías el uso de ese tipo de constantes, ¿es seguro?

Saludos.

delphi.com.ar
10-12-2003, 20:07:42
Una explicación de lo anterior:

procedure TForm1.Button1Click(Sender: TObject);
const
Texto: string = '';
begin
Caption := Texto;
Texto := Edit1.Text;
end;

Prueba como la variable Texto conserva el valor en forma estática aunque el hilo de ejecución ha salido del scope.

Recomendar.... todo según se necesite.


Saludos!

andre
10-12-2003, 20:16:32
Bueno,

Cuando ví por primera vez ese tipo de constantes fue en los articulos de Delphi en about.com, ahi explicaba lo anterior pero al final decía que Borland desalentaba el uso de ese tipo de constantes en Delphi 2, 3 y 4 y que luego lo mantuvo por razones de compatibilidad con Delphi 1.

Los usos pueden ser variados y yo tengo uno por lo menos, pero cuando mostré esto al equipo de desarrollo al cual pertenezco me aconsejaron investigar un poco más por el hecho de que no parece ser algo natural del lenguaje. Mirando un poco la documentación actual de Delphi (7) no encontré ninguna referencia mala a ese tipo de constantes, entonces quería saber si se aconseja su uso por ejemplo para mantener un contador, un timer, etc. Es decir, Borland ya lo ha incorporado como algo más del entorno o todavía es solamente por motivos de compatibilidad?, Los que la han utilizado, han encontrado algún problema o todo corre bien?.

Muchas gracias por tu tiempo.

Saludos.

delphi.com.ar
10-12-2003, 20:28:18
Piensa en lo siguiente: Las constantes reales son resueltas en al compilar. Este tipo de constantes, si la directiva $J esta activa, ocupan lugar en la memoria y.... ¿En qué momento se liberan?... A partir de aquí son todas suposiciones: si la variable pertenece a un método de una clase, supongo que se dispondrá durante la instancia de la clase. Si pertenece a un procedimiento regular, supongo que esta variable estará activa para toda la instancia de la aplicación, no deja de ser una variable global.

Además personalmente, creo no algo muy natural, y el lenguaje da otras herramientas mas puras para mantener valores en memoria mientras se necesiten.

¿Porqué no nos pasas el link al artículo?

Saludos!

andre
10-12-2003, 20:32:40
Este es el link del artículo del cual hablaba:

Typed Constants en About.com (http://delphi.about.com/library/weekly/aa062999.htm)

delphi.com.ar
10-12-2003, 20:44:57
Ok... creo que el artículo coincide bastante con lo que te he dicho anteriormente. Por otro lado, lo último que te comenté (el scope de la variable), no es para que no utilices este tipo de variables, sino para que lo tengas en cuenta al momento de necesitarlas.

Saludos!

roman
10-12-2003, 20:50:24
delphi.com.ar comentó:
y el lenguaje da otras herramientas mas puras para mantener valores en memoria mientras se necesiten.


¿Por ejemplo?

// Saludos

andre
10-12-2003, 20:55:25
Bueno, muchas gracias delphi.com.ar, agradezco muchísimo tu disposición. O sea que, para ir cerrando, no hay ningún inconveniente en utilizar las Typed Constants, pero hay maneras más limpias y/o naturales. Que recomendarías, una variable global en la unidad?.

Muchas gracias,

Saludos.

roman
10-12-2003, 21:02:11
andre comentó:
Bueno, muchas gracias delphi.com.ar, agradezco muchísimo tu disposición. O sea que, para ir cerrando, no hay ningún inconveniente en utilizar las Typed Constants, pero hay maneras más limpias y/o naturales. Que recomendarías, una variable global en la unidad?.


Espero la respuesta de dca acerca de la heramientas más naturales. Yo, si bien raramente usos este tipo de "constantes", no les veo ningún problema y creo que en ocasiones se justifica bastante. Si bien como dice dca, no dejan de ser variables globales en cuanto a la vida de la variable, prefiero usar una variable global que sólo puede ser accedidad desde el procedimiento para el cuál está destinada (typed constants) que una variable global que meses después me quedaré pensando para qué servía dicha variable cuando lea el código.

Además, usando la directiva equivalente $WRITEABLECONST ON|OFF quedará perfectamente claro en el código cuál era la intención.

// Saludos

delphi.com.ar
10-12-2003, 21:06:57
Si necesitamos una variable dentro de una clase, la crearíamos como perteneciente a la clase (un campo). Si necesitamos una variable para acceder en toda la aplicación, crearemos una variable global. Sinceramente, muy pocas veces necesité de una variable global, si es que puedo tener todos los objetos comunicados o entrelazados.
En mis proyectos, las únicas variables globales, creadas por mi son la que contiene el DataModule principal y el Formulario principal que es el que contiene el menú.

Saludos!

roman
10-12-2003, 21:14:57
delphi.com.ar comentó:
Si necesitamos una variable dentro de una clase, la crearíamos como perteneciente a la clase (un campo). Si necesitamos una variable para acceder en toda la aplicación, crearemos una variable global. Sinceramente, muy pocas veces necesité de una variable global, si es que puedo tener todos los objetos comunicados o entrelazados.
En mis proyectos, las únicas variables globales, creadas por mi son la que contiene el DataModule principal y el Formulario principal que es el que contiene el menú.

Saludos!

Sí, pero como veo las cosas, hay una diferencia entre necesitar una variable durante toda la aplicación que necesitar una variable en toda la aplicación. Lo primero se refiere al tiempo de vida de la variable y lo segundo al alcance de la variable. Donde yo veo útiles las constantes tipadas es dentro de un procedimiento, función o método; variables que requieren preservar su valor entre llamadas pero que sólo conciernen a dicho procedimiento, función o método.

// Saludos

delphi.com.ar
10-12-2003, 21:23:23
Pues en ese caso.. ¡No se me ocurre otra cosa!
¿En qué caso te ha surguido que necesites guardar datos para que solo sean visibles dentro de un procedimiento?¿Algun acumulador?.... ¿No se podría solucionar con parámetros var?

andre
10-12-2003, 21:43:13
Mi caso es el siguiente:

En un formulario tengo 1 ComboBox y 1 CheckBox para la edición de un campo. El CheckBox tiene la función similar a los administradores gráficos de base de datos como el IBExpert cuando editas en modo de formulario, sirve para decir que ese campo será nulo, el ComboBox sirve para cargar los posibles valores para ese campo.

Cuando el usuario pone el CheckBox a False, quiero que el ItemIndex del ComboBox sea -1 para que el usuario tenga la impresión visual de que ese campo tendrá el valor nulo y luego cuando el usuario pone el CheckBox a True, quiero que muestre el ItemIndex anterior.

Realmente podría implementar esto con una variable global en la unidad y pienso que al cerrar el formulario esta se liberaría junto con la liberación del formulario pero me pareció cómodo utilizar las Typed Constants. Si no hay ningún inconveniente, si no trae ningún problema, ¿porqué no?.

Saludos.

delphi.com.ar
10-12-2003, 21:51:13
No confundas una variable global en la unit con un campo.

Una variable global, son aquellas que estan definidas fuera de la clase, digamos que no pertenecen a esta. Estas variables pueden ser accedidas desde cualquier unit que utilice a esta otra.

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

type
TForm1 = class(TForm)
private
public
end;


var
Form1: TForm1;


implementation
...
end.


Campo, se suele llamar a las variables que pertenecen a una clase. Estas variables existen en forma diferente para cada instancia de esta clase:

type
TForm1 = class(TForm)
private
public
FCampo: Integer;
end;
...
end.



PD: He utilizado muchas veces Typed Constants sin problemas, y no creo que te traigan problemas. Lo que asusta del artículo que enviaste, es si seguirán existiendo, lo que creo muy posible.
Saludos!

andre
10-12-2003, 22:03:00
Muchas gracias por las respuestas, han sido de mucha ayuda para mí.

Saludos.