Предотвращение изменения объекта после его входа в определенное состояние? (С #) - PullRequest
2 голосов
/ 05 августа 2010

У меня есть сценарий использования, с которым я никогда раньше не сталкивался.У меня есть объект, который после нажатия пользователем кнопки «Сохранить» не должен изменяться.Первоначально я создал два объекта, DraftObject и SavedObject.Для последнего я создал конструктор, который принимал только DraftObject и устанавливал каждое свойство как защищенный набор.

Это работает, но не кажется идеальным.Похоже, я должен иметь возможность установить свойство для моего объекта, которое контролирует возможность редактирования других полей.Какой лучший способ сделать это?Простите мой псевдокод, но вот с чем я играл:

public class MySpecialObject {
        public virtual string MyProperty { get { return MyProperty; } 
            set {
                if (State == "Locked")
                {
                    return;
                } else
                {
                    MyProperty = MyProperty;
                }
            }
         public virtual string State { get { return State; }
            set {
                 if (State == "Locked")
                 {
                     return;
                 } else
                 { 
                   State = State;
                 }
            }

Это кажется уродливым, особенно если я должен сделать это для каждого свойства в моем классе.Должен быть лучший способ сделать это, есть идеи?

Ответы [ 3 ]

2 голосов
/ 05 августа 2010

На самом деле это довольно интересная проблема, потому что можно многое сказать об объектах, которые являются либо неизменяемыми, либо начинающими изменчивость, но могут быть заблокированы, чтобы стать неизменяемыми.Я думаю, что было бы более разумно бросить InvalidOperationException, если есть попытка установить заблокированное свойство.Я не знаю ни одного более чистого или лучшего способа.

edit

В параллельном сообщении JLWarlow указал, что именно так работает SecureString, когда выЗвоните MakeReadOnly.

1 голос
/ 05 августа 2010

Если это всего лишь одна или две функции для простоты, просто сделайте это так, как вы написали, если вы делаете это часто, это может быть хорошим местом для использования AOP

http://en.wikipedia.org/wiki/Aspect-oriented_programming

Затем вы должны написать аспект, который предотвращает изменения, когда элемент находится в определенном состоянии.

Другой вариант, который почти такой же многословный, как и ваш код, но, возможно, немного приятнее, - это использование шаблона проектирования State, в котором у вас есть абстрактный класс с различными реализациями для каждого состояния, поэтому заблокированный класс состояний не допустит никаких изменений.

http://en.wikipedia.org/wiki/State_pattern

0 голосов
/ 05 августа 2010

Я знаю, что ваш пример - псевдокод, но, возможно, вы можете использовать логическое свойство IsLocked и написать его проще:

set {
          _MyProperty = IsLocked? _MyProperty:value;    
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...