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

Поиск:

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


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


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

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



Цитата(mes @  14.11.2011,  22:17 Найти цитируемый пост)
сейчас поправлю ключевые места, 

держите и тестируйте на своем компиляторе:
http://liveworkspace.org/code/ca6c4fecda3d...d3101dcc94b165b (обновлено)

естственно все написанно на скорую руку и требует детальной доработки, но для работоспособности никакого буста не надо..
пример any  есть где то на форуме, но нужен только если, необходимо удлиненное хранение аргументов.. при ассинхронном подходе..
ну а кол-во аргументов можно расшить например до (входные const& , выходные&); чтоб была возможность диалога..

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

Цитата(mes @  14.11.2011,  22:17 Найти цитируемый пост)
тогда.. 

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


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


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


Эксперт
****


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

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



Если команды будут с 0..2 параметрами можно переписать так, что будет компилироваться в VS.
(уже сделали - не посмотрел на новую страницу темы)

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


uploading...
****


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

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



mes

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

Что я получаю взамен, чего мне не дает dynamic_cast? Как это решение облегчает дальнейшее сопровождение кода? Какие дает возможности расширения в будущем?
Я сам не люблю dynamic_cast, но в конечном итоге все делается для удобства написания и дальнейшего сопровождения. Я понимаю Ваше решение, но не понимаю какие плюсы мне это дает.
Не примите за критику, я пока просто пытаюсь понять плюсы предложенного решения smile 

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


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


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

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



Для каждой операции над объектом (а их много) необходимо создавать структуру параметров.[/quote]

 не для каждой, а для каждой разнотипной.. Т.е. для одного набора аргументов может быть несколько комманд.. 
Цитата(azesmcar @  15.11.2011,  08:21 Найти цитируемый пост)

Каждую операцию надо регистрировать.

если не операцию,  а метод обработчика, то да.. 


Цитата(azesmcar @  15.11.2011,  08:21 Найти цитируемый пост)
Каждая операция требует создания отдельного класса.

не понимаю о чем Вы.. вот как выглядет пользование 
Цитата

struct pos_args {  int x, y; };
struct angle_args { int angle; };

action<pos_args>   move    ("move");
action<pos_args>   moveto  ("moveto");
action<angle_args> rotate  ("rotate");

   
    cmder ( move   ( a1 ) );
    cmder ( moveto ( a2 ) );
    cmder ( rotate ( a3 ) );



Цитата(azesmcar @  15.11.2011,  08:21 Найти цитируемый пост)
Для каждой операции над объектом (а их много) необходимо создавать структуру параметров.

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

Цитата(azesmcar @  15.11.2011,  08:21 Найти цитируемый пост)
Что я получаю взамен, чего мне не дает dynamic_cast?

неправильная постановка вопроса.. это не альтернатива dynamic_cast, это просто иной подход к понятию интерфейс..

Цитата(azesmcar @  15.11.2011,  08:21 Найти цитируемый пост)
Я сам не люблю dynamic_cast, но в конечном итоге все делается для удобства написания и дальнейшего сопровождения. 

опять акцептирования внимание не на том.. dynamic_cast тут не при чем.. 

Цитата(azesmcar @  15.11.2011,  08:21 Найти цитируемый пост)
Как это решение облегчает дальнейшее сопровождение кода? Какие дает возможности расширения в будущем?

вот на это уже можно отвечать.. 
1. например у вас много обработчиков разных команд, (std::vector <handler_t*> v);
вы хотите в цикле для каждого вызвать команду move.. 
в случае с командами я напишу примерно так  :
Код

for (auto p : v)
{
      p->dispatch (move(5,5));
}

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

struct handler 
{
     void on_move () {}
     void regthis (commander_t& c, bool flag);
};

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

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

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

и еще куча вариантов, на вспоминание которых  сейчас нет времени  smile

а теперь попробуйте переписать перечисленное через интерфейсы..

