Ecco alcuni argomenti per le proprietà e i miei argomenti contrari:
Più facile da usare rispetto alla scrittura di metodi getter e setter
Le coppie di metodi getter e setter sono un odore di codice. Rendere più semplice la scrittura di questi è come rendere più semplice il fallimento di un test di matematica utilizzando un modulo Scantron e compilando tutte le "C". Gli oggetti che contengono solo stato, per persistenza, non dovrebbero usare getter / setter e dovrebbero creare oggetti immutabili al momento della persistenza.
Ciò che è importante per un consumatore di un oggetto è ciò che fa, non come lo fa. Il suo comportamento è quello che fa; il suo stato è come lo fa. Se ti trovi a preoccuparti dello stato di un oggetto (tranne che per la persistenza, anche se questo rompe anche OO), semplicemente non stai facendo OOP e perdendo i suoi vantaggi.
Forniscono un'indicazione approssimativa delle prestazioni ai consumatori
Questo è qualcosa che potrebbe cambiare in futuro, per una determinata proprietà. Supponiamo che nella versione 1.0, l'accesso a PropertyX restituisca semplicemente un campo. Nella versione 1.5, se il campo è null, PropertyX utilizza il modello Null Object per creare un nuovo oggetto null. Nella versione 2.0, il campo viene ulteriormente convalidato dal metodo getter in PropertyX.
Man mano che la proprietà diventa sempre più complessa, l'indicazione delle prestazioni dell'uso di una proprietà sembra sempre meno veritiera.
Sono meglio dei campi pubblici
Questo è vero. Ma anche i metodi.
Rappresentano un aspetto fondamentalmente diverso di un oggetto rispetto a un metodo, e tutti i consumatori dell'oggetto dovrebbero preoccuparsene
Sei sicuro che entrambe le affermazioni sopra riportate siano vere?
Sono più facili da scrivere, amico
Certo, la digitazione myObject.Length
è più semplice della digitazione myObject.Length()
, ma non potrebbe essere risolta con un po 'di zucchero sintattico?
Perché usare metodi invece di proprietà?
Nessuna garanzia di prestazione. L'API rimarrà veritiera anche se il metodo diventa più complesso. Il consumatore dovrà profilare il proprio codice se sta eseguendo problemi di prestazioni e non fare affidamento sul word-of-API.
Meno per il consumatore a cui pensare. Questa proprietà ha un setter? Un metodo sicuramente no.
Il consumatore sta pensando da una corretta mentalità OOP. Come consumatore di un'API, sono interessato a interagire con il comportamento di un oggetto. Quando vedo le proprietà nell'API, assomiglia molto allo stato. In effetti, se le proprietà fanno troppo, non dovrebbero nemmeno essere proprietà, quindi in realtà le proprietà in uno stato ARE API sono come appaiono ai consumatori.
Il programmatore dell'API rifletterà più approfonditamente sui metodi con valori di ritorno ed eviterà di modificare lo stato dell'oggetto in tali metodi, se possibile. La separazione dei comandi dalle query dovrebbe essere forzata laddove possibile.
Quindi ti chiedo, perché usare le proprietà invece dei metodi? La maggior parte dei punti su MSDN sono odori di codice in sé e per sé e non appartengono a proprietà o metodi.
(Questi pensieri mi sono venuti in mente dopo aver pensato al CQS.)
type GetFoo() void SetFoo()
diecimila volte. In tutto il mio tempo a scrivere codice C # non sono mai stato confuso da una proprietà.