Какова наилучшая практика при реализации объекта передачи данных или POCO?Как должны выглядеть ваши POCOS?
-
10-07-2019 - |
Вопрос
Какой из перечисленных ниже способов является наилучшим для реализации poco?
Вариант 1:
public class PocoOption1
{
public PocoOption1(int val1,string val2)
{
Val1=val1; Val2=val2;
}
public int Val1{get;private set;}
public int Val2{get;private set;}
}
Вариант 2:
public class PocoOption2
{
public int Val1{get;set;}
public int Val2{get;set;}
}
Каковы потенциальные плюсы и минусы каждого подхода??Имеет ли это значение?Некоторые люди говорят, что DTO следует устанавливать только один раз.Это правило или просто мнение??
Решение
Варианты немного отличаются.Опция 1 позволяет вам установить Val1, Val2 только один раз.Опция 2 позволяет вам устанавливать и сбрасывать эти значения.
В общем, я фанат общедоступных конструкторов по умолчанию.Это упрощает использование API.Это довольно подробно обсуждается Кшиштофом Квалиной и Брэдом Абрамсом в книге Framework Design Guidelines.Вот основные моменты:
- Используйте шаблон "Создать, установить, Вызвать".Имейте конструктор по умолчанию без параметров.Затем разрешите задать свойства для объекта (в любом порядке).Затем разрешите вызывать методы.
- Конструктор по умолчанию - это канонический метод построения объекта.Это будет первый вариант, который попробует пользователь.
- Заставить пользователя выбирать параметры во время строительства может быть непросто.Кроме того, некоторые параметры могут быть необязательными.
- Пусть ваш объект находится в недопустимом состоянии в течение ограниченного периода времени.Генерируйте исключения, чтобы сообщить о неправильном использовании API.(Если объект имеет две зависимости, то вызовите исключение InvalidOperationException, если пользователь пытается вызвать метод без необходимых настроек.)
На мой взгляд, вариант 2 - это правильный путь.
Другие советы
С новым синтаксисом C #, где вы можете делать такие вещи:
Customer customer = new Customer{ Id = 1,
Name="Dave",
City = "Sarasota" };
вы можете безопасно использовать Вариант 2.
Пожалуйста, проверьте здесь .