Форум программистов, компьютерный форум CyberForum.ru

Частое использование dynamic_cast в конкретных целях. Правильно ли? - C++

Восстановить пароль Регистрация
 
 
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 22:44     Частое использование dynamic_cast в конкретных целях. Правильно ли? #1
Привет, форум.
Гуманно ли использовать dynamic_cast вот в таких случаях?
Пример из подобных

- Есть библиотечный абстрактный класс Drawable.
Я наследую его, чтобы создавать разные геометрические объекты.
- Есть класс Polygon - используется как сцена. У него есть поле list<Drawable*> m_drawables и метод Add(Drawable* drawable).
Суть метода Add в том, что он рассчитывает наилучшую позицию для расположения фигуры и кидает его в полигон, т.е, записывает в m_drawables.

Не по теме:

Метод Update циклом прокручивает эти объекты, шагом вызывая метод api.Draw(*it)



Так вот, так как для разных фигур нужны разные расчёты, а я узнаю тип фигуры приведением типа(заодно и получаю доступы к методам конкретной фигуры) используя dynamic_cast.
Пример:
C++
1
2
3
4
5
6
7
8
9
void Add(Drawable* drawable)
{
...
    if (Parallelogram* pg = dynamic_cast<Parallelogram*>(drawable))
    {
        ...
    }
...
}
Это нормально или есть более лучший архитектурный подход?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2014, 22:44     Частое использование dynamic_cast в конкретных целях. Правильно ли?
Посмотрите здесь:

dynamic_cast C++
C++ MS VC++ 6.0:Как "подавить" выдачу конкретных варнингов в конкретных местах?
dynamic_cast C++
Наследование, dynamic_cast и использование последнего в связке с первым C++
dynamic_cast() шаблон C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
08.01.2014, 22:48     Частое использование dynamic_cast в конкретных целях. Правильно ли? #2
Цитата Сообщение от anonym17 Посмотреть сообщение
Это нормально или есть более лучший архитектурный подход?
А почему нет? Если результат вас удовлетворят - используйте.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 22:51  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #3
Цитата Сообщение от xtorne21st Посмотреть сообщение
А почему нет? Если результат вас удовлетворят - используйте.
Просто часто ругаются на RTTI, вот почему спрашиваю.
Убежденный
Системный программист
 Аватар для Убежденный
14188 / 6203 / 984
Регистрация: 02.05.2013
Сообщений: 10,331
Завершенные тесты: 1
08.01.2014, 22:58     Частое использование dynamic_cast в конкретных целях. Правильно ли? #4
Цитата Сообщение от anonym17 Посмотреть сообщение
для разных фигур нужны разные расчёты
А нельзя ли, чтобы фигуры сами бы рассчитывали свои наилучшие позиции ?
RTTI не зря ругают, он не бесплатен. Я слышал, что в некоторых реализациях
RTTI реализован через сравнение строк...
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:06     Частое использование dynamic_cast в конкретных целях. Правильно ли? #5
такое решение плохо не столько производительностью, сколько плохой расширяемостью.
при появлении новой фигуры вы полезете изменять уже существующий код, что расходится с
Open/Close принципом или как там его.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 23:06  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #6
Цитата Сообщение от Убежденный Посмотреть сообщение
А нельзя ли, чтобы фигуры сами бы рассчитывали свои наилучшие позиции ?
Но для этого нужно состояние полигона.
Вы предлагаете Parallelogram::Add(list<Drawable*>& drawables) или что?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:14     Частое использование dynamic_cast в конкретных целях. Правильно ли? #7
если хочется поархитектурить - посмотрите в сторону паттерна Visitor.
вроде бы как раз ваш случай. будет без dynamic_cast но с расширением
тоже будет определенный геморрой.
dynamic_cast - вполне себе рабочий вариант. должен работать.
Убежденный
Системный программист
 Аватар для Убежденный
14188 / 6203 / 984
Регистрация: 02.05.2013
Сообщений: 10,331
Завершенные тесты: 1
08.01.2014, 23:16     Частое использование dynamic_cast в конкретных целях. Правильно ли? #8
C++
1
2
3
4
void Polygon::Add(Drawable *pDrawable)
{
    pDrawable->CalculateBestPosition(this);
}
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:21     Частое использование dynamic_cast в конкретных целях. Правильно ли? #9
C++
1
2
3
4
void Polygon::Add(Drawable *pDrawable)
{
    pDrawable->CalculateBestPosition(this);
}
такой вариант - не айс.
Drawable связывается с неким Poligon который возможно так же наследник от Drawable.
тут взяли и засрали интерфейс. В результате все Drawable, которые могут быть и не фигурой
а скажем картинкой или еще хз чем, зависят от полигона в который они концептуально
не могут добавляться.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 23:23  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #10
Цитата Сообщение от Убежденный Посмотреть сообщение
C++
1
2
3
4
void Polygon::Add(Drawable *pDrawable)
{
    pDrawable->CalculateBestPosition(this);
}
Drawable - библиотечный класс, я его менять не могу. Можно конечно сделать промежуточный класс, но тогда появляются другие проблемы с использованием его в Api данной библиотеки, снова тот же dynamic_cast.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:27     Частое использование dynamic_cast в конкретных целях. Правильно ли? #11
раз это библиотечный интерфейс - тогда приделать посетителя без прокси классов наверно не выйдет.
ну или я не знаю как. без динамического приведения тоже хз как сделать.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
08.01.2014, 23:38  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #12
Всё таки надо архитектуру пересмотреть или же забить и использовать dynamic_cast?
Убежденный
Системный программист
 Аватар для Убежденный
