Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Creacion de una clase (https://www.clubdelphi.com/foros/showthread.php?t=74228)

mierda 06-06-2011 18:46:22

Creacion de una clase
 
Hola chavales, tengo la siguiente duda

¿que diferencia hay entre definir las variables con property o con funciones y procedures que ataquen a la propiedad? ¿Cual es mejor?

Código Delphi [-]
 
unit Unit2;
interface
type
Tcoche=class
private
// varaiables privadas
cocheMarca:string;
cocheRuedas:integer;
public
// funciones para la variable cocheRuedas
function getRuedas: integer;
procedure setruedas(const Value: integer);
// propiedad marca que guarda y lee de cocheMarca
property marca:string read cocheMarca write cocheMarca;
// propiedad ruedas que lee y guarda en cocheRuedas
property ruedas:integer read getRuedas write setruedas;
// constructor de la clase
constructor create(marcaP:string;ruedasP:integer);
end;
implementation
{ Tcoche }
constructor Tcoche.create(marcaP:string;ruedasP:integer);
begin
      cocheMarca := marcaP;
      cocheRuedas := ruedasP;
end;
function Tcoche.getRuedas: integer;
begin
     getRuedas := cocheRuedas;
end;
procedure Tcoche.setruedas(const Value: integer);
begin
     cocheRuedas := Value;
end;
end.

un saludo y muchas gracias!

ecfisa 06-06-2011 19:08:12

Hola.
Cita:

¿que diferencia hay entre definir las variables con property o con funciones y procedures que ataquen a la propiedad? ¿Cual es mejor?
Siempre que sea posible, es mejor implementar la propiedad modificando en forma directa a un atributo, ya que una llamada a un método es mucho más lenta y costosa en recursos que una asignación a un atributo.

Es decir que es más eficiente:
Código Delphi [-]
  ...
  private
    cocheRuedas:Integer;
  public
    property ruedas:Integer read CocheRuedas write CocheRuedas;
  ...

Que:
Código Delphi [-]
  ...
  private
    cocheRuedas:Integer
    function GetRuedas: Integer;
    procedure SetRuedas(const Value: Integer);
  public
    property ruedas:Integer read GetRuedas write SetRuedas;
  ...


Saludos.

maeyanes 06-06-2011 19:23:23

Hola...

El uso de "setters" y "getters" para definir las propiedades depende mucho de como quieres que se comporten estas. Si solo necesitas que la propiedad guarde un valor, puedes indicarle que use una variable privada:

Código Delphi [-]
TMyClass = class
private
  FName: string;
public  // o published
  property Name: string
    read FName
    write FName;
end;

Pero si quieres que al asignar una propiedad se produzca un efecto secundario (repintar el control) o se calcule el valor de la propiedad, entonces usas los métodos:

Código Delphi [-]
TMyClass = class(TGraphicObject)
private
  FColor: TColor;

  procedure SetColor(Value: TColor);
published
  property Color: TColor
    read FColor
    write SetColor;
end;

implementation

procedure TMyClass.SetColor(Value: TColor);
begin
  if FColor <> Value then
  begin
    FColor := Value;
    Invalidate
  end
end;

Espero que esta pequeña explicación disipe tu duda.


Saludos...

Delphius 06-06-2011 19:27:36

ecfisa podrá ser más rápido pero es una via no demasiado segura.

El uso de los métodos get y set para las propiedades están hechos para dar seguridad e implementar mecanismos de control.
Quizá por naturaleza del problema algunas propiedades no requieran de un método set y/o get pero no por ello hay que argumentar que mientras sea posible hay que evitar el uso de métodos e irse por la lectura y escritura directa en el campo.

Saludos,

Al González 06-06-2011 19:48:51

Cita:

Empezado por ecfisa (Mensaje 402757)
Siempre que sea posible, es mejor implementar la propiedad modificando en forma directa a un atributo, ya que una llamada a un método es mucho más lenta y costosa en recursos que una asignación a un atributo.

Cita:

Empezado por Delphius (Mensaje 402759)
ecfisa podrá ser más rápido pero es una via no demasiado segura.

El uso de los métodos get y set para las propiedades están hechos para dar seguridad e implementar mecanismos de control.
Quizá por naturaleza del problema algunas propiedades no requieran de un método set y/o get pero no por ello hay que argumentar que mientras sea posible hay que evitar el uso de métodos e irse por la lectura y escritura directa en el campo.

Entiendo la interpretación que haces, Marcelo, pero creo que, dado el código puesto por el compañero mierda, lo qué comentó ecfisa va en relación a los métodos que únicamente leen o escriben el valor de la propiedad en un campo privado de la clase. :)

Saludos.

Al.

ecfisa 06-06-2011 19:59:33

Hola Delphius.

No estoy diciendo lo contrario, no afirmé en ningún momento que fuera más seguro asignar directo a un atributo que mediante un método,
sólo digo que es más eficiciente en el caso presentado.
No es posible (o al menos buena práctica) utilizar esa forma de asignación si el valor a modificar es foráneo o si sobre el mismo se deben imponer restricciones de algún tipo, en ese caso, indudablemente se debe asignar mediante un método.

Saludos.

Delphius 06-06-2011 20:38:52

Cita:

Empezado por ecfisa (Mensaje 402765)
Hola Delphius.

No estoy diciendo lo contrario, no afirmé en ningún momento que fuera más seguro asignar directo a un atributo que mediante un método,
sólo digo que es más eficiciente en el caso presentado.
No es posible (o al menos buena práctica) utilizar esa forma de asignación si el valor a modificar es foráneo o si sobre el mismo se deben imponer restricciones de algún tipo, en ese caso, indudablemente se debe asignar mediante un método.

Saludos.

Cita:

Empezado por Al González (Mensaje 402760)
Entiendo la interpretación que haces, Marcelo, pero creo que, dado el código puesto por el compañero mierda, lo qué comentó ecfisa va en relación a los métodos que únicamente leen o escriben el valor de la propiedad en un campo privado de la clase. :)

Saludos.

Al.

Entiendo, había interpretado mal el mensaje. Debería haber leído de nuevo para captarlo.

Saludos,

ecfisa 06-06-2011 21:05:39

Hola de nuevo Delphius.

No no, está muy bién tu acotación.
Yo presupuse que que se sobreentendía y mierda :D (perdón pero me causa) hizo una pregunta por la cuál tendría que haberme dado cuenta que tenía sólo conocimientos básicos sobre el tema. Así que de última el que se limitó al ejemplo dejando un vacío de información fuí yo... ;)

Solamente te quería aclarar que estoy conciente y de acuerdo con vos, que es más seguro vía método por que permite comprobaciónes que serían imposibles hacíendo la asiganción de forma directa.

Es decir, redondeando la idea: Siempre es deseable la eficiencia excepto a costa de sacrificar seguridad.

Saludos.

mierda 07-06-2011 09:39:33

Muchas gracias
 
Muchas gracias a todos los que habéis contestado ... entendido


La franja horaria es GMT +2. Ahora son las 00:45:47.

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