Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> полиморфная модификация объектов 
:(
    Опции темы
baldina
Дата 11.11.2011, 12:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(azesmcar @  11.11.2011,  10:55 Найти цитируемый пост)
т.е. Вы за
Цитата(baldina @  11.11.2011,  10:35 )
лучше использовать visitor

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

если я правильно понял, пользователи будут реализовывать классы, а набор операций предопределен (и может меняться от версии к версии).
тогда пользователь в классе просто реализует виртуальные функции, query_interface  не нужен.

если набор операций может меняться (пользователем), то можно использовать либо visitor либо query_interface. в этом случае я за первое. но у Вас как я понял пользователи только классы добавляют, но не методы.

Цитата(azesmcar @  11.11.2011,  10:55 Найти цитируемый пост)
Вы про CRTP? 

я не про механизм CRTP, я про идею расширения класса методами (которая может использовать CRTP как средство, но может и иначе).
у авторов boost::operators, на мой взгляд, получилось изящно.
PM MAIL   Вверх
azesmcar
Дата 11.11.2011, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(baldina @  11.11.2011,  12:01 Найти цитируемый пост)
если я правильно понял, пользователи будут реализовывать классы, а набор операций предопределен (и может меняться от версии к версии).

нет, они определяют типы и операции с ними.

Цитата(baldina @  11.11.2011,  12:01 Найти цитируемый пост)
тогда пользователь в классе просто реализует виртуальные функции

т.е. в итоге получается, что базовый интерфейс должен поддерживать операции move, rotate, copy ... и так далее, или должны быть интерфейсы imovable, irotatable, icopyable...
а пользователь сам решает, какие интерфейсы он будет поддерживать. Это приводит нас опять таки к query interface, в том или ином виде.

Цитата(baldina @  11.11.2011,  12:01 Найти цитируемый пост)
я не про механизм CRTP, я про идею расширения класса методами (которая может использовать CRTP как средство, но может и иначе).

не совсем представляю как это можно применить к текущей задаче?

Это сообщение отредактировал(а) azesmcar - 11.11.2011, 12:14
PM   Вверх
baldina
Дата 11.11.2011, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(azesmcar @  11.11.2011,  12:09 Найти цитируемый пост)
они определяют типы и операции с ними

видимо я не вполне понял Вашу задачу. прочитал еще раз, внимательно, но нового не увидел.

давайте на примере:
пользователь определил новый тип объекта "пирог" и операцию над ним "съесть"

как ваш базовый интерфейс узнает об этом методе? или все-таки методы определяет фреймворк, а пользовательские классы его реализуют (или не реализуют)?
PM MAIL   Вверх
azesmcar
Дата 11.11.2011, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(baldina @  11.11.2011,  14:02 Найти цитируемый пост)
как ваш базовый интерфейс узнает об этом методе? или все-таки методы определяет фреймворк, а пользовательские классы его реализуют (или не реализуют)? 

методы определяет фреймворк, пользователи его либо реализуют, либо нет.

Попробую упростить задачу до примера.

Начну с нуля.

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

Вот иерархия классов:
Цитата

figure_base
   rectangle
   polygon
   circle
   text
   ruler


С объектами можно производить некоторые операции, например копировать или перемещать. Возьмем для примера копирование.
Копирование по сути это текстовая сериализация объекта, далее этот текст помещается в буфер обмена.
Далее.
Группа B используется библиотеку в своем проекте, они добавлают новый тип объектов - точка. Они добавляют свой класс, наследник от figure_base и регистрируют его в библиотеке, далее они должны реализовать копирование объекта типа point.
Теперь о реализации.
Реализовать это можно многими способами, дело в том, чтобы выбрать самый подходящий.

1. Самый тупой способ - поместить все возможные функции в базовый класс figure_base, т.е. поместить туда функцию copy с default реализацией.
Код

virtual std::string copy() { throw std::runtime_error("not implemented"); };

если автор класса point добавит в свой класс функцию копирования - тогда все прекрасно, а нет - значит копирование не поддерживается, покажем пользователю фигу.
Но недостаток этого подхода в том, что интерфейс базового класса засоряется.

2. Более цивильный способ, разделить все на интерфейсы, т.е. добавить интерфейс icopyable, imovable... и так далее, а потом проверять, реализует ли класс этот интерфейс с помощью dynamic_cast-а. В итоге получается queryInterface. Недостаток подхода в том, что получается нагромождение всех функций в одном классе, который должен поддерживать и перемещение и копирование и поворот и многое другое. Чем больше функций, тем больше нагромождение, хотя интерфейс базового класса в этом случае не засоряется. Еще один минус подхода в медленной работе самого dynamic_cast-а.

3. С помощью вышеупомянутого шаблона visitor. В принципе все удобно, все разделено по функциональности, надо поменять функцию copy - меняем один класс, можно добавлять функции не меняя интерфейс самих классов. Недостаток в данном случае заключается в том, что при реализации копирование для объектов типа point, программисту придется лезть в нашу библиотеку и менять исходники, что не очень приятно. Желательно, чтобы его расширение было самодостаточно и не требовало модификаций нашего кода.

Надеюсь смог нормально описать.


Это сообщение отредактировал(а) azesmcar - 11.11.2011, 14:25
PM   Вверх
mes
Дата 11.11.2011, 14:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Earnest @  11.11.2011,  10:46 Найти цитируемый пост)
и в конечной реализации возникнут if или switch..

