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

Поиск:

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


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


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

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



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

 smile кто то кого то не понимает или оба друг друга.. 



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


Эксперт
****


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

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



Код

class Visitor;
class GObject {
public:
virtual void visit(Visitor* v) = 0;
};

class IMovable {
public:
};

class IRotatable {
public:
};

class Visitor
{
public:
virtual void visit(GObject* g, IMovable* m = NULL, IRotatable* r = NULL, bool after = false) = 0;
};

class Rect : public GObject, public IMovable {
public:
virtual void visit(Visitor* v) { v->Visit(this, this, NULL); }
};

class Poligon : public GObject, public IMovable, public IRotatable {
public:
virtual void visit(Visitor* v) { v->Visit(this, this, this); }
};
class Unmovable : public GObject {
public:
virtual void visit(Visitor* v) { v->Visit(this, NULL, NULL); }
};
class Group : public GObject {
public:
virtual void visit(Visitor* v) {
 v->Visit(this, NULL, NULL, false); 
 for(list<GObject*>::iterator i = childs.begin(); i != childs.end(); ++i)
   (*i)->visit(v);
 v->Visit(this, NULL, NULL, true); 
}
private:
list<GObject*> childs;
};


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


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


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

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



Цитата(azesmcar @  11.11.2011,  08:26 Найти цитируемый пост)
по какой причине?

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



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


Бревно
**


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

Репутация: 4
Всего: 19



Я наверное не поняла всю сложность задачи,.. потому что по-моему все просто. Каждому типу объекта задается уникальный идентификатор. Далее регистрируем наборы функций для каждого типа (устанавливаем соответствие идентификатор-типа -> функция-делания-чего-то). Теперь общая функция, например copy, будет смотреть, какой объект к ней пришел, и вызывать соответствующую ему функцию копирования или пытаться выполнить какую-то операцию по умолчанию (попытаться самой провести копирование, или бросить эксепшн Ахтунг, или еще что-нибудь).


--------------------
You're face to face
With man who sold the world
PM   Вверх
azesmcar
Дата 11.11.2011, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



Цитата(mes @  11.11.2011,  09:42 Найти цитируемый пост)
 smile кто то кого то не понимает или оба друг друга.. 

если разделить функции по сущностям, тогда каждая сущность будет иметь свою функцию копирования, пусть в Вашем примере она не будет засорять интерфейс основного класса, но тем не менее она привязана к сущности, а значит для изменения конкретной функции для всех сущностей, придется менять все классы.
Конечно, с другой стороны, если сделать через что-то вроде visitor-а и придется менять все функции для конкретной сущности, тогда возникнет та же проблема, но это редкость, не думаю, что такое вообще может понадобиться.
PM   Вверх
mes
Дата 11.11.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

Добавлено через 6 минут и 21 секунду
Цитата(azesmcar @  11.11.2011,  08:50 Найти цитируемый пост)
но тем не менее она привязана к сущности, а значит для изменения конкретной функции для всех сущностей, придется менять все классы.

если смешаете обработку команд и логику фигур в одно месиво, да придется.. (только я этого не предлогал)

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

Добавлено через 10 минут и 45 секунд
Цитата(azesmcar @  11.11.2011,  08:26 Найти цитируемый пост)
проект огромен, так что задача сложна

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




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


uploading...
****


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

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



math64
Этих IMovable, IRotatable и всего остального будет слишком много, чтобы пихать их в параметры функции.

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

Мне самом не нравится, просто интересует и Ваше мнение. Мне оно не нравится по той же причине.

Цитата(mes @  11.11.2011,  09:46 Найти цитируемый пост)
не забывать опять таки то про комбинацию 

Про какую? smile 

Цитата(newbee @  11.11.2011,  09:46 Найти цитируемый пост)
Я наверное не поняла всю сложность задачи

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

Цитата(newbee @  11.11.2011,  09:46 Найти цитируемый пост)
Далее регистрируем наборы функций для каждого типа (устанавливаем соответствие идентификатор-типа -> функция-делания-чего-то). Теперь общая функция, например copy, будет смотреть, какой объект к ней пришел, и вызывать соответствующую ему функцию копирования или пытаться выполнить какую-то операцию по умолчанию 

Это обыкновенный полиморфизм, сделанный своими руками smile 
Ничем не лучше visitor-а, и опять таки встает вопрос о том, что другая группа, которая будет добавлять свои типы и желательно ограничить их деятельность в рамках своего кода и не заставлять их копаться в нашем.

Добавлено через 3 минуты и 10 секунд
Цитата(mes @  11.11.2011,  09:51 Найти цитируемый пост)
еще одно, делите на слои..  так для визуального редактора явно выделяются два :
модели фигур и контролеры их взаимодействия с пользователем.. 
соотношение сущностей не прямое.. то есть на каждую фигуру свой контролер - плохо..

