2010-03-30 14 views
6

Éstos son algunos ejemplo de las clases y propiedades que comparten el mismo identificador:¿Cómo evitar el uso del mismo identificador para nombres de clases y nombres de propiedades?

public Coordinates Coordinates { get; set; } 
public Country Country { get; set; } 
public Article Article { get; set; } 
public Color Color { get; set; } 
public Address Address { get; set; } 
public Category Category { get; set; } 

Este problema se produce con más frecuencia cuando se utiliza POCO con el marco de la entidad como el marco de la entidad utiliza el nombre de propiedad para las Relaciones.

¿Qué hacer? Use nombres de clase no estándar?

public ClsCoordinates Coordinates { get; set; } 
public ClsCountry Country { get; set; } 
public ClsArticle Article { get; set; } 
public ClsColor Color { get; set; } 
public ClsAddress Address { get; set; } 
public ClsCategory Category { get; set; } 

Yuk

o usar más descriptivos Nombres de propiedades?

public Coordinates GeographicCoordinates { get; set; } 
public Country GeographicCountry { get; set; } 
public Article WebArticle { get; set; } 
public Color BackgroundColor { get; set; } 
public Address HomeAddress { get; set; } 
public Category ProductCategory { get; set; } 

Menos que ideal, pero puedo vivir con eso, supongo.

O SOLO VIVA CON ÉL?

¿Cuáles son sus mejores prácticas?

Respuesta

7

Esto a veces se conoce como el problema de "Color de color", y mi consejo es simplemente vivir con ello.

La especificación del lenguaje C# ha sido diseñada para que esto no sea un problema. Desde la sección 7.5.4.1 de la especificación C# 3:

En un acceso de los miembros de la forma EI, si E es un único identificador, y si el significado de E como un simple nombre-(§7.5. 2) es una constante, campo, propiedad, variable local , o parámetro con el mismo tipo como el significado de E como nombre-tipo (§3.8), entonces ambos posibles significados de E están permitidos. Los dos posibles significados de E.I nunca son ambiguos, ya que necesariamente debo ser miembro del tipo E en ambos casos. En otras palabras, la regla simplemente permite el acceso a los miembros estáticos y tipos anidados de E donde hubiera ocurrido error en tiempo de compilación de lo contrario .

(Seguido de un ejemplo.)

Obviamente cuando puede proporcionar un nombre de propiedad más descriptivo, que es grande - pero muy a menudo el mejor nombre realmente es la misma que la propiedad.

Esto ocurre en el marco en sí - por ejemplo, HttpWebRequest.CookieContainer es de tipo CookieContainer, y hay varios tipos con un Evidence propiedad de tipo Evidence.

3

Intento utilizar nombres de propiedades más descriptivos.

Cambiar el nombre de la clase se siente como que está derrotando el propósito, ya que la mayoría de los desarrolladores tienden a subestimar el uso de buenos y descriptivos nombres de variable/propiedad.

Al igual que en el ejemplo, por ejemplo, una dirección ACAN ser

public Address HomeAddress { get; set; } 
public Address PostalAddress { get; set; } 
public Address CompanyAddress { get; set; } 

etc. Se puede ver donde me voy con esto.

3

Personalmente, no me da vergüenza que el nombre de la clase y el nombre de la propiedad coincidan si los nombres son realmente aplicables. Por ejemplo, en una clase de dirección, tener una propiedad llamada Country que se escribe como una clase llamada Country tiene sentido y realmente no hay ningún nombre para la propiedad que no sea redundante. Intento evitar colisiones usando nombres de propiedades descriptivos, pero a veces el nombre de la propiedad y su tipo son los mejores nombres para usar y usar cualquier otra cosa disminuye la claridad en lugar de mejorarla.

Recomiendo encarecidamente contra un prefijo de tipo húngaro en las clases. Eso es simplemente fugly.

1

Creo que el nombre de una propiedad debería simplemente describir de qué se trata. Cuando se trata de una manzana, simplemente llámale Apple.

¿Por qué alguien, solo para la legibilidad de la propiedad, utiliza los húngaros en los nombres de clase. Disminuye la legibilidad del nombre de clase.

Al acceder a la propiedad, se puede utilizar la palabra clave this para la prevención de sí mismo para leer mal accidentalmente la propiedad como una clase:

class Food 
{ 
    public Apple Apple 
    { 
     get; 
     set; 
    } 

    public void DoIt() 
    { 
     this.Apple = new Apple(); 
    } 
} 

class Apple 
{ 
} 

Ver SA1101 de StyleCop "verifica que llama a los miembros locales se puede anteponer el 'esta.' notación."

Cuestiones relacionadas