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

Поиск:

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


uploading...
****


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

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



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

Цитата(baldina @  11.11.2011,  18:18 Найти цитируемый пост)
собственно и я об этом. хочу понять задачу

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

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

mes

Спасибо. Поработаю немного над примером, посмотрим что получиться.
 smile 

Всем спасибо за участие.


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


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


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

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



Цитата(azesmcar @  14.11.2011,  12:45 Найти цитируемый пост)
. Поработаю немного над примером, посмотрим что получиться.

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



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


uploading...
****


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

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



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

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

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

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


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


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

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



Цитата(azesmcar @  14.11.2011,  14:41 Найти цитируемый пост)

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

На данный момент я вижу вашу задачу так.. Есть лист на котоый могут быть положены объекты разных типов..
1. Объекты разделены по группам (фигуры, разделители, текст и т.д.)  при этом должна быть возможность динамечиски добавлять 
2. Лист предоставляет набор фиксированных действий предоставляемых над любыми объектами, и реализаторы сами решают какие команды поддерживают.. 
Это все что удалось с Вас вытянуть.. В таком изложении задача не очень большая, но внутрене чувствуются что это далеко не все..

Цитата(azesmcar @  14.11.2011,  14:41 Найти цитируемый пост)
но отбросил по причине большой нагрузки при реализации новых команд

мне кажется Вы упустили чего то.. 

Цитата(azesmcar @  14.11.2011,  14:41 Найти цитируемый пост)
По всей видимости дорабатывать придется еще некоторое время, так-как сейчас у нас на работе гости

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

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

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




Это сообщение отредактировал(а) mes - 14.11.2011, 16:21


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


uploading...
****


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

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



Цитата(mes @  14.11.2011,  16:19 Найти цитируемый пост)
1. Объекты разделены по группам (фигуры, разделители, текст и т.д.)  при этом должна быть возможность динамечиски добавлять 
2. Лист предоставляет набор фиксированных действий предоставляемых над любыми объектами, и реализаторы сами решают какие команды поддерживают.. 

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

Цитата(mes @  14.11.2011,  16:19 Найти цитируемый пост)
В таком изложении задача не очень большая

Так она и не большая, большой ее делают количество операций с объектами, а задача сама небольшая, просто душа требует красивого решения smile 

Цитата(mes @  14.11.2011,  16:19 Найти цитируемый пост)
мне кажется Вы упустили чего то.. 

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

Цитата(mes @  14.11.2011,  16:19 Найти цитируемый пост)
так наоборот хорошо есть время пообсуждать

да, если получиться приблизиться к компьютеру smile 
но я буду стараться.

Цитата(mes @  14.11.2011,  16:19 Найти цитируемый пост)
Вы напишите все "словосочетания", пусть даже не связанные, которые описывают что должно предоствалять решение этой задачи.. 

Давайте так. Разберем по полочкам что необходимо решению?
Возможность добавлять новые типы объектов не меняя при этом исходников.
Значит группировать операции над объектами по операциям не получиться, т.е.
Код

class copy_command
{
   void copy_rectangle(rectangle* r);
   void copy_polygon(polygon* r);
   // ...
};

такое отменяется (это я про visitor-а).
Остается либо группировать по типам объектов, либо не группировать вовсе, т.е. либо так
Код

class rectangle_commands
{
   void copy(rectangle* r);
   void move(rectangle *r, int x, int y);
   // ...
};

либо через интерфейсы и dynamic_cast.

Код

if (icopyable* ic = dynamic_cast<icopyable*>(obj))
{
    ic->copy();
}

Забудем на секунду о реализации, вернемся к ней попозже, сейчас попробуем сосредоточиться на самой идее.
Я вижу эти варианты. Реализация новых функций так или иначе должны находиться вне нашего исходного кода, т.е. они либо должны быть в самом классе нового типа (виртуальная функция), либо какая-то статические функции, сгруппированные в каком нибудь классе.

Вы видите еще какие либо варианты?

Добавлено через 2 минуты и 33 секунды
Цитата(mes @  14.11.2011,  16:19 Найти цитируемый пост)
Без описания с Вашей стороны, форумчане лишь могут предложить решение только своих представлений о вашей задаче, которые к сожалению в большинстве случаев далеки от Вашей десйтвительности.. 

Я не знаю как еще описать, Вы же все поняли
Цитата(mes @  14.11.2011,  16:19 Найти цитируемый пост)
1. Объекты разделены по группам (фигуры, разделители, текст и т.д.)  при этом должна быть возможность динамечиски добавлять 
2. Лист предоставляет набор фиксированных действий предоставляемых над любыми объектами, и реализаторы сами решают какие команды поддерживают.. 


PM   Вверх
mes
Дата 14.11.2011, 16:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  14.11.2011,  15:34 Найти цитируемый пост)
Давайте так. Разберем по полочкам что необходимо решению?
Возможность добавлять новые типы объектов не меняя при этом исходников.

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

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


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


uploading...
****


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

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



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

В принципе было бы неплохо, но это не так важно.

Цитата(mes @  14.11.2011,  16:44 Найти цитируемый пост)
избегая перекомпиляции чужих библиотек

Скажем так: не избегая, а без перекомпиляции, так-как исходников у них нет.

PM   Вверх
mes
Дата 14.11.2011, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(azesmcar @  14.11.2011,  15:34 Найти цитируемый пост)

Вы видите еще какие либо варианты?

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



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


uploading...
****


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

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



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

 smile

