Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 12:00
Оценка:
Распространённая проблема: Надо залезть в исходник библиотеки и поправить/расширить функциональность объектов некоторого класса.
Грязный хак: (Осторожно, маскируется под нормальное решение благодаря общеупотребительности) —
Создать свой класс, производный от библиотечного и перегрузить (исправить) нужные методы.

А теперь я заставлю сторонников этой "технологии" раскаятся в содеянном!
Посмотрим, на что обречён разработчик:

    1) Комбинаторный взрыв вариантов обходных "решений".
    2) Правка и предусматривание фабричных функций создания экземпляров класса.
    3) Дублирование кода при копировании и модификации метода.

Весёлая "игра", не правда ли? Могу предложить сделать её веселей с помощью ещё более грязных хаков (фич):
    1) Динамически менять версию класса объекта подменой таблицы виртуальных функций и переаллокацией.
    2) Помечать любой функциональный блок атрибутом версии.
    3) Хранить все версии методов.
    4) Хранить каждый метод в самостоятельной dll (сборке). (Напрямую к делу не относится, но очень вкусно).

Сразу оговорюсь, что функционировать всё это должно в среде, аналогичной GC.

Вместо тухлых помидоров надеюсь на конструктивное обсуждение:

Где такое уже было или есть?
Есть ли более изящные решения?
Каковы плюсы и минусы?
Что мешает?
На чём сделать?
Re: Полиморфный хак
От: IT Россия linq2db.com
Дата: 26.05.06 12:30
Оценка:
Здравствуйте, WoldemaR, Вы писали:

WR>Распространённая проблема: Надо залезть в исходник библиотеки и поправить/расширить функциональность объектов некоторого класса.

WR>Грязный хак: (Осторожно, маскируется под нормальное решение благодаря общеупотребительности) —
WR> Создать свой класс, производный от библиотечного и перегрузить (исправить) нужные методы.

Алтернативы?
... << RSDN@Home 1.2.0 alpha rev. 0>>
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 12:35
Оценка: :)
Здравствуйте, IT, Вы писали:

IT>Алтернативы?

Функциональный блок внутри метода с новой версией. (opensource рулит).
Re[3]: Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 12:37
Оценка:
WR>Функциональный блок внутри метода с новой версией. (opensource рулит).

Либо новая версия метода(-ов).
Re: Полиморфный хак
От: ArhAngelVezel Россия  
Дата: 26.05.06 12:41
Оценка: 1 (1)
Здравствуйте, WoldemaR, Вы писали:

WR>Где такое уже было или есть?

WR>Есть ли более изящные решения?
WR>Каковы плюсы и минусы?
WR>Что мешает?
WR>На чём сделать?

javascript:

//тут мы имеем нормальную работу indexOf

String.prototype.indexOf = function(c)
{
return this.lastIndexOf(c)
}

//тут мы имеем "ненормальную" работу indexOf



Сам видишь разобраться в работе такой программы намного сложнее. Точнее я бы сказал невозможно, если ты разбираешь код какого нить умника везде и повсюду использующим такое переопределение. Но есть и плюс: если у тебя загружен документ и на определенный класс у тебя натравлен определенный метод, работа которого тебе не хватает. то ты можешь расширением спокойно перекрыть это недоразумение, не трогая основной код. Так сказать нарастить заплатку без изменения исходного кода. Хотя плюс это или минус это тоже вопрос.
Re[2]: Полиморфный хак
От: Nikolay_Ch Россия  
Дата: 26.05.06 12:44
Оценка:
AAV>Сам видишь разобраться в работе такой программы намного сложнее. Точнее я бы сказал невозможно, если ты разбираешь код какого нить умника везде и повсюду использующим такое переопределение. Но есть и плюс: если у тебя загружен документ и на определенный класс у тебя натравлен определенный метод, работа которого тебе не хватает. то ты можешь расширением спокойно перекрыть это недоразумение, не трогая основной код. Так сказать нарастить заплатку без изменения исходного кода. Хотя плюс это или минус это тоже вопрос.
А потом мы имеем еще более запутанный код. И представь, как будут честить того "умника", который это допустил?
Re[2]: Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 12:48
Оценка: 1 (1)
Здравствуйте, ArhAngelVezel, Вы писали:

AAV>String.prototype.indexOf = function(c)

AAV>{
AAV> return this.lastIndexOf(c)
AAV>}

Немного похоже, но не то.

Наверное надо показать синтаксис чтобы довести человека до оргазма?

[v = 1.0]
class Some
{
   int member;
   
   [v = 2.0]
   {
      int super;
   }
};


[v = 1.0]
void foo()
{
   do_some();

   [v = 2.0]
   {
      do_super();
   }
}
Re[3]: Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 12:52
Оценка:
Здравствуйте, WoldemaR, Вы писали:

