Ir al contenido


Foto

Inicialización de variables de clase


  • Por favor identifícate para responder
6 respuestas en este tema

#1 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 21 mayo 2009 - 04:54

A todos alguna vez nos ha aparecido el warning en delphi al compilar:

"Variabe 'X' mightnot have been initialized"

Eso sucede ya que al declarar la clase se procede a su creación sin ningún trámite adicional. El warning desaparece asignandole a la clase 'X' el valor Nil. Estuve meditando sobre ello y quisiera conocer sus puntos de vista al respecto. En el  sentido más purista se debe inicializar con Nil las variables de clase para evitar el warning? O debido a que no provocará problema alguno se puede omitir?


Que piensan al respecto?

  • 0

#2 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 21 mayo 2009 - 05:52

...Que piensan al respecto?




delphi
  1. procedure TForm1.FormCreate(Sender: TObject);
  2. var Trial: Integer; {$warn use_before_def off}
  3. begin
  4. if False {or ProductoRegalado} then
  5.   Inc(Trial);
  6. if Trial >= 10 then
  7.   Halt;
  8. end;


  • 0

#3 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 mensajes

Escrito 22 mayo 2009 - 02:35

A todos alguna vez nos ha aparecido el warning en delphi al compilar:

"Variabe 'X' mightnot have been initialized"

Eso sucede ya que al declarar la clase se procede a su creación sin ningún trámite adicional. El warning desaparece asignandole a la clase 'X' el valor Nil. Estuve meditando sobre ello y quisiera conocer sus puntos de vista al respecto. En el  sentido más purista se debe inicializar con Nil las variables de clase para evitar el warning? O debido a que no provocará problema alguno se puede omitir?


Que piensan al respecto?

Hola Edgar, un gusto poder darte mi opinión.  :)

Hace falta matizar algunas cosas.  Al compilar, Delphi muestra esa advertencia (warning) si detecta que el código hace referencia de lectura a una variable local que "aparentemente" (según el propio código fuente) no recibirá valor antes de ejecutarse dicha referencia.

Cuando dices "clase X", creo que te refieres más bien a un "objeto X".  Pero como fuera, la advertencia aplica a muchos tipos de variables, no sólo clases u objetos.  De hecho, puede resultar curioso notar que el compilador lo reportará con una variable Integer, pero no con una variable String, y esto se debe a que las variables de tipos que usan contadores de referencias (como String) sí­ son inicializadas de manera implí­cita (en este mensaje de Club Delphi profundizo sobre la lógica detras de ello: http://www.clubdelph...25&postcount=29).

Resulta muy útil que el compilador lance la advertencia, ya que en muchos casos habrá sido por algún descuido de nuestra parte.  Pero hay casos especiales, donde el compilador no logra determinar si la variable está siendo inicializada o no, pero nosotros, los creadores del código, sabemos que sí­ lo estamos haciendo.  Tal vez no de una manera convencional que el compilador pueda detectar fácilmente, pero sí­ que le estamos dando un valor inicial.

Para estos últimos casos (que en la práctica son poco frecuentes), es de mucha ayuda desactivar la directiva de compilación "Warn Use_Before_Def", que señaló Javier.  Salvo que debes hacerlo sólo para la rutina en cuestión, ya que de otra manera quedarí­a desactivada también para las rutinas siguientes del archivo de código.


delphi
  1. {$Warn Use_Before_Def Off}
  2. Procedure Proc1;
  3. Var
  4.   MasterField :TField;
  5.   SavedModified :Boolean;
  6.   SavedState :TDataSetState;
  7. Begin
  8.   ...
  9. End;
  10. {$Warn Use_Before_Def On}  // volvemos a activar la directiva



Uno no debe inicializar una variable sólo por evitar que aparezca esa advertencia.  Mas bien, en caso de aparecer la advertencia, hay que revisar si estamos haciendo algo mal (como leer una variable local que sólo hemos declarado pero no otorgado ningún valor), o, por el contrario, estamos seguros de que el código le habrá asignado un valor a la variable antes de ser leí­da y por tanto proceder con seguridad a desactivar temporalmente la directiva.

Por último, siempre que aparezca esta advertencia del compilador, debemos revisar nuestro código.  Ignorarla o desactivar la directiva correspondiente sin hacer ningúna revisión es a lo menos comprometedor.  En mi opinión, nunca debemos obviar este tipo de mensajes del compilador.

Mi contribución.

Saludos.

Al González. :)
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 22 mayo 2009 - 10:05

