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