Я думаю, вы несколько не понимаете, что влечет за собой принцип Открыто-Закрыто.
Принцип открытого-закрытого типа гласит, что программные объекты должны быть закрыты для модификации и открыты для расширения. Под программными объектами в этом контексте понимаются классы, методы структур и т. Д.
Основная идея заключается в том, что вашим организациям не нужно часто менять требования. Если появляются новые требования, ваши сущности должны быть расширены для соответствия новым функциям.
Предположим, у нас есть следующая функция:
public List<Product> GetProducts(Criteria criteria)
{
return context.Where(x => x.criteria1 = criteria.criteria1)
.Where(x => x.criteria2 = criteria.criteria2)
.Where(x => x.criteria3 = criteria.criteria3)
.Where(x => x.criteria4 = criteria.criteria4);
}
Легко видеть, что, когда появляется другое требование критерия, это потребует изменения класса «ProductRepository» и его функций. Конечно, многие другие функции в этом классе, возможно, придется изменить, поскольку он также может использовать объекты критериев.
Предположим, что мы можем написать что-то вроде этого:
private List<Product> GetProducts(Criteria criteria)
{
return cleverContext.Apply(criteria);
}
Мы сразу получаем гибкость, когда только код, отвечающий за критерии, изменяется или расширяется.
Самым большим способом улучшения дизайна для удовлетворения принципу Open-Closed является использование расширенного домена. Когда ваш домен моделирует бизнес-правила предприятия, правила никогда не должны изменяться. Мы разделяем Домен с вариантами использования, чтобы иметь дело с правилами приложения.
Дядя Боб пишет больше об этом в своей чистой архитектуре.
Дайте мне знать, если есть что-то, на что я могу пролить свет, или попробуйте объяснить дальше:)