или таблицы.. 

Цитата(newbee @  11.11.2011,  10:06 Найти цитируемый пост)
. Ты сделаешь свою маленькую динамическую. 

 smile , если надо чтоб "визетеры" могли быть динамически расширяемыми..

Добавлено через 3 минуты и 29 секунд
Цитата(Earnest @  11.11.2011,  10:46 Найти цитируемый пост)
. Но проблема в том, что при добавлении нового типа объектов, существующие визиторы о них ничего не узнают

если исходить из классического представления с ориентировкой на объекты, то толку от регистрации в принципе не.. но если сделать ориентировку на методы (не функции челены, а методы алгоритма) то будет понятно что где и как регистрировать..

Добавлено через 5 минут и 59 секунд
Цитата(azesmcar @  11.11.2011,  11:09 Найти цитируемый пост)
 и так далее, или должны быть интерфейсы imovable, irotatable, icopyable...
а пользователь сам решает, какие интерфейсы он будет поддерживать

ложить интерфейсы в ядро, это неподъемный труд..  ядро вначале нужно разделить на функционал, а уж каждый функционал можно реализовывать по разному, в том числе и через интерфейсы.. 



--------------------
PM MAIL WWW   Вверх
math64
Дата 11.11.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



Нет, регистрировался не просто класс, а связка его с методом Посетителя - точно не помню как.
Что-то похожее на это (но вряд ли это):
Код

template <typename Visitor, typename Visitable> class Register {
void visit(Visitor* visitor, Visitable* visitable) { visitor->visit(visitable); }
};


PM   Вверх
baldina
Дата 11.11.2011, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(azesmcar @  11.11.2011,  14:22 Найти цитируемый пост)
методы определяет фреймворк, пользователи его либо реализуют, либо нет.

я так и предполагал. тогда достаточно объявить виртуальные методы в базовом классе.

Цитата(azesmcar @  11.11.2011,  14:22 Найти цитируемый пост)
недостаток этого подхода в том, что интерфейс базового класса засоряется.

конечно. для решения этой проблемы существует классификация и декомпозиция. 

почитал дальше, вроде разобрался)))

кажется, проблема заключается не в наследовании и операциях, а в том, о чем Вы не упоминаете: операции производятся ядром над объектами базового класса, и нет возможности узнать какие именно интерфейсы реализуются классом.
скажем, end-user выбирает правой кнопкой мыши объект, и контекстное меню должно отобразить доступные операции.
если новые объекты подключаются на этапе компиляции, это можно решить статической проверкой. остальное сделает компилятор. 
если интерфейс нужно определять динамически, то либо callback (эдакие динамические visitorы) либо query-interface. принципиальной разницы в этом случае не вижу.

если я все правильно понял, и речь идет о статической задаче (периода компиляции), то MP (типа is_function_member<>)

Добавлено через 2 минуты и 32 секунды
а статические посетители применяются, если набор операций не предопределен. у Вас это не так
PM MAIL   Вверх
mes
Дата 11.11.2011, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  11.11.2011,  13:22 Найти цитируемый пост)
Надеюсь смог нормально описать.

несколько важных моментов упущено.. сейчас попробую выудить их.. 



--------------------
PM MAIL WWW   Вверх
baldina
Дата 11.11.2011, 14:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(mes @  11.11.2011,  14:41 Найти цитируемый пост)
если исходить из классического представления с ориентировкой на объекты, то толку от регистрации в принципе не.. но если сделать ориентировку на методы (не функции челены, а методы алгоритма) то будет понятно что где и как регистрировать..

