Suponho que você esteja falando de propriedades somente leitura ou, pelo menos , de getters de propriedades , pois um setter de propriedades , em quase todas as instâncias, terá efeitos colaterais. Caso contrário, não é muito útil.
Em geral, um bom design segue o princípio da menor surpresa . Não faça coisas que os chamadores não esperam que você faça, especialmente se essas coisas mudarem os resultados futuros .
Em geral , isso significa que getters de propriedades não devem ter efeitos colaterais.
No entanto , tenhamos cuidado com o que queremos dizer com "efeito colateral".
Um efeito colateral é, tecnicamente, qualquer modificação de estado. Pode ser um estado acessível ao público, ou ... pode ser um estado totalmente privado.
Carregadores preguiçosos / diferidos são um exemplo de estado quase exclusivamente privado. Contanto que não seja responsabilidade do chamador liberar esse recurso, você estará reduzindo a surpresa e a complexidade em geral usando a inicialização adiada. Normalmente, um chamador não espera sinalizar explicitamente a inicialização de uma estrutura interna . Portanto, a inicialização lenta não viola o princípio acima.
Outro exemplo é uma propriedade sincronizada. Para que um método seja seguro para threads, muitas vezes precisará ser protegido por uma seção crítica ou mutex. Entrar em uma seção crítica ou adquirir um mutex é um efeito colateral; você está modificando o estado, geralmente o estado global . No entanto, esse efeito colateral é necessário para evitar um tipo muito pior de surpresa - a surpresa de os dados serem modificados (ou pior, parcialmente modificados) por outro encadeamento.
Então, eu afrouxaria um pouco a restrição para o seguinte: As leituras de propriedades não devem ter efeitos colaterais visíveis ou efeitos colaterais que alterem sua semântica .
Se não houver uma maneira possível de um chamador ser afetado ou mesmo ter conhecimento de um efeito colateral, esse efeito colateral não causará nenhum dano. Se seria impossível escrever um teste para verificar a existência de um efeito colateral específico, ele é localizado o suficiente para rotular como um detalhe de implementação privada e, portanto, sem preocupação legítima para o mundo externo.
Mas tenha cuidado; como regra geral, você deve tentar evitar efeitos colaterais, porque muitas vezes o que você pensa ser um detalhe de implementação privada pode vazar inesperadamente e tornar-se público.