Size: a a a

Software Design/Architecture/Zen

2021 January 16

I

Ivan in Software Design/Architecture/Zen
Или geLtocalTime
источник

I

Ioann_V in Software Design/Architecture/Zen
Привет, у меня такой вопрос:

Есть такой вот код:

class base_collider_entity_t : public virtual base_position_entity_t,
                              public         collider_i
{
public:
   const collider_data_t *get_collider_data()                      const override
   {
       return
           m_collider_data.get();
   }

         void             set_collider_data( collider_ptr&& ptr )        override
   {
       m_collider_data = std::move( ptr );
   }

private:
   std::unique_ptr<collider_data_t>        m_collider_data;
};

class ball_t : public base_collider_entity_t
{

};

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

Но ball_t должен работать только с коллайдерами круглой формы. Как правильно спроектировать такое отношение? Код выше - по факту, позволяет добавить в ball_t и прямоугольный коллайдер.. Даже если так можно и нужно делать из принципов SOLID, вопрос в том, а как потом менять, скажем радиус, если по факту у нас внутри прямоугольник?
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
Ioann_V
Привет, у меня такой вопрос:

Есть такой вот код:

class base_collider_entity_t : public virtual base_position_entity_t,
                              public         collider_i
{
public:
   const collider_data_t *get_collider_data()                      const override
   {
       return
           m_collider_data.get();
   }

         void             set_collider_data( collider_ptr&& ptr )        override
   {
       m_collider_data = std::move( ptr );
   }

private:
   std::unique_ptr<collider_data_t>        m_collider_data;
};

class ball_t : public base_collider_entity_t
{

};

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

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

D

DOCDOCTOR in Software Design/Architecture/Zen
Либо сделать признак у фигуры какой он Формы, тоже наверное норм
источник

k

k_voistinov in Software Design/Architecture/Zen
DOCDOCTOR
Сделать отдельный абстрактный класс фигура, вынести туда общее, и отнаследоваться от него конкретными фигурами, и там сделать специфическую логику, я вижу такое решение
здесь вещи посерьезнее, а не из азов наследования
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
k_voistinov
здесь вещи посерьезнее, а не из азов наследования
Чем что тут сложнее и как решить
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
Звучит не сложно, может чего то не вижк
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
Просто, разве может родитель работать и с квадратными и с круглыми фигурами, а ребенок только с круглыми? Это вроде как противоречит принципу подстановки барбары лисков
источник

I

Ioann_V in Software Design/Architecture/Zen
DOCDOCTOR
Просто, разве может родитель работать и с квадратными и с круглыми фигурами, а ребенок только с круглыми? Это вроде как противоречит принципу подстановки барбары лисков
Все так. Но и твои решения не решают проблемы. Они ее лишь усугубляют, как мне кажется.
источник

I

Ioann_V in Software Design/Architecture/Zen
Надо наверное, тогда, сделать родителя который бы работал только с круглыми формами?
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
Ioann_V
Надо наверное, тогда, сделать родителя который бы работал только с круглыми формами?
Я если честно проблемы в целом не понимаю, но то что хочешь сделать ты, я описал выше, на мой взгляд противоречит принципу барбары лисков
источник

I

Ioann_V in Software Design/Architecture/Zen
Ну ты верно пишешь проблему, но ты не пишешь решение.
источник

I

Ioann_V in Software Design/Architecture/Zen
Я же ничего против не имею, просто поясняю, что в твоем ответе все верно, но отсутствует решение.
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
Я думаю, что можно расширить наследника, и туда добавить метод который работает только с круглыми фигурами, я бы сделал так, чем это решение плохое?
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
Там где нужен этот метод, туда его и добавить
источник

I

Ioann_V in Software Design/Architecture/Zen
DOCDOCTOR
Там где нужен этот метод, туда его и добавить
Предлагаешь сделать так?

class base_circle_collider_entity_t : public virtual base_position_entity_t,
                                     public         circle_collider_i
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
Это типо отдельный класс который работает только с круглыми?
источник

I

Ioann_V in Software Design/Architecture/Zen
Ага.
источник

D

DOCDOCTOR in Software Design/Architecture/Zen
У тебя вот в том классе, который должен работать с круглыми фигурами, должна быть еще какая то логика?
источник

I

Ioann_V in Software Design/Architecture/Zen
Ioann_V
Предлагаешь сделать так?

class base_circle_collider_entity_t : public virtual base_position_entity_t,
                                     public         circle_collider_i
Да, может быть вполне - вот в этом сообщении, как видишь, мы наследуемся еще и от position, а дальше я хотел бы еще сюда рендер прикрутить, но это скорее всего будет решать множественным наследованием base_circle_collider_entity_t и render_entity
источник