Ich glaube, Sie verstehen den Begriff "Nebeneffekt" falsch, wie es für das Programmdesign gilt. Einstellen einer Eigenschaft ist ein Nebeneffekt, egal wie viel oder wie wenig interner Zustand es ändert, solange es sich ändert einige Art von Zustand. Ein "seiteneffektfreier Setter" wäre nicht sehr nützlich.
Nebenwirkungen sind etwas, das Sie auf Eigenschaft vermeiden möchten Getters. Das Lesen des Werts einer Eigenschaft ist etwas, das der Aufrufer nicht erwartet, irgendeinen Zustand zu ändern (d. H. Nebeneffekte verursachen), wenn dies der Fall ist, ist es normalerweise falsch oder zumindest fraglich (es gibt Ausnahmen wie z. B. lazy loading). Aber Getter und Setter sind sowieso nur Wrapper für Methoden. Die Duration
Eigenschaft, soweit es die CLR betrifft, ist nur syntaktischer Zucker für eine set_Duration
Methode.
Dies ist genau, was Abstraktionen wie Klassen gemeint sind - bieten grobkörnige Operationen und behalten einen konsistenten internen Zustand. Wenn Sie absichtlich versuchen, mehrere Nebenwirkungen in einer einzigen Eigenschaftszuweisung zu vermeiden, sind Ihre Klassen letztlich nicht mehr als dumme Datencontainer.
Also, die Frage direkt beantworten: Wo zeichne ich die Linie? Nirgendwo, solange die Methode/Eigenschaft tatsächlich das tut, was der Name impliziert. Wenn das Setzen der Duration
auch die ActivityName
geändert hat, könnte das ein Problem sein. Wenn es die Finish
Eigenschaft ändert, sollte das offensichtlich sein; es sollte unmöglich sein, die Duration
zu ändern und sowohl die Start
und Finish
bleiben die gleichen. Die grundlegende Prämisse von OOP ist, dass Objekte intelligent genug sind, um diese Operationen selbst zu verwalten.
Wenn Sie dies konzeptionell stört, dann haben Sie keine Mutator-Eigenschaften - verwenden Sie eine unveränderbare Datenstruktur mit schreibgeschützten Eigenschaften, in der alle notwendigen Argumente im Konstruktor bereitgestellt werden. Dann haben Sie zwei Überladungen, eine, die eine Start
/Duration
und eine andere, die eine Start
/Finish
dauert. Oder machen Sie nur eine der Eigenschaften beschreibbar - sagen wir Finish
, um sie mit Start
konsistent zu halten - und machen Sie dann schreibgeschützt. Verwenden Sie die geeignete Kombination von veränderbaren und unveränderlichen Eigenschaften, um sicherzustellen, dass es nur eine Möglichkeit gibt, einen bestimmten Status zu ändern.
Andernfalls sorgen Sie sich nicht so viel darum. Eigenschaften (und Methoden) sollten nicht unbeabsichtigte oder undokumentierte Nebenwirkungen haben, aber das ist über die einzige Richtlinie, die ich verwenden würde.
Danke, das habe ich gesucht und es kommt mir nie der "Nebeneffekt" vor "Freier Setter" ist in Wirklichkeit nicht möglich, da er den Zustand verändern wird. Und wie Sie darauf hingewiesen haben, wird die CLR trotzdem zur Methode übersetzen. – Martin
Ja, der Nebeneffekt eines Setter besteht darin, * die Member-Variable zu setzen, auf die er verweist *.Ein zusätzlicher Nebeneffekt besteht jedoch darin, * andere * Membervariablen zu modifizieren. –
Ich habe gerade über das gleiche nachgedacht und ich würde sogar sagen, dass die Einstellung der Elementvariable kein Nebeneffekt, sondern der gewünschte Effekt des Setter ist. Das Ändern anderer Elementvariablen ist ein Nebeneffekt. – Martin