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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> подскажите что плохого в этом проектировании 
:(
    Опции темы
archimed7592
Дата 7.11.2007, 00:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Цитата(Alek86 @  7.11.2007,  00:01 Найти цитируемый пост)
хотелось просто узнать, является ли динамик каст чем-то таким, чем не рекомендуется пользовать из-за падения производительности.

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
Alek86
Дата 7.11.2007, 00:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



Цитата(archimed7592 @  7.11.2007,  00:07 Найти цитируемый пост)
Преждевременная оптимизация - корень всех зол


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


--------------------
user posted image    user posted image
PM MAIL   Вверх
archimed7592
Дата 7.11.2007, 00:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


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

Репутация: 58
Всего: 93



Цитата(Alek86 @  7.11.2007,  00:15 Найти цитируемый пост)
а в моем случае это выбор алгоритма из подобных.

Алгоритмы то с одинаковой сложность, так что выбирать можно любой smile.


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
SaDFromSpb
Дата 7.11.2007, 04:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Alek86, 
Я привык считать, что появление необходимости в dynamic_cast свидетельствует о плохом проектировании. (Хотя, разумеется, есть исключения)
Плюс, нередко, быть "насмерть" уверенным в каких-то частях проектирования, значит связывать себе руки. Когда я говорю "тут все круто, просто долго объяснять", это значит, что я просто запарился над этим думать.... А оптимальное решение в итоге показывает, как все было не круто.  smile 
По поводу данной задачи я подробно не вникал, ибо поздно. Но навскид приходит идея, что раз Event и Garbage получаются такими разными сущностями, то почему бы их не хранить раздельно в двух векторах? Или если, нужно сохранить их последовательность относительно друг друга, то в двух мэпах, типа std::map<int, Event> и std::map<int, Garbage>, где int - это абсолютный порядковый номер...


Это сообщение отредактировал(а) SaDFromSpb - 7.11.2007, 04:28


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
Alek86
Дата 7.11.2007, 08:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

Репутация: 21
Всего: 25



Цитата(SaDFromSpb @  7.11.2007,  04:26 Найти цитируемый пост)
Плюс, нередко, быть "насмерть" уверенным в каких-то частях проектирования, значит связывать себе руки. Когда я говорю "тут все круто, просто долго объяснять", это значит, что я просто запарился над этим думать.... А оптимальное решение в итоге показывает, как все было не круто.

согласен. и более того, я ЗНАЮ, что у меня все не круто, хотя бы потому что опыта в проектировании ООП'ных приложений почти нету. Но писать огромные описания проблемы, чтоб за меня тут проектировали все полностью, не считаю нужным smile я попробовал описать кусок проблемы...


Цитата(SaDFromSpb @  7.11.2007,  04:26 Найти цитируемый пост)
раздельно в двух векторах

они не разные сущности, так что надо вкупе


Цитата(SaDFromSpb @  7.11.2007,  04:26 Найти цитируемый пост)
в двух мэпах, типа std::map<int, Event> и std::map<int, Garbage>, где int - это абсолютный порядковый номер

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

Добавлено через 3 минуты и 5 секунд
кстати, еще вопрос

Цитата(SaDFromSpb @  7.11.2007,  04:26 Найти цитируемый пост)
Я привык считать, что появление необходимости в dynamic_cast свидетельствует о плохом проектировании. (Хотя, разумеется, есть исключения)

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

Это сообщение отредактировал(а) Alek86 - 7.11.2007, 08:07


--------------------
user posted image    user posted image
PM MAIL   Вверх
Lazin
Дата 7.11.2007, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Если Garbage это частный случай Event, то ИМХО намного логичней, что-бы они имели одинаковый интерфейс (это-же всего-лишь строки телепрограммы). Но нужно заюзать полиморфизм, чтобы к примеру при выводе сообщения Garbage оно как-то выделялось, и бросало исключение, а в классе исключения может быть описана ошибка. 
То-есть я предлагаю использовать общий интерфейс для Garbage и Event, а всю дополнительную функциональность класса Garbage, вынести в класс исключения. Приемущество проявится если доля объектов класса Garbage в контейнере не велика, в этом случае исключения будут генерироваться редко, а проверять dynamic_cast - ом каждый элемент будет не нужно.
PM MAIL Skype GTalk   Вверх
UnrealMan
Дата 7.11.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MAKCim @  6.11.2007,  22:55 Найти цитируемый пост)
а если упростить код?

Те же 0.92. Значимой разнице попросту неоткуда взяться.
PM MAIL   Вверх
MAKCim
Дата 7.11.2007, 11:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(UnrealMan @  7.11.2007,  11:35 Найти цитируемый пост)
Те же 0.92. Значимой разнице попросту неоткуда взяться. 

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


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



Цитата(Alek86 @  7.11.2007,  08:06 Найти цитируемый пост)
мое IMHO это изврат, намного похуже динамик каста. динамик каст хранит id класса и по нему можно, фактически, и отделять, а ты предлагаешь усложнить работу (и написание) класса Channel (контейнер) в несколько раз...

Хм.. Тоже верная мысль, наверное.. Тебе виднее...