Вот другой вариант представления:
[version = 1.0][v] // — это комбобокс на панеле инструментов окна.
Re[3]: Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 12:53
Оценка:
Здравствуйте, WoldemaR, Вы писали:

Как я рад, что хоть кому-то весело.
Re[4]: Полиморфный хак
От: Nikolay_Ch Россия  
Дата: 26.05.06 12:54
Оценка:
WR>Как я рад, что хоть кому-то весело.
Ну согласись, не плакать-же...
Re[5]: Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 12:55
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Ну согласись, не плакать-же...


Предложи более изящную форму.
Re[6]: Полиморфный хак
От: Nikolay_Ch Россия  
Дата: 26.05.06 12:57
Оценка:
WR>Предложи более изящную форму.
Извини, я поставил значек "Улыбка", а не "Смех"... Сейчас подправлю на "Интересно".
Re[3]: Полиморфный хак
От: Nikolay_Ch Россия  
Дата: 26.05.06 13:02
Оценка:
WR>
WR>[v = 1.0]
WR>void foo()
WR>{
WR>   do_some();
WR>   [v = 2.0]
WR>   {
WR>      do_super();
WR>   }
WR>}
WR>

Сдается мне, что мы поимеем тогда своеобразную проблему а-ля DLL-version hell...
Да и лучше тогда вводить ограничение на вложенность версий, а то, народ будет
в беспамятстве штамповать новые версии и вместо того, чтобы делать новые классы,
будет пихать все это в один и тот-же класс.
Re[4]: Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 13:14
Оценка:
Здравствуйте, Nikolay_Ch, Вы писали:

N_C>Сдается мне, что мы поимеем тогда своеобразную проблему а-ля DLL-version hell...

N_C>Да и лучше тогда вводить ограничение на вложенность версий, а то, народ будет
N_C>в беспамятстве штамповать новые версии и вместо того, чтобы делать новые классы,
N_C>будет пихать все это в один и тот-же класс.

Нет, этого не произойдёт.
То что я привёл это был вариант представления обобщённого кода всех версий.
На практике такое надо очень редко. А надо просто комбобокс на тулбаре для переключения версий, и вид текста программы автоматически перестраивается.
Re[5]: Полиморфный хак
От: Nikolay_Ch Россия  
Дата: 26.05.06 13:16
Оценка:
WR>Нет, этого не произойдёт.
WR>То что я привёл это был вариант представления обобщённого кода всех версий.
WR>На практике такое надо очень редко. А надо просто комбобокс на тулбаре для переключения версий, и вид текста программы автоматически перестраивается.
Ну а тогда в чем смысл? Это-же просто получается включенный в базовую студию программу версионного контроля?
Re: Полиморфный хак
От: VladGalkin Украина  
Дата: 26.05.06 13:22
Оценка: 4 (1)
Здравствуйте, WoldemaR, Вы писали:

WR>На чём сделать?


Есть такой рефактоинг: Introduce Foreign Method.

В кратце: Создаётся метод, принимающий библиотечный класс в качестве параметра.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
ДЭ!
Re[3]: Полиморфный хак
От: IT Россия linq2db.com
Дата: 26.05.06 13:44
Оценка: :))) :))) :))
Здравствуйте, WoldemaR, Вы писали:

IT>>Алтернативы?

WR>Функциональный блок внутри метода с новой версией. (opensource рулит).

Т.е. альтернатива полиморфизму — OpenSource. Я тебя правильно понял?
Если нам не помогут, то мы тоже никого не пощадим.
Re[3]: Полиморфный хак
От: IT Россия linq2db.com
Дата: 26.05.06 13:48
Оценка: 4 (1) +1
Здравствуйте, WoldemaR, Вы писали:

WR>Наверное надо показать синтаксис чтобы довести человека до оргазма?


Чем это отличается от:


class Some
{
   int member;
   
#ifdef V2
   int super;
#endif
};
Если нам не помогут, то мы тоже никого не пощадим.
Re[2]: Полиморфный хак
От: Eugene Beschastnov Россия http://eugenius-nsk.livejournal.com/
Дата: 26.05.06 13:50
Оценка:
Здравствуйте, IT, Вы писали:

IT>Алтернативы?


Подмена метода непосредственно в требуемом классе.
--
Бесчастнов Евгений
Re[4]: Полиморфный хак
От: WoldemaR Россия  
Дата: 26.05.06 14:40
Оценка:
Здравствуйте, IT, Вы писали:

IT>Чем это отличается от:


IT>

IT>class Some
IT>{
IT>   int member;
   
IT>#ifdef V2
IT>   int super;
IT>#endif
IT>};
IT>


Да. Ты прав. Получается что почти ничем, потому что это другой путь. Просто тогда надо написать нехилый довесок к IDE который будет морфировать код от версии к версии во всех направлениях.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.