Это все уже давно сделано, система спроектирована давно и существует на протяжении многих лет. Хорошо или плохо, но менять ее никто не собирается, но конкретно часть с редактированием сделана просто ужасно, потому было решено предоставить мне немного времени на редизайн, чтобы я не свихнулся, сопровождая это недоразумение.
PM   Вверх
mes
Дата 11.11.2011, 10:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  11.11.2011,  09:09 Найти цитируемый пост)
Ничем не лучше visitor-а, 

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



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


Эксперт
****


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

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



Цитата(azesmcar @  11.11.2011,  10:09 Найти цитируемый пост)
Этих IMovable, IRotatable и всего остального будет слишком много, чтобы пихать их в параметры функции.

Можешь реализовать и с отдельными visit(IMovable), visit(IRotatable), и т.д.  - eсли не смущает то, что если объект поддерживает несколько интерфейсов, visit() придётся вызывать несколько раз, по разу для каждого интерфейса.
Главное определить набор интерфейсов так, чтобы при добавлении нового класса не нужно было добавлять нового интерфейса.

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


Опытный
**


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

Репутация: 1
Всего: 7



Такое ощущение, что кто-то недавно прочитал про Visitor и сразу бросился им загромождать код. -) Уж извините, такое впечатление сложилось.


--------------------
- why you call it beta?
- cuz it's betta then nothin'
PM MAIL   Вверх
baldina
Дата 11.11.2011, 10:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(azesmcar @  11.11.2011,  09:26 Найти цитируемый пост)
проект огромен, так что задача сложна

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

Цитата(baldina @  11.11.2011,  00:27 Найти цитируемый пост)
Цитата(azesmcar @  10.11.2011,  17:36 )
query interface
 в этом случае как-то не очень...

если методы добавляются редко лучше использовать visitor. query interface-подобные решения не дают возможности привычного статического контроля.

Цитата(azesmcar @  11.11.2011,  09:26 Найти цитируемый пост)
 объекты добавляют другие, так-что мы часто и не в курсе

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

Добавлено через 2 минуты и 47 секунд
Цитата(azesmcar @  11.11.2011,  10:09 Найти цитируемый пост)
Это все уже давно сделано, система спроектирована давно и существует на протяжении многих лет. Хорошо или плохо, но менять ее никто не собирается, но конкретно часть с редактированием сделана просто ужасно, потому было решено предоставить мне немного времени на редизайн, чтобы я не свихнулся, сопровождая это недоразумение. 

мне нравится способ, примененный в boost::operators.

Добавлено через 3 минуты и 39 секунд
при  таком подходе вам при добавлении метода надо будет только поменять шаблоны.

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


uploading...
****


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

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



Цитата(spyswamp @  11.11.2011,  10:33 Найти цитируемый пост)
Такое ощущение, что кто-то недавно прочитал про Visitor и сразу бросился им загромождать код. -) Уж извините, такое впечатление сложилось. 

Читал о нем очень давно и кстати вторую страницу пишу о том, что это решение мне не нравится. Привел в качестве рассматриваемых решений.

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

не совсем понял.

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

имелось ввиду, что и классов и функций достаточно много.

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

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

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

Цитата(baldina @  11.11.2011,  10:35 Найти цитируемый пост)
мне нравится способ, примененный в boost::operators.

Вы про CRTP? А как это здесь поможет?

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


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


Бревно
**


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

Репутация: 4
Всего: 19



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


--------------------
You're face to face
With man who sold the world
PM   Вверх
math64
Дата 11.11.2011, 11:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Читал котда-то давно статью в "Мир ПК", в каком номере не помню, про модифакцию патерна Visitor с возможностью добавления новых посещаемых классов, но реализация довольно сложная - для того, чтобы пользоваться новыми классами в модифицированном Visitor. их нужно регистрировать.
PM   Вверх
Earnest
Дата 11.11.2011, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



Цитата(math64 @  11.11.2011,  12:08 Найти цитируемый пост)
 но реализация довольно сложная - для того, чтобы пользоваться новыми классами в модифицированном Visitor. их нужно регистрировать. 

Регистратор прикрутить как раз несложно. Но проблема в том, что при добавлении нового типа объектов, существующие визиторы о них ничего не узнают (кроме факта существования, регистрация ничего не добавит). Как сделать DoSomething с объектом неизвестной породы? Только вызвать его соответствующий виртуальный метод. А методы плодить на все случаи жизни не хочется. Можно сделать что-то типа Invoke с параметром "заданное действие". И пусть объект решает, поддерживает он это действие или ну его нафик. Вот только действие передавать придется либо идентификатором, либо каким-то классом-тэгом и в конечной реализации возникнут if или switch...




--------------------
...
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.0678 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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