Добавлено через 5 минут и 37 секунд
Цитата(azesmcar @  15.11.2011,  08:21 Найти цитируемый пост)
В конечном итоге решение сводиться к регистру шаблона команда со стандартным параметром void

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

Добавлено через 7 минут и 43 секунды
и да и dynamic_cast никто не отменял, он остается как вариант взаимодействия обработчика с вариантами типов.. (или же вместо него будет визитор)..


Это сообщение отредактировал(а) mes - 15.11.2011, 10:51


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


uploading...
****


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

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



Цитата(mes @  15.11.2011,  10:49 Найти цитируемый пост)
не для каждой, а для каждой разнотипной

Они практически все разнотипные.

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

Об этом
Код

struct cmd_handler2 
{
   void on_rotate(angle_args const& a)
   {
      std::cout << "rotate(" << a.angle << "); ";
   }     
};


Цитата(mes @  15.11.2011,  10:49 Найти цитируемый пост)
для гибкости интерфейсы тоже придется делить на мелкие, и кол-во кода будет одного порядка..  

Для начала можно и не делить. В данном случае делить можно будет по необходимости. К примеру для начала создать интерфейс i_modifier, который будет содержать функции типа rotate, move, change_layer ... итд, а далее по необходимости реазделять на более мелкие интерфейсы.

Цитата(mes @  15.11.2011,  10:49 Найти цитируемый пост)
неправильная постановка вопроса.. это не альтернатива dynamic_cast, это просто иной подход к понятию интерфейс..

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

Цитата(mes @  15.11.2011,  10:49 Найти цитируемый пост)
1. например у вас много обработчиков разных команд, (std::vector <handler_t*> v);

Это уже другой разговор. Теперь давайте думать о том, нужно ли это?
В основном предполагается производить операцию над объектами через интерфейс базового класса.
Пример использования: пользователь выбрал несколько объектов и набрал команду move {10 20}, все объекты должны быть перемещены.
Того, что Вы описали не планируется, но я еще подумаю об этом.

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

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

Цитата(mes @  15.11.2011,  10:49 Найти цитируемый пост)
3. нам нужно до обработчика и/или после выполнить какое то действие.. например хотим вывести лог.. 

Не нужно, эта возможность у нас уже есть. Все операции вызываются из команд, которые вызываются из интерпретатора. Для команд можно устанавливать pre/post callback-и.

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

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

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

А зачем нужно перекомпилировать чужую библиотеку в случае с интерфейсами?

Код

// библиотека

class i_movable {
   virtual void move(int x, int y);
};

class i_object { ... };

class rectangle: public i_object, public i_movable { ... };

далее другая группа делает следующее
Код

class triangle: public i_object, public i_movable { ... };

зачем ей что-то перекомпилировать?
PM   Вверх
azesmcar
Дата 15.11.2011, 11:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


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

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



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

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

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

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


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


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

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



Цитата(azesmcar @  15.11.2011,  10:09 Найти цитируемый пост)
. К примеру для начала создать интерфейс i_modifier, который будет содержать функции типа rotate, move, change_layer ... итд, а далее по необходимости реазделять на более мелкие интерфейсы.

ну  ну.. успеха smile  что то после таких слов и не верится, что Вас пугает объем работы.. 

Цитата(azesmcar @  15.11.2011,  10:09 Найти цитируемый пост)
Об этом

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

Цитата(azesmcar @  15.11.2011,  10:09 Найти цитируемый пост)
Еще его надо будет зарегистрировать. В случае с dynamic_cast я просто создаю новый интерфейс и наследую его там, где его нужно реализовывать. Так-что разница небольшая.

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

Цитата(azesmcar @  15.11.2011,  10:09 Найти цитируемый пост)
Не нужно, эта возможность у нас уже есть. Все операции вызываются из команд, которые вызываются из интерпретатора. Для команд можно устанавливать pre/post callback-и

это называется игра в темную.. Если у вас уже есть команды то чего мы придумываем то тут ? 

Цитата(azesmcar @  15.11.2011,  10:09 Найти цитируемый пост)
Не совсем понял о чем это. Если вы про изменения расширений других разработчиков, то у нас нет доступа к их исходникам, мы с ними никак не связаны. Они используют наш продукт, мы с их продуктом не работаем.

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

Цитата(azesmcar @  15.11.2011,  10:09 Найти цитируемый пост)
А зачем нужно перекомпилировать чужую библиотеку в случае с интерфейсами?

потому что вы не можете воздействовать реализацию в следствии ее монолитности.. 


Цитата(azesmcar @  15.11.2011,  10:09 Найти цитируемый пост)
зачем ей что-то перекомпилировать? 

появилась еще команда и в moveble добавили еще один метод..  smile

Добавлено через 1 минуту и 56 секунд
Цитата(azesmcar @  15.11.2011,  10:29 Найти цитируемый пост)
 Другие могут только добавлять свои типы и операции, менять у нас они ничего не должны.

т.е. Вы заранее знаете как пользователю лучше ? smile

Добавлено через 3 минуты и 1 секунду
Цитата(azesmcar @  15.11.2011,  10:29 Найти цитируемый пост)
Еще раз скажу, что я не защищаю какое либо решение. Просто перед тем как принять одно, я должен понять что оно мне дает и чем я ради него жертвую.

при таком подходе я Вам не советчик..  smile 



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


uploading...
****


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

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



Цитата(mes @  15.11.2011,  16:02 Найти цитируемый пост)
ну  ну.. успеха smile  что то после таких слов и не верится, что Вас пугает объем работы.. 

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

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

Я говорил не про регистрацию, а про то, что
Цитата(azesmcar @  15.11.2011,  09:21 Найти цитируемый пост)
Каждая операция требует создания отдельного класса.


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

Мы кажется друг друга не понимаем. Никто в чужие исходники не лезет. Зачем это нужно? Есть базовый класс geometry и некоторые операции типа move, rotate...которые определены в виде интерфейсов, другая команда разработчиков наследует свой тип, пусть будет rectangle и реализует интерфейсы move и rotate, о наших классах он ничего не знает, нашего кода у него нет и ему это не нужно.

Цитата(mes @  15.11.2011,  16:02 Найти цитируемый пост)
это называется игра в темную.. Если у вас уже есть команды то чего мы придумываем то тут ? 

Команды - это другая история, их использовать нельзя, потому я о них молчу. Это не просто команда, а немного необычный класс, который работает через интерпретатор. В общем это долгая история, на данный момент все реализовано через эти команды и мы как раз пытаемся от этого избавиться. Просто если я начну рассказывать всю архитектуру, писать мне придется очень долго.

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

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

Цитата(mes @  15.11.2011,  16:02 Найти цитируемый пост)
появилась еще команда и в moveble добавили еще один метод..  smile 

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

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


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


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

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



Цитата(azesmcar @  15.11.2011,  10:29 Найти цитируемый пост)
На данный момент я нахожу наименьшим злом решение с query interface-ом, потому все предложения сравниваю с ним.

давайте сравним.. 

пойдем разымышлять от QI : есть набор типов , которые поддерживают некоторые интерфейсы.. поддерживать они могут через множественноенаследование - что приводит к статическому монолиту, либо динамически региструя наследника, что позволяет расширять динамически поведение.. Если планируется расширение комманд и разрозренная разроботка (как в вашем случае) требуется второй вариант.. Для увелечения мобильности, интерфейсы должны быть минимализированы.. 
В принципе получили теже команды только в другом виде.. В чем же отличие ? В передачи действия :
представим картину.. мастеру пришло задание,   
QI :  он по одному вызывает рабочего, смотрит может ли он это выполнить , если да то дирижирует им.. 
Cmd :  письмо передается по очереди, в которой каждый выполняет лишь свое действие.. 

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


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


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


uploading...
****


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

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



Цитата(mes @  15.11.2011,  16:02 Найти цитируемый пост)
т.е. Вы заранее знаете как пользователю лучше ? smile

Нет, я знаю что он должен делать, а чего не должен smile 

Цитата(mes @  15.11.2011,  16:02 Найти цитируемый пост)
при таком подходе я Вам не советчик..  smile 

А что не так с подходом? Я должен яростно защищать dynamic_cast? Тогда зачем создавать тему, если в итоге я все равно настроен решать так, как хочу сейчас?
Перед тем как принять решение, я должен понять его плюсы и минусы, и эти плюсы должны перевесить минусы.

mes

Давайте перед началом сравнения проясним кое-что. Я не нашел в Вашем примере где Вы вообще обрабатываете объекты? Вы вызвали обработчик, но где ему передается rectangle, polygon и тому подобное?
Этого здесь нет, как предполагается передача самого объекта обработчику?


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


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


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

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



Цитата(azesmcar @  15.11.2011,  15:22 Найти цитируемый пост)
А что не так с подходом? Я должен яростно защищать dynamic_cast? Тогда зачем создавать тему, если в итоге я все равно настроен решать так, как хочу сейчас?

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

Добавлено через 3 минуты и 3 секунды
Цитата(azesmcar @  15.11.2011,  15:16 Найти цитируемый пост)
Каждая операция требует создания отдельного класса.

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

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


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


uploading...
****


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

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



Цитата(mes @  15.11.2011,  16:32 Найти цитируемый пост)
Я ж специально выделил.. не буду сразу подсказывать ответ, но Ваш первый вывод неверный... я возмутился над другим аспектом.. 

Вы насчет жертвы? А что Вы в этом нашли такого? Любой подход и любое решение - это плюс в одну сторону и минус в другую. Принятие минусов конкретного решения и есть эта жертва, сделанная ради ее плюсов.

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


Эксперт
****


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

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



Предлагаю такое решение: Вместо идентификатора у объект можно получить "пульт управления":
Код

template <typename T>
srtuct icontrol{
virtual T get() const = 0;
virtual void set(T&) = 0;
};
template <typename T>
srtuct irangecontrol : icontrol {
virtual T min() const = 0;
virtual T max() const = 0;
};
struct icontroller {
icontrol<bool>* getboolcontrol(const string&) = 0;
irangecontrol<int>* getintcontrol(const string&) = 0;
irangecontrol<double>* getintcontrol(const string&) = 0;
};
struct object { virtual icontroller* getcontroller(); }


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


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


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

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



Цитата(azesmcar @  15.11.2011,  15:35 Найти цитируемый пост)
Вы насчет жертвы? А что Вы в этом нашли такого? Любой подход и любое решение - это плюс в одну сторону и минус в другую. Принятие минусов конкретного решения и есть эта жертва, сделанная ради ее плюсов.



Цитата(mes @  15.11.2011,  15:02 Найти цитируемый пост)
Цитата

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

при таком подходе я Вам не советчик..  

Я бы предпочел вариант,  "что я от этого выигрываю"... не говоря о слишком жестком акценте над словом "одно"...  smile 
Цитата(azesmcar @  15.11.2011,  15:22 Найти цитируемый пост)
Нет, я знаю что он должен делать, а чего не должен

поэтому закуем в наручники smile

Сорри за придирки, просто иначе не знаю варианта, как "заставить" Вас взглянуть под другим углом  smile 



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


uploading...
****


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

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



Цитата(mes @  15.11.2011,  16:50 Найти цитируемый пост)
одно

Одно - подразумевалось одно из решений.

Цитата(mes @  15.11.2011,  16:50 Найти цитируемый пост)
поэтому закуем в наручники smile

С той же логикой можно отменить спецификаторы доступа. Долой private, делаем все методы и поля публичными smile 

Цитата(mes @  15.11.2011,  16:50 Найти цитируемый пост)
Сорри за придирки, просто иначе не знаю варианта, как "заставить" Вас взглянуть под другим углом  smile 

Я пытаюсь, но из плюсов я на данный момент вижу только ослабленную монолитность, зато работы это прибавляет значительно.
Я не придираюсь, просто хочу понять.
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.0814 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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