Цитата(Alek86 @  7.11.2007,  08:06 Найти цитируемый пост)
я, кстати, тоже до недавнего времени так считал. и даже не помню, почему :(
ты почему так считаешь?

Ну во-первых, потому что это когда-то говорил мудрый препод  smile , во-вторых, использование dynamic_cast'а свидетельствует о том, что мы пользуемся какой-то дополнительной функциональностью (RTTI, которую кстати, опциями компилятора можно отключить), чтобы получить истинный (ну или просто более "нижний") интерфейс объекта. Оправданно ли это? Динамик кастом можно пользоваться двумя способами: 1) Приведение, когда ты точно знаешь, какой это класс на самом деле. Но если ты это знаешь, то наверное можно провести такую реорганизацию, чтобы динамик каст не понадобился. 2) Попытка приведения по очереди к нескольким подкласам с отлавливанием ошибок при неправильном приведении (сам так ни разу не пробовал, но вроде можно). - Для С++ это как-то "грязно" =). Получается в некоторых местах теряется информация о типах, когда она должна быть. Почему должна? Потому что при хорошем проектировании интерфейс всегда достаточен для контекста в котором он используется, и когда получается наоборот - это, возможно, сигнал о том, что проектирование неудачано...
Как-то так.... 

А вообще демагогия это все.  smile 


Lazin, Тоже, кстати, мысль про исключения пришла, но, как-то не стройно получается в плане логичности и понятности. И сможет ли автору помочь механизм исключений во всех случаях, где евентом оказывается гарбидж? Хотя... ему, опять же, виднее будет...



Это сообщение отредактировал(а) SaDFromSpb - 7.11.2007, 13:33


--------------------
"За исключением части, касающейся потоков, библиотека Loki написана на стандартном языке С++. Увы, это означает, что многие современные компиляторы не смогут работать с ней в полном объеме." (А. Александреску. Modern C++ design. 2001)
PM   Вверх
UnrealMan
Дата 7.11.2007, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(MAKCim @  7.11.2007,  11:43 Найти цитируемый пост)
смотрел я ассемблерный листинг...ну никак такого не может быть
typeid медленнее даже визуально по коду 

smile Вот это и говорит о том, что надо не голые теории строить (чего там визуально по коду видится), а брать тесты и проверять, как оно на самом деле будет работать.
PM MAIL   Вверх
MAKCim
Дата 7.11.2007, 19:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(UnrealMan @  7.11.2007,  13:16 Найти цитируемый пост)
Вот это и говорит о том, что надо не голые теории строить (чего там визуально по коду видится), а брать тесты и проверять, как оно на самом деле будет работать. 

компиляторы то у нас скорее всего разные
у меня на GCC typeid работает медленнее
и что дает в таком случае практика?
если не трудно, можешь привести ассемблерный код моего примера (без TypeInfo) на твоем компиляторе



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



Цитата(MAKCim @  7.11.2007,  19:00 Найти цитируемый пост)
компиляторы то у нас скорее всего разные

Компилятор у меня mingw32-g++ 3.4.4, выставлена оптимизация -O3.

Цитата(MAKCim @  7.11.2007,  19:00 Найти цитируемый пост)
у меня на GCC typeid работает медленнее

Насколько?

Цитата(MAKCim @  7.11.2007,  19:00 Найти цитируемый пост)
если не трудно, можешь привести ассемблерный код моего примера (без TypeInfo) на твоем компиляторе

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

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


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(UnrealMan @  7.11.2007,  19:35 Найти цитируемый пост)
Насколько?

Код

#include <typeinfo>

class A {
public:
    virtual int foo() = 0;
};

class B: public A {
    virtual int foo() { return 1; }
};

class C: public A {
    virtual int foo() { return 2; }
};

int main() {
    A * a1 = new B();
    return static_cast<int>(typeid(C) == typeid(*a1));
}

Код

# times ./a
0m0.032s 0m0.012s
0m0.795s 0m0.224s

Код

#include <typeinfo>

class A {
public:
    virtual int foo() = 0;
};

class B: public A {
    virtual int foo() { return 1; }
};

class C: public A {
    virtual int foo() { return 2; }
};

int main() {
    A * a1 = new B();
    return static_cast<int>(a1 -> foo() == 2);
}

Код

# times ./a
0m0.032s 0m0.012s
0m0.601s 0m0.178s



--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


Опытный
**


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

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



Расшифруй. Я не понимаю, чем ты мерил и что за циферки тут привёл.
PM MAIL   Вверх
MAKCim
Дата 7.11.2007, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата(UnrealMan @  7.11.2007,  19:57 Найти цитируемый пост)
Расшифруй. Я не понимаю, чем ты мерил и что за циферки тут привёл. 

Цитата

times  Print  the  accumulated  user  and system times for the shell and for pro‐
              cesses run from the shell.  The return status is 0.

соответственно
Цитата(MAKCim @  7.11.2007,  19:48 Найти цитируемый пост)
# times ./a
0m0.032s 0m0.012s
0m0.601s 0m0.178s

user time = 0m0.601s
system time = 0m0.178s


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

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


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

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