Добавлено @ 16:52
Цитата(mes @  14.11.2011,  16:50 Найти цитируемый пост)
наблюдается принуждение пользователя

к чему?

Добавлено @ 16:54
Цитата(mes @  14.11.2011,  16:50 Найти цитируемый пост)
Все варианты хороши как локальное решение,глобально же любая группа/слой должна иметь обособленность, чего примеры не отражают.. 

А какие могут быть еще варианты? Реализация функций в сторонней библиотеке должна содержаться в самой библиотеке и это должен быть либо виртуальный, либо статический метод какого-либо класса, либо команда (pattern command/функтор), что не очень приятно, так-как выделять по классу на каждую операцию будет накладно.

Добавлено @ 16:59
Самым простым и выполняющим все требования решением на данный момент мне видится интерфейсы и dynamic_cast, т.е. что-то такое
Код

class rectangle: public i_movable, public i_copyable {
   virtual std::string copy() { ... }
   virtual void mvoe(int x, int y) { ... }
};

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

Добавлено @ 17:02
На самом деле я не вижу какие реальные привилегии мне дает собственная таблица функций.
Их надо регистрировать, что отнимает время и хоть чуть-чуть, но все же усложняет жизнь, а что дает взамен?

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


uploading...
****


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

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



mes

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

Код

#include <iostream>
#include <vector>
#include <map>
#include <functional>

struct object;

struct i_modify
{
    virtual void move(object* obj, int x, int y) = 0;
    virtual void rotate(object* obj, int angle) = 0;
};

struct i_copy
{
    virtual std::string copy(object* obj) = 0;
};

struct object {
    virtual i_modify* modify_interface() { return 0; };
    virtual i_copy* copy_interface() { return 0; };
};

struct rectangle: public object
{
    struct rectangle_modify: public i_modify
    {
        virtual void move(object* obj, int x, int y)
        {
            /* move the rectangle */
            std::cout << "obj = " << obj << " moved to (" << x << ", " << y << ")" << std::endl;
        }
        virtual void rotate(object* obj, int angle)
        {
            /* rotate the rectangle */
        }
    };
    virtual i_modify* modify_interface() {
        static rectangle_modify rect_mod;
        return &rect_mod;
    };
};

int main ()
{
    object *obj = new rectangle();
    if (i_modify *mod = obj->modify_interface())
    {
        mod->move(obj, 10, 10);
    }
}

но здесь есть два минуса.
1. в самой функции приходиться получать объект базового типа, так-что от cast-а это не избавляет. Думаю как бы обойти.
2. нет возможности реализовать для объекта функцию move, но не реализовывать скажем функцию rotate (хотя этот минус есть и в случае виртуальных обычных функций, но там интерфейс можно максимально разделить, а в данном случае это приведет к необходимости писать кучу кода).


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


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


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

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



Цитата(azesmcar @  14.11.2011,  15:51 Найти цитируемый пост)
к чему?

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

Цитата(azesmcar @  14.11.2011,  16:21 Найти цитируемый пост)
сейчас думаю над такой вариацией query interface-а.

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

Цитата(azesmcar @  14.11.2011,  15:51 Найти цитируемый пост)
На самом деле я не вижу какие реальные привилегии мне дает собственная таблица функций.

в таком выражении и не дает..  если вы о примере, то плюс дает не таблица функций, а разбиение на прослойки, где для каждой группы можно добавить свой обработчик. Чтоб лучше понять представьте что вместо print, у нас execute_action (iaction &);

Цитата(azesmcar @  14.11.2011,  16:21 Найти цитируемый пост)
сейчас думаю над такой вариацией query interface-а.

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

чуть позже сделаю  пример с пояснением как я вижу вашу решение..




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


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


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

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



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


Это сообщение отредактировал(а) mes - 14.11.2011, 18:14


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


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


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

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



Цитата(azesmcar @  14.11.2011,  15:34 Найти цитируемый пост)
я имел ввиду, что реализовывать новый класс для каждой команды как-то не привлекательно.

вот каракас для допиливания :

http://liveworkspace.org/code/9c9ae402c782...be5c4d3264d0e35
как видите определение новой команды может быть всего лишь типа :
Код

action<int,int> move;

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

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

для полноценного тестового запуска нужно добавить сериализацию/десериализацию, но суть и так понятна.. 
если что может помочь в этом направлении так и не доведенная до конца тема :
http://forum.vingrad.ru/forum/topic-323593...ed-discoly.html

Это сообщение отредактировал(а) mes - 14.11.2011, 23:00


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


uploading...
****


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

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



mes

У нас древний компилятор, boost-а нет...я смутно представляю чего мне будет стоить такая реализация.
Завтра с утра посмотрю повнимательнее что да как и отвечу.
Спасибо.
PM   Вверх
mes
Дата 14.11.2011, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



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

для начала определимся с лексиконом, чтоб удобно было делить по группом вводим понятия тип_примитива и вариант_примитива..
где тип : ifigure, а вариант : наследник ifigure (rect, circle).. вариант всего лишь реализует интерфейс ifigure и никакой обработки команд не имеет.
для обработки вводим еще связывующее звено, для нас это figure_commander .. commander`ы должны быть зарегистрированы в main_commander.. 

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

Добавлено через 34 секунды
Цитата(azesmcar @  14.11.2011,  22:05 Найти цитируемый пост)
У нас древний компилятор, boost-а нет...я смутно представляю чего мне будет стоить такая реализация.

так предупреждать надо было сразу smile

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



--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
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.0663 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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