Так как 3.0 С# обладает сильным синтаксическим сахаром, таким как авто-свойства, которые значительно упрощают реализацию принципа инкапсуляции. Это хорошо, если вы используете его с атомными значениями, поэтому вы можете заменить шаблон инкапсуляции следующим образом:
private string _name;
public string Name
{
get { return _name; }
set { _name = value; }
}
только с одной строкой:
public string FirstName { get; set; }
Мне очень нравится эта замечательная функция, так как она экономит много времени разработчиков.
Но все не так велико, когда вы создаете свойство, указывающее на сбор. Обычно я вижу свойства коллекции, реализованные одним из двух способов.
1) Без автоматических свойств вообще можно использовать инициализатор поля:
private List<string> _names = new List<string>();
public List<string> Names
{
get { return _names; }
}
2) Использование авто-свойств. Этот подход одобрен, если класс имеет только один конструктор:
public List<string> Names { get; private set; }
public .ctor()
{
Names = new List<string>();
}
Но когда вы имеете дело с изменчивыми коллекциями, например списками, вы нарушаете инкапсуляцию, так как пользователь этого свойства может изменять коллекцию, не позволяя контейнеру знать (или даже заменять коллекцию, если вы забыли сделать setter private).
Что касается меня, то в отношении шаблона Encapsulate Collection правильная реализация инкапсуляции коллекции должна выглядеть так:
private readonly List<string> _names = new List<string>();
public ICollection<string> Names
{
get { return new ReadOnlyCollection<string>(_names); }
}
public void Add_Name(string name)
{
_names.Add(name);
}
public void Remove_Names(string name)
{
_names.Remove(name);
}
public void Clear_Names()
{
_names.Clear();
}
Честно говоря, я не помню, встречался ли я с такой реализацией в реальном коде, даже в исходных источниках. Я думаю, что это потому, что люди ленивы и избегают писать такое количество кода, чтобы сделать инкапсуляцию чуть сильнее.
Мне интересно, почему команда С# не предоставляет четкого и простого способа определения автоматических свойств коллекции, поэтому разработчики могут порадовать свою лень, создавая надежный код?