PDA

Ver la Versión Completa : Creacion de una clase


mierda
06-06-2011, 17:46:22
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?


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, 18:08:12
Hola.
¿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:

...
private
cocheRuedas:Integer;
public
property ruedas:Integer read CocheRuedas write CocheRuedas;
...


Que:

...
private
cocheRuedas:Integer
function GetRuedas: Integer;
procedure SetRuedas(const Value: Integer);
public
property ruedas:Integer read GetRuedas write SetRuedas;
...



Saludos.

maeyanes
06-06-2011, 18: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:


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:


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, 18: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, 18:48:51
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.
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, 18: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, 19:38:52
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.

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, 20: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, 08:39:33
Muchas gracias a todos los que habéis contestado ... entendido