Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-10-2012
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
Question 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.
Responder Con Cita
  #2  
Antiguo 28-10-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
Cita:
Empezado por noob Ver Mensaje
¿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).
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #3  
Antiguo 28-10-2012
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
Question

Muchas gracias Ñuño, perfecta explicación, por cierto, ¿dónde puedo encontrar esas convenciones?
Responder Con Cita
  #4  
Antiguo 28-10-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #5  
Antiguo 29-10-2012
noob noob is offline
Miembro
 
Registrado: sep 2008
Posts: 212
Poder: 16
noob Va por buen camino
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.
Responder Con Cita
  #6  
Antiguo 29-10-2012
Avatar de Ñuño Martínez
Ñuño Martínez Ñuño Martínez is offline
Moderador
 
Registrado: jul 2006
Ubicación: Ciudad Catedral, Españistán
Posts: 6.000
Poder: 25
Ñuño Martínez Tiene un aura espectacularÑuño Martínez Tiene un aura espectacular
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.
__________________
Proyectos actuales --> Allegro 5 Pascal ¡y Delphi!|MinGRo Game Engine
Responder Con Cita
  #7  
Antiguo 29-10-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por noob Ver Mensaje
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
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

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
Nombres de Poblaciones muli Varios 1 12-04-2007 14:12:02
Nombres ... gluglu Humor 10 21-06-2006 19:24:51
ordernar nombres y evitar nombres repetidos en DBLookupComboBox @-Soft Conexión con bases de datos 4 14-01-2004 17:30:51
Nombres e Tablas buitrago Varios 1 16-12-2003 02:55:33


La franja horaria es GMT +2. Ahora son las 15:28: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