Распространённая проблема: Надо залезть в исходник библиотеки и поправить/расширить функциональность объектов некоторого класса. Грязный хак: (Осторожно, маскируется под нормальное решение благодаря общеупотребительности) —
Создать свой класс, производный от библиотечного и перегрузить (исправить) нужные методы.
А теперь я заставлю сторонников этой "технологии" раскаятся в содеянном!
Посмотрим, на что обречён разработчик:
1) Комбинаторный взрыв вариантов обходных "решений".
2) Правка и предусматривание фабричных функций создания экземпляров класса.
3) Дублирование кода при копировании и модификации метода.
Весёлая "игра", не правда ли? Могу предложить сделать её веселей с помощью ещё более грязных хаков (фич): 1) Динамически менять версию класса объекта подменой таблицы виртуальных функций и переаллокацией.
2) Помечать любой функциональный блок атрибутом версии.
3) Хранить все версии методов.
4) Хранить каждый метод в самостоятельной dll (сборке). (Напрямую к делу не относится, но очень вкусно).
Сразу оговорюсь, что функционировать всё это должно в среде, аналогичной GC.
Вместо тухлых помидоров надеюсь на конструктивное обсуждение:
Где такое уже было или есть?
Есть ли более изящные решения?
Каковы плюсы и минусы?
Что мешает?
На чём сделать?
Здравствуйте, WoldemaR, Вы писали:
WR>Распространённая проблема: Надо залезть в исходник библиотеки и поправить/расширить функциональность объектов некоторого класса. WR>Грязный хак: (Осторожно, маскируется под нормальное решение благодаря общеупотребительности) — WR> Создать свой класс, производный от библиотечного и перегрузить (исправить) нужные методы.
Алтернативы?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте, WoldemaR, Вы писали:
WR>Где такое уже было или есть? WR>Есть ли более изящные решения? WR>Каковы плюсы и минусы? WR>Что мешает? WR>На чём сделать?
Сам видишь разобраться в работе такой программы намного сложнее. Точнее я бы сказал невозможно, если ты разбираешь код какого нить умника везде и повсюду использующим такое переопределение. Но есть и плюс: если у тебя загружен документ и на определенный класс у тебя натравлен определенный метод, работа которого тебе не хватает. то ты можешь расширением спокойно перекрыть это недоразумение, не трогая основной код. Так сказать нарастить заплатку без изменения исходного кода. Хотя плюс это или минус это тоже вопрос.
AAV>Сам видишь разобраться в работе такой программы намного сложнее. Точнее я бы сказал невозможно, если ты разбираешь код какого нить умника везде и повсюду использующим такое переопределение. Но есть и плюс: если у тебя загружен документ и на определенный класс у тебя натравлен определенный метод, работа которого тебе не хватает. то ты можешь расширением спокойно перекрыть это недоразумение, не трогая основной код. Так сказать нарастить заплатку без изменения исходного кода. Хотя плюс это или минус это тоже вопрос.
А потом мы имеем еще более запутанный код. И представь, как будут честить того "умника", который это допустил?
Сдается мне, что мы поимеем тогда своеобразную проблему а-ля DLL-version hell...
Да и лучше тогда вводить ограничение на вложенность версий, а то, народ будет
в беспамятстве штамповать новые версии и вместо того, чтобы делать новые классы,
будет пихать все это в один и тот-же класс.
Здравствуйте, Nikolay_Ch, Вы писали:
N_C>Сдается мне, что мы поимеем тогда своеобразную проблему а-ля DLL-version hell... N_C>Да и лучше тогда вводить ограничение на вложенность версий, а то, народ будет N_C>в беспамятстве штамповать новые версии и вместо того, чтобы делать новые классы, N_C>будет пихать все это в один и тот-же класс.
Нет, этого не произойдёт.
То что я привёл это был вариант представления обобщённого кода всех версий.
На практике такое надо очень редко. А надо просто комбобокс на тулбаре для переключения версий, и вид текста программы автоматически перестраивается.
WR>Нет, этого не произойдёт. WR>То что я привёл это был вариант представления обобщённого кода всех версий. WR>На практике такое надо очень редко. А надо просто комбобокс на тулбаре для переключения версий, и вид текста программы автоматически перестраивается.
Ну а тогда в чем смысл? Это-же просто получается включенный в базовую студию программу версионного контроля?
Здравствуйте, IT, Вы писали:
IT>Чем это отличается от:
IT>
IT>class Some
IT>{
IT> int member;
IT>#ifdef V2
IT> int super;
IT>#endif
IT>};
IT>
Да. Ты прав. Получается что почти ничем, потому что это другой путь. Просто тогда надо написать нехилый довесок к IDE который будет морфировать код от версии к версии во всех направлениях.