Википедия говорит
«программные объекты (классы, модули, функции и т. д.) должны быть открыты для расширения, но закрыты для модификации»
Слово функции привлекло мое внимание, и теперь я задаюсь вопросом, можем ли мы предположить, что создание перегрузки для метода может рассматриваться как пример принципа Open / closed или нет?
Позвольте мне объяснить пример. Учтите, что у вас есть метод на уровне сервиса, который используется почти в 1000 местах. Метод получает userId и определяет, является ли пользователь администратором или нет:
bool IsAdmin(userId)
Теперь учтите, что где-то необходимо определить, является ли пользователь администратором или нет, основываясь на имени пользователя, а не userId. Если мы изменим сигнатуру вышеупомянутого метода, то мы разбили код на 1000 мест (функции должны быть закрыты для модификации). Таким образом, мы можем создать перегрузку, чтобы получить имя пользователя, найти userId на основе имени пользователя и оригинальный метод:
public bool IsAdmin(string username)
{
int userId = UserManager.GetUser(username).Id;
return IsAdmin(userId);
}
Таким образом, мы расширили нашу функцию, создав для нее перегрузку (функции должны быть открыты для расширения).
Это открытый / закрытый принцип?
источник
Перегружая ваш метод, вы расширяете функциональность существующего модуля, таким образом отвечая новым потребностям вашего приложения.
Вы не вносите никаких изменений в существующий метод, поэтому не нарушаете второе правило.
Мне было бы интересно услышать, что другие говорят о том, что нельзя менять оригинальный метод. Да, вы можете установить соответствующие модификаторы доступа и обеспечить инкапсуляцию, но что еще можно сделать?
Ссылка: http://www.objectmentor.com/resources/articles/ocp.pdf
источник
Открытый-закрытый принцип - это цель, идеальный случай, а не всегда реальность. В частности, когда нужно реорганизовать старый код, первым шагом часто является серьезная модификация, чтобы сделать возможным использование OCP. Корень принципа в том, что рабочий код уже работает, и изменение может привести к ошибкам. Поэтому лучший сценарий - не изменять существующий код, а только добавлять новый код.
Но скажем, у вас была вызвана функция
BigContrivedMethod(int1, int2, string1)
.BigContrivedMethod
делает три вещи: вещь1, вещь2 и вещь3. На данный момент, повторное использование BCM, вероятно, сложно, потому что это делает слишком много. Рефакторинг этого (если возможно) вContrivedFunction1(int)
,ContrivedFunction2(int)
иContrivedFunction3(string)
дает вам три меньших, более сфокусированных метода, которые вы можете легко комбинировать.И это ключ к OCP в отношении методов / функций: состав. Вы «расширяете» функции, вызывая их из других функций.
Помните, что OCP является частью 5 других принципов, руководящих принципов SOLID. Первый из них является ключевым, Единой Ответственности. Если бы все в вашей кодовой базе делало только одну конкретную вещь, которую вам приходилось делать, вам никогда бы не пришлось изменять код. Вам нужно всего лишь добавить новый код или объединить старый код вместе новыми способами. Поскольку реальный код редко соответствует этому руководству, вам часто приходится изменять его, чтобы получить SRP, прежде чем вы сможете получить OCP.
источник
Вы следуете принципу открытого-закрытого, если вы изменяете поведение своей программы, записывая новый код, а не изменяя старый код.
Поскольку написать код, который открыт для всех возможных изменений, практически невозможно (и вы этого не хотите, потому что вводите анализ паралича), вы пишете код, который реагирует на все различные варианты поведения, над которыми вы в данный момент работаете, расширением, а не модификацией.
Когда вы сталкиваетесь с чем-то, что вам нужно изменить, вместо того, чтобы просто что-то изменить, чтобы разрешить новое поведение, вы выясните, в чем суть изменения, реструктурируйте свою программу, не изменяя ее поведение, чтобы затем вы могли изменить это поведение, написав НОВЫЙ код ,
Итак, как это относится к вашему делу:
Если вы добавляете новые функции в ваш класс, тогда ваш класс не открывается / не закрывается, а клиенты перегружаемой функции.
Если вы просто добавляете новые функции, которые работают НА вашем классе, то и он, и клиенты вашей функции открыты / закрыты.
источник