Hola, me parece que este hilo bien podria estar en otro foro, por el momento lo paso a General, si alguno de los moderadores considera moverlo hagalo con libertad.

Salud OS
  • 0

#5 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4.945 mensajes
  • LocationMéxico

Escrito 22 mayo 2009 - 10:25

Coincido con todo lo que mencionas Al, solo que mi post estaba orientado a si se debe o no inicializar las variables de clase con Nil tal y como mencionan la documentación o en su defecto puede ser omitida ya que no genera problema alguno.

Omitir warnings para variables de tipo nativo (notese influecia dot net :p ) es una grave práctica.

Saludos.

  • 0

#6 Al González

Al González

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 99 mensajes

Escrito 22 mayo 2009 - 11:15

Coincido con todo lo que mencionas Al, solo que mi post estaba orientado a si se debe o no inicializar las variables de clase con Nil tal y como mencionan la documentación o en su defecto puede ser omitida ya que no genera problema alguno...

Hola de nuevo.  ¿Podrí­as mostrarnos esa documentación?  ¿De qué compilador estamos hablando?

Hay una regla muy sencilla: Una variable local debe ser inicializada solamente si puede darse el caso de que lo primero que le ocurra dentro de la rutina sea una lectura y no una escritura.



delphi
  1. Procedure Proc1 (Const Crear :Boolean);
  2. Var
  3.   F :TForm1;
  4. Begin
  5.   If Crear Then
  6.     F := TForm1.Create (Nil);
  7.  
  8.   If F <> Nil Then  // Puede que llegue aquí­ sin haberse asignado nada a F (¡cuidado!)
  9.     F.Show;
  10. End;
  11.  
  12. Procedure Proc2 (Const Crear :Boolean);
  13. Var
  14.   F :TForm1;
  15. Begin
  16.   If Crear Then
  17.     F := TForm1.Create (Nil)
  18.   Else
  19.     F := Nil;  // Así­ está mejor
  20.  
  21.   If F <> Nil Then  // Esto ya es seguro
  22.     F.Show;
  23. End;
  24.  
  25. // Y en este caso no hay problema porque siempre ocurre la asignación primero
  26. Procedure Proc3 (Const Crear :Boolean);
  27. Var
  28.   F :TForm1;
  29. Begin
  30.   F := FuncionForm ();
  31.  
  32.   If F <> Nil Then
  33.     F.Show;
  34. End;



Espero haber despejado alguna duda.

Saludos.

Al. :)
  • 0

#7 cHackAll

cHackAll

    Advanced Member

  • Administrador
  • 599 mensajes

Escrito 23 mayo 2009 - 10:03

...Para estos últimos casos (que en la práctica son poco frecuentes), es de mucha ayuda desactivar la directiva de compilación "Warn Use_Before_Def", que señaló Javier.  Salvo que debes hacerlo sólo para la rutina en cuestión, ya que de otra manera quedarí­a desactivada también para las rutinas siguientes del archivo de código...


Aunque yo solo mostraba un ejemplo de lo que sucederí­a si ignoraramos por completo dicho mensaje ("Run-Time Check Failure #3"), me parece que lo que comentas es muy importante.

...Una variable local debe ser inicializada solamente si puede darse el caso de que lo primero que le ocurra dentro de la rutina sea una lectura y no una escritura...


El resumen del hilo :D (y)
  • 0




IP.Board spam blocked by CleanTalk.