Presumo che tu stia parlando di proprietà di sola lettura , o almeno di getter di proprietà , dal momento che un setter di proprietà avrà, in quasi tutti i casi, effetti collaterali. Altrimenti non è molto utile.
In generale, un buon design segue il principio della minima sorpresa . Non fare cose che i chiamanti non si aspettano che tu faccia, soprattutto se quelle cose potrebbero cambiare in futuro risultati .
In generale , ciò significa che i getter di proprietà non dovrebbero avere effetti collaterali.
Tuttavia , facciamo attenzione a cosa intendiamo per "effetto collaterale".
Un effetto collaterale è, tecnicamente, qualsiasi modifica di stato. Potrebbe essere uno stato accessibile al pubblico o ... potrebbe essere uno stato totalmente privato.
Caricatori pigri / differiti sono un esempio di stato che è quasi esclusivamente privato. Finché non è responsabilità del chiamante liberare quella risorsa, allora si sta effettivamente riducendo la sorpresa e la complessità in generale usando l'inizializzazione differita. Un chiamante normalmente non prevede di dover segnalare esplicitamente l'inizializzazione di una struttura interna . Pertanto, l'inizializzazione lenta non viola il principio di cui sopra.
Un altro esempio è una proprietà sincronizzata. Affinché un metodo sia thread-safe, spesso dovrà essere protetto da sezioni critiche o mutex. Entrare in una sezione critica o acquisire un mutex è un effetto collaterale; stai modificando lo stato, generalmente lo stato globale . Tuttavia, questo effetto collaterale è necessario per prevenire un peggio tipo di sorpresa : la sorpresa dei dati che vengono modificati (o peggio, parzialmente modificati) da un altro thread.
Quindi allenterei un po 'la restrizione a quanto segue: Le letture delle proprietà non dovrebbero avere effetti collaterali visibili o effetti collaterali che cambiano la loro semantica .
Se non vi è alcun modo per cui un chiamante possa mai essere influenzato o addirittura informato di un effetto collaterale, tale effetto collaterale non sta causando alcun danno. Se per te fosse impossibile scrivere un test per verificare l'esistenza di un particolare effetto collaterale, è abbastanza localizzato da etichettarlo come un dettaglio dell'implementazione privata, e quindi senza alcuna preoccupazione legittima per il mondo esterno.
Ma stai attento; come regola generale, dovresti cercare di evitare effetti collaterali, perché spesso quello che potresti pensare di essere un dettaglio dell'implementazione privata può inaspettatamente fuoriuscire e diventare pubblico.