Принцип единой ответственности гласит:
У класса должна быть одна и только одна причина для изменения.
Принцип открытости / закрытости гласит:
Вы должны иметь возможность расширять поведение классов, не изменяя его.
Как разработчик может уважать оба принципа, если у класса должна быть только одна причина для изменения, но его нельзя изменять?
Пример
Шаблон factory является здесь хорошим примером чего-то, что несет единственную ответственность, но может нарушать принцип открытия / закрытия:
public abstract class Product
{
}
public class FooProduct : Product
{
}
public class BarProduct : Product
{
}
public class ProductFactory
{
public Product GetProduct(string type)
{
switch(type)
{
case "foo":
return new FooProduct();
case "bar":
return new BarProduct();
default:
throw new ArgumentException(...);
}
}
}
Что произойдет, если мне нужно будет добавить ZenProduct
на завод на более позднем этапе?
- Неужто это нарушает принцип открытого / закрытого?
- Как мы можем предотвратить это нарушение?
ZenProduct
нарушает принцип. Я согласен с тем, что расширение фабрики предотвратит это нарушение, однако это связано с большими накладными расходами, плюс вам также придется нарушить OCP в другом месте, потому что вам придется изменить класс, чтобы использовать новую фабрику. - person Matthew Layton   schedule 15.03.2018