угу. но на самом деле тут нет одного, "правильного" взгляда. нужно несколько иерархий одновременно, в том и проблема. я потому и упоминал аспектный подход.
PM MAIL   Вверх
mes
Дата 11.11.2011, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  11.11.2011,  13:22 Найти цитируемый пост)
Допустим есть библиотека для работы с геометрическими объектами .

о полиморфности ни слова.. 

Цитата(azesmcar @  11.11.2011,  13:22 Найти цитируемый пост)
 Они добавляют свой класс, наследник от figure_base и регистрируют его в библиотеке, далее они должны реализовать копирование объекта типа point.

динамически добавляют ?
Цитата(azesmcar @  11.11.2011,  13:22 Найти цитируемый пост)
. Самый тупой способ, Более цивильный способ, с помощью умянутого шаблона visitor

у всех трех способов есть очевидный недостаток, это жесткая завязанность на системе типов.. 
второй недостаток, все в одной яме

Добавлено через 1 минуту и 2 секунды
Цитата(baldina @  11.11.2011,  13:59 Найти цитируемый пост)
в том и проблема. я потому и упоминал аспектный подход. 

про АОП читал, но пока его не понимаю, поэтому в этой связи ничего не могу сказать..

Добавлено через 2 минуты и 18 секунд
Цитата(baldina @  11.11.2011,  13:59 Найти цитируемый пост)
нет одного, "правильного" взгляда

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



--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 11.11.2011, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  11.11.2011,  15:02 Найти цитируемый пост)
о полиморфности ни слова.. 

А какие здесь нужны слова?

Цитата(mes @  11.11.2011,  15:02 Найти цитируемый пост)
динамически добавляют ?

Нет, статически добавляют и сами же используют. Расширяют библиотеку для своих целей, нас это не касается.

Цитата(mes @  11.11.2011,  15:02 Найти цитируемый пост)
угу нету.. но есть пара деталей, о которых забывает тс, и поэтому не может связать задачу с подходящем решением.. именно на них я и пытаюсь сконцентрировать внимание.. 

На данный момент я не вижу подходящего решения, чтобы связать с ней задачу smile

Добавлено через 1 минуту и 56 секунд
Цитата(baldina @  11.11.2011,  14:48 Найти цитируемый пост)
кажется, проблема заключается не в наследовании и операциях, а в том, о чем Вы не упоминаете: операции производятся ядром над объектами базового класса, и нет возможности узнать какие именно интерфейсы реализуются классом.

не совсем понял мысль. Почему нет такой возможности? Есть dynamic_cast. На данный момент так и сделано, проверяется реальный тип и вызывается соответствующая функция для этого типа. Цель как раз в том, чтобы избавиться от этого.

Добавлено через 2 минуты и 57 секунд
Цитата(mes @  11.11.2011,  15:02 Найти цитируемый пост)
у всех трех способов есть очевидный недостаток, это жесткая завязанность на системе типов.. 

ну предложите четвертый, мне мои 3 тоже не нравятся smile 
PM   Вверх
mes
Дата 11.11.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  11.11.2011,  13:22 Найти цитируемый пост)
С объектами можно производить некоторые операции, например копировать или перемещать. Возьмем для примера копирование.
Копирование по сути это текстовая сериализация объекта, далее этот текст помещается в буфер обмена.

немножко переформулирую.. 

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

так правильно ?




--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 11.11.2011, 15:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(baldina @  11.11.2011,  14:59 Найти цитируемый пост)
угу. но на самом деле тут нет одного, "правильного" взгляда. нужно несколько иерархий одновременно, в том и проблема. я потому и упоминал аспектный подход. 

потом почитаю для интереса, во всяком случае как я понимаю решению задачи это не поможет?
PM   Вверх
mes
Дата 11.11.2011, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(azesmcar @  11.11.2011,  14:08 Найти цитируемый пост)
Нет, статически добавляют и сами же используют. Расширяют библиотеку для своих целей, нас это не касается.

и при добавлении вынуждены перекомпилировать библиотеку ? или ж это не желательно ?



Это сообщение отредактировал(а) mes - 11.11.2011, 15:20


--------------------
PM MAIL WWW   Вверх
azesmcar
Дата 11.11.2011, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(mes @  11.11.2011,  15:17 Найти цитируемый пост)
и при добавлении вынуждены перекомпилировать библиотеку ? или ж это не желательно ?

А зачем это нужно? Они же не меняют наших исходников.
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0755 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.