Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 25-02-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
Paso de valores hacia propiedades

Mi curiosidad me tiene intrigado... pues yo no he notado diferencia entre el paso de valores de propiedades hacia las viarables privadas correspondientes. Verán.... cuando uno declara propiedades para una clase hce algo como:

Código Delphi [-]
miclase = class
  private
    fpropiedad1: integer;
    fpropiedad2: integer;
    procedure SetPropiedad1(const Value: integer);
    procedure SetPropiedad1(const Value: integer);
  public
    property Propiedad1: integer read fpropiedad1 write SetPropiedad1;
    property Propiedad1: integer read fpropiedad1 write SetPropiedad1;

Lo normal en un procedimiento Setxxxx es:

Código Delphi [-]
if Value <> FPropiedad1
  then FPropiedad1 := Value;

Hasta allí todo bien.
Ahora supongamos que al setear el valor de la propiedad2, hay que cambiar el de propiedad1. Y es aquí donde tengo una curiosidad: ¿Es lo mismo hacer esto:

Código Delphi [-]
if Value <> FPropiedad2
  then begin
           FPropiedad2 := Value;
           FPropiedad1 := FPropiedad2 div 2; // es por poner un ejemplo...
         end;

que esto otro?:

Código Delphi [-]
if Value <> FPropiedad2
  then begin
           FPropiedad2 := Value;
           Propiedad1 := FPropiedad2 div 2; // es por poner un ejemplo...
         end;

¿Se vé la diferencia? El primero se cambia en forma directa hacia la variable privada. El segundo hace que dispare el procedimiento SetPropiedad1.

No hay error en el código... ¿Pero cual método es mejor? ¿Habrá algún efecto colateral el que pase (o no pase) el valor en forma directa hacia la variable privada? Por poner un ejemplo extremo: supongamos que hay 20 propiedades y que el cambio de una de ellas haga que se propage una serie de cambios en el resto... ¿se notará algún efecto?

También estuve pensando de que internamente el compilador traduce a cada Propiedad := Valor por el SetPropiedad. Pero si uno omite la declaración de SetPropiedad.... ¿ahora.... en que quedamos?

Bueno, espero que se me entienda... es una curiosidad que me viene picando desde hace tiempo.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
  #2  
Antiguo 25-02-2007
Avatar de Crandel
[Crandel] Crandel is offline
Miembro Premium
 
Registrado: may 2003
Ubicación: Parana, Argentina
Posts: 1.475
Poder: 23
Crandel Va por buen camino
Como vos mismo escribiste en Propiedad2, el metodo set puede hacer algo mas que solo setear el valor de la propiedad, por lo que es preferible siempre hacerlo por el segundo metodo que expusiste. Siempre y cuando en el metodo Set de la propiedad 1 no llames a Propiedad2 de nuevo.
__________________
[Crandel]
Responder Con Cita
  #3  
Antiguo 25-02-2007
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 29
Lepe Va por buen camino
Como bien dices hay que tener cuidado.

Si tienes un método "SetPropiedad2" es porque haces algo más que cambiar el valor a FPropiedad2. Si cambias el valor a Fpropiedad1 por la cara, te queda el resto de código sin sincronizar.

Cuando al cambiar una propiedad en el método Set afecta a otras propiedades y no puedes usar "Propiedad1 := Fpropiedad2 div 2" porque entra en recursión las asignaciones, hay que crear un método aparte:

Código Delphi [-]
miclase = class
  private
    fpropiedad1: integer;
    fpropiedad2: integer;
    procedure SetPropiedad1(const Value: integer);
    procedure SetPropiedad2(const Value: integer);
    procedure DoCambioPropiedad1;
  public
    property Propiedad1: integer read fpropiedad1 write SetPropiedad1;
    property Propiedad2: integer read fpropiedad2 write SetPropiedad2;
  end;

implementation

procedure SetPropiedad2(value: integer);
begin
if Value <> FPropiedad2
  then begin
           FPropiedad2 := Value;
           DoCambioPropiedad1;
         end;
end;

procedure DoCambioPropiedad1;
begin
   // aqui cambias el valor de la propiedad 1 y haces que se refleje
  // el cambio en el resto de propiedades que se vean afectadas
  Fpropiedad1 := Fpropiedad2 div 2;  // siguiendo el ejemplo.

   //  aquí usarías solo las variables privadas Fpropiedad1, Fpropiedad2 hasta 
  //   FPropiedad20 así evitas que se entre en recursión las asignaciones y te 
 //    quitas un poco de lío conceptual.
end;
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #4  
Antiguo 25-02-2007
Avatar de Delphius
[Delphius] Delphius is offline
Miembro Premium
 
Registrado: jul 2004
Ubicación: Salta, Argentina
Posts: 5.582
Poder: 25
Delphius Va camino a la fama
gracias

Muchas gracias Crandel y Lepe. Me han sacado una buena duda curiosa. Me pasa a veces de que en métodos Set hago FPropiedad := xxxx y en otras Propiedad := xxxx. Y esto se me hizo confuso. Y traté de analizar las posibles consecuencias que podrían afectar este pequeñisimo detalle:

[HUMOR]
Cita:
¿Poner la F de privada o no poner... esa es la cuestión?
[/HUMOR]

Pero como sólo soy un simple novato, decidí hacer la pregunta a gente que sabe del tema.

Saludos,
__________________
Delphius
[Guia de estilo][Buscar]
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Mi programa de facturación paso a paso Delphitest Varios 234 04-11-2013 09:41:02
Como cambiar valores en la ventana "General" propiedades del sistema JuanErasmo API de Windows 52 17-02-2012 17:42:20
ayuda paso a paso Shared Connection eangeles Providers 0 09-11-2006 02:06:04
Novato (Paso a Paso de una consulta) enecumene Conexión con bases de datos 2 29-05-2006 20:52:19
Como puedo Modificar los valores de las propiedades de un ejecutable DML Varios 4 07-05-2003 21:39:03


La franja horaria es GMT +2. Ahora son las 14:59:04.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi