Ich nehme an, Sie sprechen von Nur - Lese- Eigenschaften oder zumindest Eigenschaft Getter , da eine Eigenschaft Setter ist, in fast allen Fällen gehen Nebenwirkungen haben. Ansonsten ist es nicht sehr nützlich.
Im Allgemeinen folgt ein gutes Design dem Prinzip der geringsten Überraschung . Tun Sie keine Dinge, von denen Anrufer nicht erwarten, dass Sie sie tun, insbesondere wenn diese Dinge die zukünftigen Ergebnisse verändern könnten .
Im Allgemeinen bedeutet dies, dass Property Getter keine Nebenwirkungen haben sollten.
Seien wir jedoch vorsichtig mit dem, was wir unter "Nebeneffekt" verstehen .
Ein Nebeneffekt ist technisch jede Zustandsänderung. Das könnte ein öffentlich zugänglicher Staat sein, oder ... es könnte ein völlig privater Staat sein.
Lazy / Deferred Loader sind ein Beispiel für einen fast ausschließlich privaten Staat. Solange es nicht die Verantwortung des Anrufers ist, diese Ressource freizugeben, reduzieren Sie tatsächlich die Überraschung und die Komplexität im Allgemeinen, indem Sie eine verzögerte Initialisierung verwenden. Ein Aufrufer erwartet normalerweise nicht, explizit die Initialisierung einer internen Struktur signalisieren zu müssen . Eine verzögerte Initialisierung verstößt also nicht gegen das obige Prinzip.
Ein weiteres Beispiel ist eine synchronisierte Eigenschaft. Damit eine Methode threadsicher ist, muss sie häufig durch einen kritischen Abschnitt oder Mutex geschützt werden. Die Eingabe eines kritischen Abschnitts oder der Erwerb eines Mutex ist ein Nebeneffekt. Sie ändern den Status, normalerweise den globalen Status. Dieser Nebeneffekt ist jedoch erforderlich , um eine viel schlimmere Art von Überraschung zu verhindern - die Überraschung, dass Daten von einem anderen Thread geändert (oder teilweise geändert) werden.
Daher würde ich die Einschränkung ein wenig auf Folgendes lockern: Eigenschaftslesevorgänge sollten keine sichtbaren Nebenwirkungen oder Nebenwirkungen haben, die ihre Semantik ändern .
Wenn es keine Möglichkeit gibt, dass ein Anrufer jemals von einer Nebenwirkung betroffen ist oder diese überhaupt wahrnimmt , ist diese Nebenwirkung nicht schädlich. Wenn es für Sie unmöglich ist, einen Test zu schreiben, um das Vorhandensein einer bestimmten Nebenwirkung zu überprüfen, ist dieser so lokalisiert, dass er als privates Implementierungsdetail und somit für die Außenwelt nicht als legitim anzusehen ist.
Aber sei vorsichtig; als Faustregel gilt : Sie sollten versuchen , Nebenwirkungen zu vermeiden, weil oft das, was Sie vielleicht denken, unerwartet auslaufen und öffentlich zu einer privaten Detail - Implementierung zu sein.