<?xml version="1.0" encoding="UTF-8" standalone="yes"?><oembed><version><![CDATA[1.0]]></version><provider_name><![CDATA[Arialdo Martini]]></provider_name><provider_url><![CDATA[https://arialdomartini.wordpress.com]]></provider_url><author_name><![CDATA[Arialdo Martini]]></author_name><author_url><![CDATA[https://arialdomartini.wordpress.com/author/arialdomartini/]]></author_url><title><![CDATA[Property o Get&nbsp;Method?]]></title><type><![CDATA[link]]></type><html><![CDATA[<p>Se il codice dietro un getter dovesse diventare particolarmente elaborato sarebbe più corretto spostarlo dentro un ordinario metodo? È corretto che un <i>accessor method</i> (cioè un metodo che, almeno idealmente, dovrebbe servire per esporre un field dello stato interno della classe al mondo esterno) faccia elaborazioni non banali, come visitare un grafo di oggetti?</p>
<p>Cercando una risposta a questa domanda (probabilmente futile ed accademica) possono essere fatte alcune considerazioni forse poco prevedibili.<br />
<!--more--></p>
<h1>Public field, Property, getter e setter</h1>
<p>Qual è la differenza tra queste tre modalità di esporre un numero intero in una classe?</p>
<p><strong>Con un public field</strong></p>
<pre>class MyClass
{
  public int Numero;
}</pre>
<p><strong>Con una coppia di metodi Getter/Setter</strong></p>
<pre>class MyClass
{
  protected int Numero;
  public int GetNumero()
  {
    return Numero;
  }
  public void SetNumero(int numero)
  {
    Numero = numero;
  }
}</pre>
<p><strong>Con una Property</strong></p>
<pre>class MyClass
{
  public int Numero { get; set; }
}</pre>
<p>Fondamentalmente, sono tre i vantaggi nell&#8217;uso delle Property o dei getter e dei setter rispetto a quello del field pubblico:</p>
<ul>
<li>la possibilità di aggiungere codice arbitrario da eseguire al momento dell&#8217;assegnazione e della lettura del valore</li>
<li>la possibilità di implementare valori a sola lettura o a sola scrittura</li>
<li>la possibilità di fare l&#8217;override dei metodi, ad esempio durante il mocking della classe</li>
</ul>
<p>Ad esempio, mentre il field si limita ad esporre direttamente la variabile <tt>int</tt>, con gli ultimi due meccanismi è possibile realizzare facilmente un campo calcolato:</p>
<pre>class MyClass
{
  protected string Nome;
  protected string Cognome;
  public virtual string GetNomeCompleto()
  {
    return string.Format("{0} {1}", Nome, Cognome);
  }</pre>
<p>oppure equivalentemente</p>
<pre>class MyClass
{
  protected string Nome;
  protected string Cognome;
  public virtual string NomeCompleto
  {
    get
    {
      return string.Format("{0} {1}", Nome, Cognome);
    }
  }</pre>
<p>In entrambi i casi si è realizzato un campo a sola lettura.</p>
<p>Il mocking si realizza facilmente, anche senza apposite librerie, tramite l&#8217;overriding.</p>
<pre>class MyMock : MyClass
{
  override public string GetNomeCompleto()
  {
    return "Mocked";
  }
}</pre>
<h2>Property o metodo?</h2>
<p>Utilizzare le Property (supponiamo da qui in avanti di utilizzare C#, che le supporta) è considerata una buona pratica.</p>
<p>In alcuni casi, tuttavia, capita di domandarsi se sia preferibile ricorrere ad una Property oppure un metodo pubblico. Il dubbio può nascere qualora il codice incapsulato nella clausola <tt>get</tt> sia particolarmente articolato.</p>
<p>Ad esempio, supponiamo di aver modellato una fattura con una classe <tt>Fattura</tt> che conservi una collezione di voci di dettaglio, in questo modo:</p>
<pre>class Fattura
{
  protected ICollection&lt;Dettaglio&gt; Dettagli;
}

class Dettaglio
{
  public int Quantita { get; set; }
  public int Sconto { get; set; }
  public double Prezzo { get; set; }
}</pre>
<p>Supponiamo che si voglia esporre in <tt>Fattura</tt> un qualcosa che permetta di ricavare il valore (con IVA) ricavato dal totale di tutte le voci di dettaglio. Il codice per il calcolo potrebbe essere qualcosa di simile:</p>
<pre>double totale = 0;
foreach(var dettaglio in Dettagli)
{
  totale += (dettaglio.Quantita * dettaglio.Prezzo) * (1 - dettaglio.Sconto/100);
}
return totale * (1+0.2);</pre>
<p>Il codice potrebbe essere ancora più complesso ed includere, ad esempio, chiamate ad un ORM per il recupero dei dettagli.</p>
<p>La domanda è: è più corretto incapsulare il codice in una Property o in un metodo?<br />
È più giusto, insomma, consultare quel valore con</p>
<pre>double totale = fattura.CalcolaTotale()</pre>
<p>o con</p>
<pre>double totale = fattura.Totale</pre>
<p>?</p>
<h2>Punti di vista</h2>
<p>La risposta più sensata, nella maggioranza dei casi, è &#8220;<em>fa lo stesso, chi se ne frega: è una questione di lana caprina</em>&#8220;.</p>
<p>Tuttavia, da quando si è passati dalla programmazione procedurale a quella ad oggetti, e da quella ad elaborare i pattern volti a disaccoppiare gli oggetti, da questi all&#8217;<a title="Inversion of Control" href="http://en.wikipedia.org/wiki/Inversion_of_control" target="_blank">Inversion of Control</a>, per arrivare alla <a title="guerra contro gli if" href="http://www.antiifcampaign.com">guerra contro gli if</a>, ai linguaggi che <a title="eliminano i punti e virgola" href="http://groovy.codehaus.org/" target="_blank">eliminano i punti e virgola</a> e <a title="FAQ" href="http://www.secnetix.de/olli/Python/block_indentation.hawk" target="_blank">FAQ</a> per placare le guerre di religione tra indentisti e parentesisti, è evidente che la programmazione ad oggetti, da mera tecnica di programmazione, sia diventata anche una filosofia di pensiero, un approccio stilistico ed estetico.</p>
<p>Se ci si pensa, in effetti, le Property di C# sono poco più che <a title="Zucchero sintattico" href="http://en.wikipedia.org/wiki/Syntactic_sugar" target="_blank">zucchero sintattico</a> che risparmia agli sviluppatori C# gli inestetici getter e setter.<br />
Per dirla con tutta onestà, anzi, si deve ammettere che, <em>tecnicamente</em>, l&#8217;unica differenza tra una Property e un ordinario metodo è l&#8217;impossibilità di fornire argomenti. Di fatto, sempre parlando da un punto di vista strettamente tecnico, una Property è una coppia di due metodi, uno con un solo argomento che ritorna void ed uno senza argomenti: uno può restituire qualsiasi tipo, entrambi possono disporre di implementazioni arbitrariamente complesse; la Property, come un metodo, può essere mockato, può lanciare eccezioni, può entrare in loop infiniti, può accedere al database e perfino formattare l&#8217;hard disk.</p>
<p>Evidentemente, il motivo che ha spinto i progettisti di linguaggi ad introdurre le Property come alternativa ai getter e setter è più filosofica ed estetica che tecnica.</p>
<p>Se i progettisti di C# hanno deciso per l&#8217;uso delle Property e quelli di Java no (decretando per quest&#8217;ultimo la fama di &#8220;linguaggio datato&#8221;), forse, lana caprina per lana caprina, vale comunque la pena di discuterne.</p>
<h2>Le Property sono meglio dei getter e dei setter</h2>
<p>In C#, l&#8217;unico contratto che è possibile stabilire nell&#8217;interazione tra oggetti è definibile tramite le interfacce.</p>
<p>Nei linguaggi <a title="Duck Typed" href="http://en.wikipedia.org/wiki/Duck_typing">Duck Typed</a> come PHP è possibile dichiarare un metodo come</p>
<pre>function RestituisciQualcosa($oggetto)
{
  return $this-&gt;qualcosaltro;
}</pre>
<p>che, di fatto, accetta argomenti di qualsiasi tipo e restituisce tipi arbitrariamente definibili a runtime. PHP non richiede nemmeno di dichiarare quale sia il tipo restituito: lo valuta durante l&#8217;esecuzione.</p>
<p>Altri linguaggi sono più rigorosi e richiedono che lo sviluppatore dichiari un contratto di utilizzo del metodo: quali tipi accettare in ingresso e quale tipo restituire.</p>
<p>Altri linguaggi vanno perfino oltre: lo sviluppatore può raffinare il contratto dichiarando alcune <em>constraint</em> cui i parametri di ingresso e di uscita debbono sottostare. Ad esempio, un metodo può dichiarare di accettare solo valori interi tra 2 e 20.</p>
<p>Le Property servivano a questo: a garantire, se non a <em>compile-time</em> almeno a <em>run-time</em>, che un field garantisse certe constraint.</p>
<p>Ad esempio, per un campo rappresentante una valuta da incassare, una Property rappresentava una gran comodità per il fatto di poter essere espressa così:</p>
<pre>double Prezzo
{
  get
  {
    return _prezzo;
  }
  set
  {
    if ( value &lt; 0 )
      throw new WrongPriceException("Un prezzo negativo significa che devo darti soldi. Giammai");
    else
      _prezzo = value;
  }
}</pre>
<p>La stessa cosa la si sarebbe potuta ottenere con una coppia getter/setter.<br />
Ma la Property ha rispetto a getter e setter un grosso vantaggio: appare <em>semanticamente</em> come un ordinario attributo. L&#8217;utente, l&#8217;utilizzatore della classe, non percepisce che dietro a <tt>double Prezzo</tt> ci sia del codice: lo vede alla stregua di un normalissimo field pubblico.</p>
<p>Esteticamente ha molto più senso un</p>
<pre>double costoTotale = articolo.Prezzo + costoDiSpedizione;</pre>
<p>piuttosto che un inestetico</p>
<pre>double costoTotale = articolo.GetPrezzo() + costoDiSpedizione;</pre>
<p>Perché <tt>Prezzo</tt> deve essere un metodo? Solo perché <tt>articolo</tt> deve eseguire del codice per calcolarlo? E chi se ne frega: problemi suoi. Io volevo un &#8220;prezzo&#8221;, non un &#8220;getPrezzo()&#8221;. In qualche modo, sono legato all&#8217;implementazione della classe di <tt>articolo</tt>.</p>
<p>La Property risolve questo problema estetico: l&#8217;utilizzatore della classe può trattare tutti i valori esposti dalla classe come se fossero field, ignorando se abbiano o meno del codice dietro. Sono numeri, sono stringhe, sono valori: non sono &#8220;azioni da compiere&#8221;.</p>
<p>E, soprattutto, possono essere trattati uniformemente, che vadano scritti o che vadano letti.<br />
Mai più</p>
<pre>if(articolo.GetPrezzo() &lt; 100)
{
  // aumenta il ricarico
  articolo.SetPrezzo(articolo.GetPrezzo() + 20);
}</pre>
<p>ma un più elegante, leggibile e logico</p>
<pre>if(articolo.Prezzo &lt; 100)
  articolo.Prezzo += 20;</pre>
<p>Se dietro alla Property <tt>Prezzo</tt> ci sia o no del codice, è un problema completamente incapsulato dentro la classe di <tt>articolo</tt>.</p>
<p>Secondo Allen Holub getter e setter (gli antenati delle Property) esistono per un motivo perfino più demenziale.<br />
Sono nati nel contesto delle librerie per gestire widget e finestre, dove i tool di UI-builder, per facilitare il proprio lavoro, avevano bisogno di ricavare, tramite reflection, alcune proprietà interne delle classi.<br />
Per facilitare l&#8217;accesso alle proprietà interne, gli sviluppatori delle librerie riempivano le classi di metodi accessor, cioè di getter e setter, di metodi che rompevano il principio di incapsulamento per esporre al mondo esterno lo stato interno della classe.</p>
<p>Gli altri sviluppatori hanno iniziato a prendere la cattiva abitudine di utilizzare i metodi accessor e, peggio, di sviluppare le proprie classi imitando lo stesso design pattern.</p>
<p>Per evitare il diffondersi di questa cattiva abitudine, Java 1.5 prometteva di introdurre degli appositi metadata per evitare di scrivere codice che violasse clamorosamente il principio di incapsulamento come:</p>
<pre>private int property;
public int getProperty  (         ){ return property; }
public void setProperty (int value}{ property = value; }</pre>
<p>consentendo un più pulito</p>
<pre>private @property int property;</pre>
<p>Si noti che qui il field è decorato come <tt>@property</tt> ma questo non significa che sia pubblico: per il mondo esterno è a tutti gli effetti <tt>private</tt>. La libreria di UI è in grado, tramite l&#8217;introspezione, di individuare il campo indicato come <tt>@property</tt>. Ma l&#8217;implementazione resta correttamente incapsulata e rigorosamente privata.</p>
<p>È un concetto assai diverso dalle Property di C# che sono pensate per essere <tt>public</tt>.<br />
Ma è noto: nel mondo Java le scelte sono così oculate (e lente) che l&#8217;ebefrenica corsa verso l&#8217;ultima novità di C#, anche se poco ragionata e dettata da mode, fa meritare al buon vecchio Java il titolo di linguaggio deprecato.</p>
<p>Secondo i principi più puri dell&#8217;Object Oriented, Property e accessor method dovrebbero consentire l&#8217;accesso al campo interno solo in termini di interfaccia: in nessun caso si dovrebbe consentire l&#8217;accesso diretto al campo interno. Solo in questo modo l&#8217;implementazione (in questo caso, il tipo del campo interno) può essere protetta dal codice esterno.</p>
<p>Problemi che probabilmente si pongono solo gli accademici e i filosofi, visto che Visual Studio nell&#8217;estrarre l&#8217;interfaccia da una classe propone un &#8220;Select all&#8221; per esporre tutto lo stato interno, con buona pace del barbuto Holub.</p>
<h2>Le Property fanno schifo</h2>
<p>In <a title="Smalltalk by Example: The Developer's Guide" href="http://www.amazon.com/Smalltalk-Example-Developers-Alec-Sharp/dp/0079130364" target="_blank">Smalltalk by Example: the Developers Guide</a> Alec Sharp introduce un&#8217;incisiva prospettiva intorno alla programmazione orientata agli oggetti:</p>
<blockquote><p>Procedural code gets information then makes decisions. Object-oriented code tells objects to do things.</p></blockquote>
<p>Sullo stesso argomento Allen Holub sostiene:</p>
<blockquote><p>Don&#8217;t ask for the information you need to do the work; ask the object that has the information to do the work for you</p></blockquote>
<p>Ha un senso.</p>
<p>Elaborando questo principio (&#8220;<em>Tell, Don&#8217;t Ask</em>&#8220;) si dovrebbe concludere che, in una buona architettura Object Oriented, un oggetto dovrebbe nascondere il proprio stato interno ed esporre solo metodi che permettano ai propri utilizzatori di invocare delle azioni.</p>
<p>È la logica conseguenza.</p>
<p>È il concetto espresso da Allen Holub quando, con una certa dose di provocatorio coraggio, enuncia le proprie argomentazioni sul perché <a title="Getters and Setters are evil" href="http://www.javaworld.com/javaworld/jw-09-2003/jw-0905-toolbox.html">i metodi getter and setter siano Il Male</a> (si tratta di un articolo lunghissimo e meraviglioso, letteralmente fitto di illuminanti considerazioni: un must).</p>
<p>I fan di Allen Holub sono più tabelani del loro idolo. In un <a title="Getter and Setters are evil riassunto" href="http://codeweavers.wordpress.com/2011/04/18/getters-and-setters-are-evil/" target="_blank">interessante commento</a> a &#8220;<em>Why getter and setter methods are evil</em>&#8221; si afferma:</p>
<blockquote><p>A business object should [be] property free, or at least only updateable from the outside world by asking it to do something. Its internal state may be internal to the class itself [&#8230;]</p></blockquote>
<p>Insomma, se abbiamo bisogno che oggetto faccia qualcosa, ordiniamogli di farlo: in nessun caso dovremmo essere autorizzati a infilare il naso nel suo stato interno e, meno che mai, a modificarlo.</p>
<p>Prendiamo un oggetto definito dalla classe</p>
<pre>class MyClass
{
  <strong>public</strong> int StatoInterno;
  public void CambiaLoStatoInterno()
  {
    this.StatoInterno = [...] // codice 
  }
}</pre>
<p>È evidente che l&#8217;obiettivo dello sviluppatore, nel definire il metodo <tt>CambiaLoStatoInterno()</tt>, sia quello di <em>incapsulare lo stato interno</em> dell&#8217;oggetto e garantire che questo sia totalmente sotto il controllo della classe stessa. Gli utilizzatori esterni possono dire all&#8217;oggetto <em>cosa fare</em>, ed eventualmente l&#8217;oggetto valuta se cambiare il proprio stato interno.</p>
<p>Fatalmente, il semplice fatto di esporre il field <tt>StatoInterno</tt> permette al mondo esterno di cambiare a piacimento lo stato interno dell&#8217;oggetto, aggirando eventualmente le regole di business. Questo, a detta di alcuni, è <em>il male</em>.</p>
<p>Meglio sarebbe</p>
<pre>class MyClass
{
  <strong>protected</strong> int StatoInterno;
  public void CambiaLoStatoInterno()
  {
    this.StatoInterno = [...] // codice 
  }
}</pre>
<p>A che pro, allora, avere getter, setter e Property?</p>
<p>È chiaro che il discorso sia un po&#8217; estremo. Il principio, tuttavia, è meritevole di una certa considerazione. Il concetto è:</p>
<blockquote><p>L&#8217;unico modo per modificare lo stato interno di un oggetto deve essere tramite l&#8217;invocazione di azioni definite dalla logica di business</p></blockquote>
<p>oppure</p>
<blockquote><p>Non deve esistere modo di cambiare lo stato interno di un oggetto violando le regole di business.</p></blockquote>
<p>Ha un senso.</p>
<p>Nascondere lo stato interno, evitando di pubblicare le proprietà della classe, serve anche a contenere le dipendenze: se una proprietà (un elemento dello stato interno dell&#8217;oggetto) è pubblica è esposta al rischio che venga utilizzata da altre classi; in altre parole, più proprietà pubbliche ha la classe, più è probabile che queste vengano utilizzate dal resto del mondo.<br />
Questo significa che qualora si decidesse di modificare l&#8217;implementazione della classe cambiando il tipo di uno degli elementi del suo stato interno (operazioni che uno sviluppatore dovrebbe prendere in piena libertà, trattandosi di stato interno della classe e non di interfaccia), si rischierebbe di trovarsi in un inferno di dipendenze. Il solo cambiare il campo <tt>X</tt> da <tt>int</tt> a <tt>double</tt>, fa notare Holub, potrebbe comportare migliaia di errori di compilazione. L&#8217;aver esposto l&#8217;implementazione interna al mondo esterno, sostiene, è una leggerezza di design che può costare. E per la quale andrebbero valutati i pro e i contro in fase di design.</p>
<p>Il concetto è: se la classe espone un&#8217;interfaccia, con tutti i metodi che permettono di invocare azioni che eventualmente modificano lo stato interno, non c&#8217;è alcuna necessità stringente di pubblicare anche lo stato interno. Farlo espone a rischi. I getter ed i setter sono pericolosi per lo stesso motivo per cui sono pericolosi i field pubblici: espongono al codice esterno l&#8217;implementazione della classe, violando il principio di incapsulamento.<br />
In un certo senso, siccome getter e setter violano il principio di incapsulamento, il codice che utilizzi getter e setter andrebbe considerato <em>non object oriented</em>. Ne&#8217; più ne&#8217; meno.</p>
<p>Commentando l&#8217;articolo &#8220;Getter and Setters are evil&#8221; su <a title="You-should-never-use-get-set-functions---is-he-correct" href="http://stackoverflow.mobi/question996179_Allen-Holub-wrote--You-should-never-use-get-set-functions---is-he-correct-.aspx">You should never use get/set functions! Is he correct?</a> un utente caldeggia di ridimensionare l&#8217;invettiva contro i getter e i setter come accorato suggerimento a non eccedere nell&#8217;anti-pattern di pubblicare qualsiasi elemento dello stato interno mediante gettere e setter e propone un&#8217;analogia che mi sembra notevole:</p>
<blockquote><p>A car as a good example. It exposes a well-defined, standardised high-level interface. I don&#8217;t concern myself with setSpeed(60)&#8230; is that MPH or km/h? I just accelerate, cruise, decelerate. I don&#8217;t have to think about the details in setSteeringWheelAngle(getSteeringWheelAngle()+Math.rad(-1.5)), I just turn(-1.5), and the details are taken care of under the hood.</p></blockquote>
<p>Altri sono più possibilisti e fanno notare che le Property, proprio perché permettono di eseguire del codice al momento della lettura e della scrittura del campo, permettono di esporre selettivamente i valori dello stato interno garantendo la soddisfazione delle regole di business.</p>
<p>In effetti Allen Holub non è così disfattista e dichiara pacatamente:</p>
<blockquote><p>Moreover, the presence of numerous getter and setter methods is a red flag that the program isn&#8217;t necessarily well designed from an OO perspective.</p>
<p>This article explains why you shouldn&#8217;t use getters and setters (and when you can use them) and suggests a design methodology that will help you break out of the getter/setter mentality</p></blockquote>
<p>Altri ancora, molto simpaticamente, replicano che <a title="Allen Holub is evil" href="http://www.weiqigao.com/blog/2003/09/09/1063161368000.html" target="_blank">Allen Holub is evil</a>. Il mondo della programmazione Object Oriented è bello anche per questo.</p>
<h2>Quindi, metodo o Property?</h2>
<p>In linea di massima, nessuno dei due.</p>
<p>Se si ha modo di sostituire l&#8217;accessor col quale si <em>chiederebbe</em> all&#8217;oggetto una sua proprietà con un metodo col quale <em>dire</em> all&#8217;oggetto di fare qualcosa, è preferibile.</p>
<p>Tell, don&#8217;t ask.</p>
<p>Meglio programmare in termini di &#8220;conversazione tra oggetti&#8221;, piuttosto che &#8220;indagine di valori per eseguire delle operazioni&#8221;. È il concetto che distingue la programmazione orientata agli oggetti da quella procedurale: un programma Object Oriented è il risultato della <em>cooperazione tra oggetti che si inviano messaggi</em> piuttosto che dell&#8217;<em>esecuzione di procedure che consultano valori e poi prendono decisioni</em>.</p>
<p>Se proprio si deve esporre un valore dello stato interno, il principio da valutare è quello dell&#8217;<strong>idempotenza</strong> (o più correttamente della <strong>nullipotenza</strong>).</p>
<p>L&#8217;idempotenza è un concetto derivato dalla matematica: in senso informatico si riferisce alla proprietà di un metodo di non generare alcuna differenza osservabile fra una sua invocazione e le sue invocazioni successive.</p>
<p>In parole povere: una funzione è <em>idempotente</em> (o più correttamente, <em>nullipotente</em>) se è totalmente priva di effetti collaterali.</p>
<p>Se l&#8217;invocazione di un metodo modifica lo stato interno di un oggetto, non è nullipotente.<br />
Se si limita a fornire un valore senza alcun effetto sullo stato interno, lo è, indipendentemente dal fatto che venga o meno eseguito del codice.</p>
<p>Ora, la distinzione non è affatto accademica. Si tratta di domandarsi se si stia indagando sullo stato interno dell&#8217;oggetto (confidando che questo non venga modificato per il solo fatto di avervi acceduto), o se, invece, si stia chiedendo all&#8217;oggetto di eseguire un&#8217;azione, ben sapendo che l&#8217;oggetto sarà libero di provocare, come effetto collaterale, un cambiamento del suo stato interno.</p>
<p>Insomma: si sta <strong>dicendo</strong> all&#8217;oggetto di fare qualcosa? Allora si sa invocando un metodo. Al contrario, si sta <strong>chiedendo</strong> all&#8217;oggetto un valore? Allora si sta consultando una Property.</p>
<p>Nell&#8217;esempio del totale della fattura, per quanto codice esista dietro al calcolo del valore finale, si sta eseguendo senza dubbio un&#8217;operazione nullipotente. Non si tratta di dire all&#8217;oggetto di fare qualcosa: si sta chiedendo all&#8217;oggetto di esporre un suo stato interno, per quanto conservato in una collezione di altri oggetti incapsulati.</p>
<p>Alla domanda <a title="Difference between property and method" href="http://stackoverflow.com/questions/2544707/difference-between-property-and-method" target="_blank">Difference between property and method</a> su StackOverflow vari utenti commentano:</p>
<blockquote><p>Methods (C# doesn&#8217;t have functions) are better for expressing things that either change the state, or which have an expectation of taking some time and not necessarily being reproducible. They don&#8217;t tend to work in binding / serialization etc.</p>
<p>Note that properties are actually just a special way of writing methods. There is little functional difference. It is all about expressing intent. The one thing you don&#8217;t want to expose, however, is fields (the actual intEmployeeAge instance variable).</p></blockquote>
<blockquote><p>If all you need to do is return a value, use a property.<br />
If you need to do something before returning a value, use a function.</p></blockquote>
<blockquote><p>Properties holds object data<br />
Functions defines object behavior</p></blockquote>
<h2>Regola del pollice</h2>
<p>In sostanza, se nel valutare di usare un metodo o una Property ritenessi la Property lo strumento adatto, cerca di non farlo: concediti qualche minuto per rifletterci su e domandati se non ci sia il modo di rispettare il principio &#8220;Tell, don&#8217;t Ask&#8221;; domandati se l&#8217;architettura che stai allestendo sia una <em>conversazione tra oggetti</em> o un volgarissimo <em>programma procedurale che utilizza oggetti</em> (esiste un&#8217;offesa peggiore per uno sviluppatore Object Oriented del sentirsi dire &#8220;<em>Tu scrivi codice procedurale</em>&#8220;?), domandati mille volte se sia davvero necessario esporre un po&#8217; dello stato interno dell&#8217;oggetto e creare, inevitabilmente, delle dipendenze.</p>
<p>Se invece decidessi di non aborrire le Property, una regola del pollice nel fare la scelta tra metodo e Property è quella di giocare col suo nome:</p>
<blockquote><p>Ha senso chiamarlo <tt>doSomething</tt>? Allora, usa un metodo.<br />
Ha senso chiamarlo <tt>getSomeValue</tt>? Allora, vai con una Property.</p></blockquote>
<p>Alberto Brandolini ha pubblicato secoli fa <a href="http://ziobrando.blogspot.com/2006_04_01_archive.html" title="Why I hate Default Constructors" target="_blank">un post (in inglese)</a> sull&#8217;argomento molto arguto (e ben meno prolisso di questo). </p>
<p>Sayonara</p>
]]></html></oembed>