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 metodo Getter e setter sono un odore di codice. Rendere più facile la scrittura di questi è come rendere più facile fallire un test di matematica usando un modulo di Scantron e compilando tutte le "C". Gli oggetti che contengono solo lo stato, per la persistenza, non dovrebbero utilizzare 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 stai preoccupando dello stato di un oggetto (eccetto per la persistenza, anche se questo rompe anche OO), semplicemente non stai facendo OOP e perdi i suoi vantaggi.
Forniscono un'indicazione approssimativa delle prestazioni ai consumatori
Questo è qualcosa che potrebbe cambiare in futuro, per qualsiasi proprietà data. Supponiamo che nella versione 1.0, l'accesso a PropertyX restituisca semplicemente un campo. Nella versione 1.5, se il campo è nullo, PropertyX utilizza il modello Oggetto Nullo per creare un nuovo oggetto nullo. Nella versione 2.0, il campo viene ulteriormente convalidato dal metodo getter in PropertyX.
Poiché la proprietà diventa sempre più complessa, l'indicazione delle prestazioni dell'utilizzo di una proprietà sembra sempre meno veritiera.
Sono migliori 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 occuparsi di questo
Sei sicuro che entrambe le affermazioni precedenti sono vere?
Sono più facili da digitare, man
Certo, digitare myObject.Length
è più semplice che digitare myObject.Length()
, ma non è possibile che sia corretto con un po 'di zucchero sintattico?
Perché utilizzare i metodi anziché le proprietà?
-
Nessuna garanzia di rendimento. L'API rimarrà veritiera anche se il metodo diventa più complesso. Il consumatore dovrà profilare il proprio codice se è in esecuzione per problemi di prestazioni e non fare affidamento su 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, sembra molto simile allo stato. Infatti, se le proprietà fanno troppo, non dovrebbero nemmeno essere proprietà, quindi in realtà le proprietà in uno stato API sono come appaiono ai consumatori.
-
Il programmatore dell'API analizzerà in modo più approfondito i metodi con i valori restituiti ed eviterà di modificare lo stato dell'oggetto in tali metodi, se possibile. La separazione dei comandi dalle query dovrebbe essere applicata ovunque sia possibile.
Quindi ti chiedo, perché usare le proprietà invece dei metodi? La maggior parte dei punti su MSDN sono odori di codice in e di se stessi e non appartengono a nessuno dei due metodi o proprietà.
(Questi pensieri mi sono venuti dopo aver pensato a CQS.)