2010-03-30 9 views
6

Ecco alcuni esempio di classi e proprietà che condividono lo stesso identificativo:Come evitare di utilizzare lo stesso identificatore per nomi di classi e nomi di proprietà?

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; } 

Questo problema si verifica più frequentemente quando si utilizza POCO con Entity Framework come Entity Framework utilizza nome della struttura per le relazioni.

Quindi cosa fare? Utilizzare nomi di classi non standard?

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

Oppure utilizzare più descrittivi Nomi proprietà?

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; } 

Meno che ideale, ma posso conviverci.

O SOLO VIVERE CON IT?

Quali sono le migliori pratiche?

risposta

7

Questo è talvolta noto come il problema "Colore colore" - e il mio consiglio è solo quello di conviverci.

Le specifiche del linguaggio C# sono state progettate per evitare problemi. Dalla sezione 7.5.4.1 del C# 3 spec:

In un accesso membri della forma EI, se E è un unico identificatore, e se il significato di E come un semplice nome (§7.5. 2) variabile locale, o parametro con lo stesso tipo come il significato di E come un nome-tipo (§3.8), quindi entrambi i possibili significati di E sono consentiti. I due significati possibili di E.I non sono mai ambigui, poiché devo necessariamente essere un membro del tipo E in entrambi i casi. In altre parole, la regola semplicemente consente l'accesso ai membri statici e tipi nidificati di E in cui un errore di compilazione altrimenti si verificherà .

(seguita da un esempio.)

Ovviamente quando si possibile fornire un nome di proprietà più descrittivo, che è grande - ma molto spesso il nome più davvero è lo stesso come la proprietà.

Ciò si verifica nel framework stesso - per esempio, è di tipo HttpWebRequest.CookieContainerCookieContainer, e ci sono vari tipi con un Evidence proprietà di tipo Evidence.

3

Provo a utilizzare piuttosto nomi di proprietà più descrittivi.

Cambiare il nome della classe sembra come se stesse vanificando lo scopo, in quanto la maggior parte degli sviluppatori tende a smistare l'uso di nomi di variabili/proprietà validi e descrittivi.

Come nel tuo esempio, ad esempio un indirizzo Acan essere

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

ecc Potete vedere dove im andando con questo.

3

Personalmente non sono timido se il nome della classe e il nome della proprietà coincidono se i nomi sono realmente applicabili. Ad esempio, in una classe Address, una proprietà denominata Country digitata come classe Country ha senso e non esiste alcun nome per la proprietà che non sia ridondante. Cerco di evitare le collisioni usando nomi di proprietà descrittivi, ma a volte il nome per la proprietà e il suo tipo sono i migliori nomi da usare e l'uso di qualsiasi altra cosa diminuisce la chiarezza piuttosto che migliorarla.

Consiglio vivamente contro un prefisso ungherese sulle classi. Questo è semplicemente fugly.

1

Penso che il nome di una proprietà dovrebbe solo descrivere quello che è. Quando si tratta di una Apple, basta chiamarla Apple.

Perché chiunque, solo per la leggibilità delle proprietà, usa gli ungheresi in nomi di classe. Riduce la leggibilità del nome della classe.

Quando si accede alla proprietà, è possibile utilizzare la parola chiave this per impedire a voi stessi di travisamento accidentalmente la proprietà come una classe:

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

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

class Apple 
{ 
} 

Sede SA1101 di StyleCop "verifica che chiama a membri locali sono preceduti dal prefisso della 'Questo.' notazione."

Problemi correlati