Автоматически реализованные свойства с ненулевым защитным предложением? - PullRequest
16 голосов
/ 21 июля 2011

Я согласен с мнением Марка Симана о том, что Автоматические свойства являются чем-то злым , поскольку они нарушают инкапсуляцию. Однако мне нравится лаконичный синтаксис, удобочитаемость и удобство, которые они приносят.

Цитирую:

public string Name { get; set; }

Проблема с фрагментом кода не в том, что он содержит слишком много церемония. Проблема в том, что это нарушает инкапсуляцию. На самом деле

«[…] методы получения и установки не достигают инкапсуляции или информации сокрытие: они являются легитимным языком способ их нарушения ».

Джеймс О. Коплин и Гертруда Бьёрнвиг. Бережливая архитектура. Wiley. 2010. с. 134.

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

Использование кодовых контрактов:

private string _username;
public virtual string Username
{
    get { return _username; }
    set 
    {  
        Contract.Requires(value != null);
        _username = value; 
    }
}

Использование vanilla .NET:

private string _username;
public virtual string Username
{
    get { return _username; }
    set 
    {
        if (value == null) throw new ArgumentNullException("Username");
        _username = value; 
    }
}

Ответы [ 3 ]

7 голосов
/ 22 июля 2011

Я просто процитирую руководство Code Contracts , & sect; 2.3.1:

public int MyProperty { get; private set ; }

[ContractInvariantMethod]
private void ObjectInvariant () 
{
      Contract. Invariant ( this.MyProperty >= 0 );
      ...
}
3 голосов
0 голосов
/ 21 июля 2011

Я бы предположил, что свойства - это просто буфер памяти с точки зрения пользователя.только когда метод (действие) вызывается в пользовательском коде, следует проверять проверки правильности буфера свойств (например, null проверяет выбрасывание исключения).

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

...