Я думаю, что вы неправильно понимаете термин «побочный эффект», применительно к дизайну программы. Установка свойства - - побочный эффект, независимо от того, насколько или мало внутреннего состояния он изменяется, до тех пор, пока он меняет вид состояния. «Безцелевой сеттер» не был бы очень полезен.
Побочные эффекты - это то, чего вы хотите избежать на имущество геттеры. Чтение значения свойства - это то, что вызывающий не ожидает изменения какого-либо состояния (т. Е. Вызывают побочные эффекты), поэтому, если это так, обычно это неправильно или, по крайней мере, сомнительно (есть исключения, например, ленивая загрузка). Но геттеры и сеттеры одинаково просто обертки для методов в любом случае. Свойство Duration
, что касается CLR, является просто синтаксическим сахаром для метода set_Duration
.
Это именно то, что абстракции, такие как классы, предназначены для - обеспечения крупнозернистых операций при сохранении согласованного внутреннего состояния. Если вы намеренно стараетесь избегать множественных побочных эффектов в одном присваивании свойств, ваши классы в конечном итоге становятся не более чем тупыми контейнерами данных.
Итак, отвечая на вопрос напрямую: Где я рисую линию? Нигде, пока метод/свойство действительно делает то, что подразумевает его название. Если установка Duration
также изменила ActivityName
, это может быть проблемой. Если он изменяет свойство Finish
, это должно быть очевидно; это должно быть невозможно изменить Duration
и иметь и Start
, и Finish
оставаться неизменным. Основная предпосылка ООП заключается в том, что объекты достаточно интеллектуальны, чтобы самостоятельно управлять этими операциями.
Если это беспокоит вас на концептуальном уровне, то у вас нет свойств мутатора - используйте неизменяемую структуру данных с свойствами только для чтения, где все необходимые аргументы предоставляются в конструкторе. Затем имеют две перегрузки, одну из которых занимает Start
/Duration
, а другая - Start
/Finish
. Или сделайте только одно из свойств, доступных для записи, допустим, Finish
, чтобы он соответствовал Start
- и затем сделать Duration
только для чтения. Используйте соответствующую комбинацию изменяемых и неизменяемых свойств, чтобы гарантировать, что есть только один способ изменить определенное состояние.
В противном случае, не волнуйтесь об этом. Свойства (и методы) не должны иметь непреднамеренно или недокументированные побочные эффекты, но это касается единственного ориентира, который я бы использовал.
Спасибо, это то, что я искал, и мне никогда не приходит в голову «побочный эффект» «свободный сеттер» на самом деле невозможен, так как он изменит состояние. И, как вы указали, CLR переведет метод в любом случае. – Martin
Да, побочный эффект сеттера заключается в том, чтобы установить * переменную-член, к которой она относится *.Но дополнительным побочным эффектом является изменение * других * переменных-членов. –
Я просто думал о том же, и я бы даже сказал, что настройка переменной-члена не является побочным эффектом, а желаемым эффектом сеттера. Изменение других переменных-членов является побочным эффектом. – Martin