14188 / 6203 / 984
Регистрация: 02.05.2013
Сообщений: 10,331
Завершенные тесты: 1
08.01.2014, 23:40     Частое использование dynamic_cast в конкретных целях. Правильно ли? #13
Цитата Сообщение от DU Посмотреть сообщение
такой вариант - не айс.
Drawable связывается с неким Poligon который возможно так же наследник от Drawable.
тут взяли и засрали интерфейс. В результате все Drawable, которые могут быть и не фигурой
а скажем картинкой или еще хз чем, зависят от полигона в который они концептуально
не могут добавляться.
Согласен. Просто как вариант на замену dynamic_cast.
Я просто содрогаюсь, представляя десятки этих кастов, и так для
каждого элемента в массиве... Бр-р!..
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
08.01.2014, 23:48     Частое использование dynamic_cast в конкретных целях. Правильно ли? #14
да при касте врятли что-то динамически выделяется. в сравнении с динамическим добавлением и рассчетами для оптимальной вставки - это копейки. у нас ведь тут добавление чего-то. и одна маленькая отрисовочка возможно затмит собой тысячи этих кастов.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
09.01.2014, 00:06  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #15
Цитата Сообщение от DU Посмотреть сообщение
да при касте врятли что-то динамически выделяется. в сравнении с динамическим добавлением и рассчетами для оптимальной вставки - это копейки. у нас ведь тут добавление чего-то. и одна маленькая отрисовочка возможно затмит собой тысячи этих кастов.
А если использовать паттерн Visitor?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2014, 00:12     Частое использование dynamic_cast в конкретных целях. Правильно ли? #16
А если использовать паттерн Visitor?

раз это библиотечный интерфейс - тогда приделать посетителя без прокси классов наверно не выйдет.
ну или я не знаю как. без динамического приведения тоже хз как сделать.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
09.01.2014, 00:29  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #17
Ну если введу промежуточный класс Depictable и буду все фигуры от него наследовать? Правда это сулит мне проблемы с самим Api библиотеки.
C++
1
2
3
4
class Depictable : public SomeLib::Drawable 
{
    ...
};
Какой вариант будет лучшим? Полиморфизм (виртуализация метода Add(Polygon* poligon)) или Visitor?
Или это вообще изначально плохой подход?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
09.01.2014, 00:38     Частое использование dynamic_cast в конкретных целях. Правильно ли? #18
а вы и так и эдак попробуйте. будет вам опыт на будущее.
интерфейс добавления объектов в полигон остается одинаковым при обоих подходах.
так что то, как там все разруливается - деталь реализации.
с визитором однозначно более многословно все будет.
anonym17
2 / 0 / 1
Регистрация: 31.10.2013
Сообщений: 21
09.01.2014, 06:08  [ТС]     Частое использование dynamic_cast в конкретных целях. Правильно ли? #19
Цитата Сообщение от DU Посмотреть сообщение
а вы и так и эдак попробуйте. будет вам опыт на будущее.
интерфейс добавления объектов в полигон остается одинаковым при обоих подходах.
так что то, как там все разруливается - деталь реализации.
с визитором однозначно более многословно все будет.
Примерно вот так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class Visitor;
 
class Depictable : public Lib::Drawable
{
public:
    ...
    void SetPosition(vector2f const& coord);
    virtual void accept(class Visitor*) = 0;
    ...
}
 
class Parallelogram : public Depictable
{
public:
    ...
    void accept(Visitor*);
    ...
}
 
void Parallelogram::accept(Visitor *v)
{
    v->visit(this);
}
 
class Visitor
{
    ...
  public:
    virtual void visit(Parallelogram*) = 0;
    ...
};
 
class CalcPositionVisitor : public Visitor
{
    ...
public:
    CalcPositionVisitor(Polygon* polygon) : m_polygon(polygon) {}
    virtual void visit(Parallelogram*);
private:
    Polygon* m_polygon;
    ...
};
 
class Polygon
{
    ...
public:
    void Add(Depictable* depictable);
private:
    std::list<Depicatble*> m_depicatbles;
    ...
};
 
void Polygon::Add(Depictable* depictable)
{
    CalcPositionVisitor calcPosition(this);
    depictable->accept(&calcPosition);
    depictable->SetPosition(calcPosition.getPosition());
    
    m_depicatbles.push_back(m_depictable);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.01.2014, 15:17     Частое использование dynamic_cast в конкретных целях. Правильно ли?
Еще ссылки по теме:

dynamic_cast C++
C++ Объясните dynamic_cast
C++ dynamic_cast

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.01.2014, 15:17     Частое использование dynamic_cast в конкретных целях. Правильно ли? #20
Этот паттерн вообще не рекомендуют использовать... Его очень сложно сопровождать... Я не пойму чем вам dynamic_cast не нравится? Это простое и правильное решение, ИМХО
Yandex
Объявления
09.01.2014, 15:17     Частое использование dynamic_cast в конкретных целях. Правильно ли?
Ответ Создать тему
Опции темы

Текущее время: 15:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru