Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
 Аватар для Laborant666
208 / 101 / 20
Регистрация: 30.06.2020
Сообщений: 848

Open-closed principle

17.06.2023, 13:08. Показов 747. Ответов 5

Студворк — интернет-сервис помощи студентам
Является ли нарушением принципа открытости-закрытости, когда ты уже существующий класс, точнее его метод, модифицируешь, но при этом весь сидящий на нём код не требует переписывания и не отваливается, а нужно лишь дописать под новое, дописанное ещё кода, но и без него запустится.

Пример
Есть класс, который генерирует данные в вектор со структурой
C++
1
2
3
4
5
struct Word
{
   string word;
   POINT coordinates;
};
И есть обработчик, который принимает этот вектор и группирует слова по строкам, по высоте.

Теперь понадобилось в структуру добавить новое поле meaning, что бы разделить дополнительно слова по смыслу. Это я только буду дописывать в генераторе данных. И если в обработчике не допишу - всё останется рабочим всё равно. По идее это тоже подходит под принцип открытости-закрытости, когда прошлый код не сыпется и не требует переписывания при добавлении функционала. Что думаете?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.06.2023, 13:08
Ответы с готовыми решениями:

There is already an open DataReader associated with this Command which must be closed first
Как приостановить выполнение предыдущего запроса, чтобы выполнилась 117 строка?

There is already an open DataReader associated with this Connection which must be closed first
There is already an open DataReader associated with this Connection which must be closed first MySql.Data.MySqlClient.MySqlException...

Принцип open/closed и контруктором
Разбираясь с принципами SOLID возникли некоторые вопросы в понимании. А именно, нормально ли изменяеть конструктор класса, если появилась...

5
Модератор
Эксперт С++
 Аватар для zss
13773 / 10966 / 6491
Регистрация: 18.12.2011
Сообщений: 29,244
17.06.2023, 13:14
Я думаю, что такой случай подходит для создания производного класса с дополнительным полем meaning

Соответственно, в производном классе создаёте новые методы обработки,
которые вначале вызывают методы из базового класса, а потом выполняют дополнительную обработку связанную с полем meaning.
1
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
17.06.2023, 13:52
Цитата Сообщение от Laborant666 Посмотреть сообщение
Является ли нарушением принципа открытости-закрытости, когда ты уже существующий класс, точнее его метод, модифицируешь, но при этом весь сидящий на нём код не требует переписывания и не отваливается, а нужно лишь дописать под новое, дописанное ещё кода, но и без него запустится.
Думаю, в первую очередь важно гнаться не за принципами, а пытаться применять принципы по месту их назначения.

Что касается конкретно этого вопроса, то однозначного ответа нет, потому что это зависит от ситуации. В некоторых случаях при необходимости можно и нужно модифицировать метод, а если такая модификация еще и не затрагивает "сидящий на нем код", то это вообще круто и является следствием правильного применения инкапсуляции.

Цитата Сообщение от Laborant666 Посмотреть сообщение
Теперь понадобилось в структуру добавить новое поле meaning, что бы разделить дополнительно слова по смыслу.
Нет проблем, добавляйте. Потому что смысл слова можно трактовать как атрибут слова, поэтому наличие такого поля в структуре Word вполне обосновано.

Итого: добавление нового поля в структуру Word обосновано как расширение. То, что генератор данных должен учитывать это изменение это нормально, так и должно быть, иначе не получится правильно сгенерировать данные. В добавок ко всему, ничего не ломается. Так что по той информации что вы предоставили - все ок.
2
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
17.06.2023, 16:04
Лучший ответ Сообщение было отмечено Laborant666 как решение

Решение

Цитата Сообщение от Laborant666 Посмотреть сообщение
Является ли нарушением принципа открытости-закрытости, когда ты уже существующий класс, точнее его метод, модифицируешь
Является)

Цитата Сообщение от Laborant666 Посмотреть сообщение
когда прошлый код не сыпется и не требует переписывания при добавлении функционала
Это называется "грамотная инкапсуляция".

А "Open-closed principle" - это когда модуль спроектирован таким образом, что его поведение можно кастомизировать без необходимости вносить изменение в код самого модуля.

А в вашем случае, вы носите изменения в код.
Для бизнеса изменение в коде означают, что нужно будет увеличить версию модуля, и потом заново выполнить весь цикл разработки: сборка, тестирование, развертывание.
А это - время и деньги.

Практический смысл "Open-closed principle" - экономия времени и денег за счет того, что не нужно повторно выполнять полный цикл разработки для модуля, который итак уже был протестирован, и развернут на бою.

Например: у вас уже есть тщательно протестированный core.dll
Что бы расширить функциональность, вы у себя в коде наследуетесь от каких нибудь интерфейсов, и потом рядышком кладете свой новенький plugin.dll, который будет работать в связке с core.dll
А вот саму core.dll вы без очень веских причин не модифицируете.
3
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
17.06.2023, 19:03
eva2326,
Все не так однозначно. Во первых, возможно, код автора еще не является законченным продакшен кодом, который протестировали, во вторых, если использовать новую сущность для поля meaning, то в некоторых случаях могут быть проблемы.

Приведу пример. Если автор применит наследование, опишет класс WordWithMeaning : Word и добавит новое поле meaning в новую структуру, при этом если прежний Word не будет больше нужен, то в результате мы получим то, что:
1) везде где использовался Word, ему придется поменять на WordWithMeaning
2) сам WordWithMeaning и зависящие от него участки по-хорошему все равно придется тестировать с новой сущностью

В таком случае, проще поменять сам Word, так как мы получим эквивалент WordWithMeaning, работу которого все равно придется тестировать. А без наследования, сущностей будет меньше что сделает программу проще. Что касается вопросов тестирования, то работы в таком случае с учетом вышеуказанного не прибавится. Наоборот, программа станет сложнее. Следовательно, в таком случае разговоры о тестах и деньгах не будут иметь никакого смысла.

Как уже говорил,
Цитата Сообщение от Undisputed Посмотреть сообщение
зависит от ситуации
но кто же меня слушать будет...
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
17.06.2023, 19:25
Цитата Сообщение от Undisputed Посмотреть сообщение
код автора еще не является законченным продакшен кодом
думаю, что для не продакшен кода понятие Open-closed principle иное, если его вообще можно применять к непродакшен коду.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.06.2023, 19:25
Помогаю со студенческими работами здесь

Поясните реализацию SOLID-приниципа Open-closed в JS
Поясните, пожалуйста, максимально доступно реализацию принципа открытости-закрытости в контексте JavaScript. Я не знаю других языков...

"Attempt to re-open an already-closed object" при работе с SQLite
Добрый день. Разрабатываю приложение и столкнулся с проблемой... Лог выдаёт вот такое: FATAL EXCEPTION: main ...

Open Loop и Closed Loop системы, какие утверждения верны?
1) В системах Open Loop можно обойтись без измерения фактического значения. 2) В случае большой ошибки между фактическим и установленным...

Ошибка "attempt to re-open an already-closed object: sqlitequery:"
Доброе утро! Реализую подсказки для SearchView. Курсор для подсказки заполняется в след. методе MainActivity: @Override ...

Различие между Open Hash и Closed hash
В чём различие между Open Hash и Closed hash и какие у каждого из них преимущества и недостатки?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru