Сначала подумайте, почему такое правило может быть полезным.Закрыто для модификации, открыто для расширения.Это имеет смысл для библиотек или кода, которые должны быть обратно совместимы.Подумайте об этом примере:
Я написал библиотеку "BestLibrary", которая предоставляет интерфейс:
namespace BestLibrary
{
public interface GoodStuff
{
Goodies GiveMeGoodStuff();
}
}
Но в следующем выпуске я хочу решить, что Goodies
дать на основепараметр, поэтому я изменяю интерфейс на:
namespace BestLibrary
{
public interface GoodStuff
{
Goodies GiveMeGoodStuff(GoodiesType type);
}
}
public enum GoodiesType { All, Type1, Type2 }
Теперь каждый , кто использует мою библиотеку, должен исправить их код, потому что их проекты прекратят сборку.Это тормозит принцип Open / Closed.Вместо этого я должен сделать другой метод, такой как:
namespace BestLibrary
{
public interface GoodStuff
{
Goodies GiveMeGoodStuff();
Goodies GiveMeGoodStuff(GoodiesType type);
}
}
Здесь я ничего не изменил.Старый код все еще работает.Кто-то хочет случайных Goodies
?Они все еще могут получить это.Я расширен GoodStuff
интерфейс с дополнительным методом.Таким образом, все компилируется, и люди могут использовать новые функциональные возможности.
Если вы работаете над проектом, который не является библиотекой или API-интерфейсом, то я не вижу причин следовать этому принципу.Требования изменяются, и код должен следовать.