Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Nombres de atributos de clase y nombres de propiedades (https://www.clubdelphi.com/foros/showthread.php?t=81267)

noob 28-10-2012 21:18:54

Nombres de atributos de clase y nombres de propiedades
 
Hola,

He hecho una clase que tiene un atributo con un nombre igual que su propiedad y la clase hace cosas raras, el método set se llama de manera recursiva y el programa acaba "petando". Os pongo la clase:

Código Delphi [-]
unit uMyClass;

interface

uses
  Classes, SysUtils;

type

  { cMyClass }

  cMyClass = class
    private
      materialName: string;
      function getMaterialName: string;
      procedure setMaterialName(materialName: string);
    public
      property materialName: string read getMaterialName write setMaterialName;
  end;

implementation

{ cMyClass }

function cMyClass.getMaterialName: string;
begin
  Result := materialName;
end;

procedure cMyClass.setMaterialName(materialName: string);
begin
  self.materialName := materialName;
end;

Lo he resuelto renombrando la propiedad a materialNameProp y la clase ya no hace cosas raras, ¿no es posible tener un atributo con el mismo nombre que una propiedad?

Gracias,

noob.

Ñuño Martínez 28-10-2012 21:33:30

Cita:

Empezado por noob (Mensaje 448184)
¿no es posible tener un atributo con el mismo nombre que una propiedad?

Evidentemente no.

Existen una convención que ayuda a evitar estos problemas, y es que las variables privadas dentro de la clase se preceden de la letra "f" (de field) mientras que las funciones y procedimientos que implementan las acciones de asignación y toma de valores de las propiedades se preceden de las palabras get y set, aunque yo suelo usar toma y pon.

De la misma forma, si el parámetro de una función o procedimiento pudiera entrar en conflicto con alguna variable global o una propiedad o cualquier otra cosa, se suele prefijar con la letra "a".

Así quedaría tu clase con esta convención:
Código Delphi [-]
cMyClass = CLASS (TObject)
PRIVATE
   fMaterialName: STRING;
   FUNCTION TomaMaterialName: STRING;
   PROCEDURE PonMaterialName (aMaterialName: STRING);
PUBLIC
  PROPERTY MaterialName: STRING READ TomaMaterialName WRITE PonMaterialName;
END;

De todas formas, si no hay que hacer ninguna operación especial con la asignación de propiedades, es mejor usar la forma directa:
Código Delphi [-]
cMyClass = CLASS (TObject)
PRIVATE
   fMaterialName: STRING;
PUBLIC
  PROPERTY MaterialName: STRING READ fMaterialName WRITE fMaterialName;
END;

Esta forma necesita menos memoria y es de ejecución más rápida (en la mayoría de los casos).

noob 28-10-2012 22:15:18

Muchas gracias Ñuño, perfecta explicación, por cierto, ¿dónde puedo encontrar esas convenciones?

Ñuño Martínez 28-10-2012 22:46:04

Yo leí estas convenciones en la documentación adjunta de Delphi 6. No el manual de desarrollo, sino en una sección de documentación adicional mantenida por Borland. No sé si Embarcadero la mantiene o no.

noob 29-10-2012 00:06:20

He visto la Object Pascal Style Guide, está bastante interesante.

En lo referente a mi pregunta pone:

Begin each type declaration with a capital F, and declare all data types in the private section, using properties or getters and setters to provide public access. For example, use the name GetSomething to name a function returning an internal field value and use SetSomething to name a procedure setting that value.

Ñuño Martínez 29-10-2012 13:22:25

Creo que ese es el documento al que me refiero, noob. :) Aunque no hay que tomárselo al pie de la letra. Me refiero a que son buenas ideas a aplicar si estás cómodo, pero no tomarlo como normas inamovibles.

roman 29-10-2012 16:05:30

Cita:

Empezado por noob (Mensaje 448184)
He hecho una clase que tiene un atributo con un nombre igual que su propiedad y la clase hace cosas raras, el método set se llama de manera recursiva y el programa acaba "petando". Os pongo la clase:

Pero, ¿qué versión de delphi usas? Tal como tenías la clase definida, ni siquiera debía haber compilado. Debió marcarte un error:

Cita:

Identifier redeclared
// Saludos


La franja horaria es GMT +2. Ahora son las 16:34:53.

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