2009-08-13 10 views
13

Ogniqualvolta vi è una domanda sulla credibilità delle proprietà, vedo che la maggior parte della discussione avviene attorno a funzioni/metodi e proprietà. Ma vorrei anche sapere il convincente motivo di utilizzare la proprietà con il campo privata associata vs campo pubblico direttamente in sé, in caso di comportamenti più comuni get/set con nessun altro trattamento, voglio dire in questo modoProprietà (senza elaborazione aggiuntiva) vs campo pubblico

public string CustomerName; 

vs

private string customerName; 
public string CustomerName 
{ 
get{return customerName;} 
set(string value){this.customerName=value;} 
} 
+5

Puoi anche fare "public string CustomerName {get; set;}" – cyberconte

risposta

22

si ottiene fonte/compatibilità binaria se in seguito bisogno di aggiungere altro comportamento, si ottiene di aggiungere punti di rottura, ed è solo filosoficamente più pulita (attenzione sul comportamento, non il meccanismo di archiviazione).

Si noti che non è necessario l'intero di quest'ultimo blocco in C# 3:

public string CustomerName { get; set; } 

Vedi my article on "Why Properties Matter" per ulteriori informazioni.

+0

Jon..Vedo il tuo punto. Ma in qualche modo ho sentito che il codice sarebbe stato più pulito in altri modi, ad esempio, se ci sono più campi in classe (diciamo 30+), il numero di righe di codice sarebbe almeno 4 volte superiore con le proprietà. Ora le proprietà automatiche in C# 3 e in VB 10 ci rendono felici tutti !!! – Raj

+7

Se nella tua classe ci sono 30 campi, dovresti probabilmente usare più incapsulamento per iniziare. –

+1

Giusto per confermare se ho capito bene sull'incapsulamento, raggruppando sottoinsiemi logici dei grandi campi in una singola classe in diverse classi/interfacce e ottenendoli tramite ereditarietà o composizione. È corretto? In tal caso, ciò conterrebbe ancora un carico aggiuntivo di codice distribuito in classi diverse piuttosto che in una classe. Scusa se ti sto infastidendo con sciocchezze. Tutto ciò è dovuto alla mia frustrazione nel mantenere migliaia di righe di codice (con molte proprietà senza logica extra) scritte da qualcun altro. – Raj

3
  1. È possibile ignorare o almeno creare una "nuova" proprietà in una classe derivata

  2. A questo punto la gente si aspetta di immobili da essere esposti e campi da nascondere. Se qualcuno rifletterà sulla tua classe (diventando sempre più comune con strumenti come Castle Windsor, NHibernate) c'è un mondo di differenza, probabilmente non controlleranno i campi esposti.

1

È inoltre possibile fornire alcune convalida di base con proprietà. Ad esempio, per evitare che la fissazione di un immobile ad uno stato non valido come un valore negativo per un altezza:

private int height; 
public int Height 
{ 
    get{ return height; } 
    set 
    { 
    if (value > 0) 
    { 
     height = value; 
    } 
    } 
} 
+1

Concordo sul fatto che qualsiasi elaborazione aggiuntiva come la convalida rende ovvio l'uso delle proprietà. Questo è il motivo per cui ho menzionato espressamente il caso di tale elaborazione extra. – Raj

2

Questo è principalmente un bug in Java. In molti altri linguaggi (Python, Delphi, Groovy), il compilatore genererà i getter e setter per te a meno che non sia tu fornisca il codice.

Ciò significa che è possibile utilizzare un campo "pubblico" in Groovy e il compilatore genererà e invocherà automaticamente il setter/setter. Se hai bisogno di fare magie aggiuntive quando un campo viene cambiato, puoi introdurre un setter specializzato e tutto funzionerà.

È una di quelle cose in cui la realtà si scontra con un design. I progettisti Java non volevano che il compilatore facesse qualcosa che non si può vedere. Quella che sembrava una buona idea molti anni fa, non andò troppo bene.

+0

Nota: alla domanda mancava originariamente un tag di linguaggio, quindi questa risposta presuppone che il codice nella domanda sia Java; il tag [tag: C#] è stato aggiunto in seguito. – mklement0

2

Noto un uso utile della proprietà. Se si intende associare la raccolta del proprio oggetto a un oggetto DataGrid o DataGridView o un altro controllo associabile, gli unici nomi valutabili riconosciuti sono Proprietà e non campi pubblici.

Problemi correlati