Каковы плюсы и минусы использования статических методов создания объектов над конструкторами?
class Foo {
private Foo(object arg) { }
public static Foo Create(object arg) {
if (!ValidateParam(arg)) { return null; }
return new Foo(arg);
}
}
Мало, что я могу думать о:
Плюсы:
- Возврат null вместо выдачи исключения (назовите его
TryCreate). Это может сделать код более лаконичным и чистым на стороне клиента. Клиенты редко ожидают, что конструктор потерпит неудачу. - Создавать различные виды объектов с четкой семантикой, например,
CreatFromName(String name)иCreateFromCsvLine(String csvLine) - При необходимости может вернуть кешированный объект или производную реализацию.
Минусы:
- Менее обнаруживаемый, более сложный для просмотра кода.
- Некоторые шаблоны, такие как сериализация или рефлексия, являются более сложными (например
Activator<Foo>.CreateInstance())
Foo x = Foo.TryCreate(); if (x == null) { ... }). Обработка исключения ctor - это ( Foo x; try { x = new Foo(); } catch (SomeException e) { ... }). При вызове обычного метода я предпочитаю исключения кодам ошибок, но с созданием объекта, TryCreateкажется, чище.
Nameи печатать CsvLine, а не выражать требования через имена методов. Это позволит вам перегрузить Create. Использование строк для обоих можно рассматривать как «примитивную одержимость» (если вы не сделали этот выбор по известным причинам производительности). Проверьте Object Calisthenics для забавного способа исследовать это.