Suppongo che tu stia parlando di proprietà di sola lettura , o almeno di proprietà getter , poiché una proprietà setter è, in quasi ogni istanza, avrà effetti collaterali. Altrimenti non è molto utile.
In generale, un buon design segue il principio di sorpresa minima . Non fare cose che i chiamanti non si aspettano che tu faccia, specialmente se queste cose potrebbero cambiare i futuri risultati.
In generale , ciò significa che i getter di proprietà non dovrebbero avere effetti collaterali.
Tuttavia , facciamo attenzione a ciò che intendi 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.
I caricatori pigri / differiti sono un esempio di stato quasi esclusivamente privato. Finché non è responsabilità del chiamante liberare quella risorsa, in realtà si sta riducendo la sorpresa e la complessità in generale utilizzando l'inizializzazione posticipata. Un chiamante normalmente non si aspetta di dover esplicitamente segnalare l'inizializzazione di una struttura interna . Quindi, l'inizializzazione pigra non viola il principio di cui sopra.
Un altro esempio è una proprietà sincronizzata. Affinché un metodo sia sicuro per i thread, dovrà spesso essere protetto da una sezione critica o mutex. Entrare in una sezione critica o acquisire un mutex è un effetto collaterale; stai modificando lo stato, di solito lo stato globale . Tuttavia, questo effetto collaterale è necessario al fine di prevenire un tipo di sorpresa peggio - la sorpresa dei dati 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 secondari visibili o effetti collaterali che cambiano la loro semantica .
Se non c'è modo per un chiamante di essere mai influenzato da, o anche consapevole di un effetto collaterale, allora quell'effetto collaterale non sta facendo alcun danno. Se fosse impossibile per te scrivere un test per verificare l'esistenza di un particolare effetto collaterale, allora è abbastanza localizzato da etichettarlo come un dettaglio di implementazione privato, e quindi privo di legittime preoccupazioni per il mondo esterno.
Ma fai attenzione; come regola generale, dovresti cercare di evitare effetti collaterali, perché spesso ciò che potresti pensare di essere un dettaglio di implementazione privato può inaspettatamente fuoriuscire e diventare pubblico.