Size: a a a

Software Design/Architecture/Zen

2021 January 29

I

Ioann_V in Software Design/Architecture/Zen
количество очков
источник

I

Ioann_V in Software Design/Architecture/Zen
Алексей Гевондян
хешмап тип - значение
Ну это как бы на корню же убивает полиморфизп и в целом ООП?
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
ооп ради ооп?
источник

I

Ioann_V in Software Design/Architecture/Zen
Алексей Гевондян
хешмап тип - значение
так если честно, я так и делаю в С++
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
полиморфизм про поведение, а не про "кол-во очков"
источник

I

Ioann_V in Software Design/Architecture/Zen
Алексей Гевондян
полиморфизм про поведение, а не про "кол-во очков"
Ну с очками немного глуповато вышло - да, их проще просто хранить в переменной. Это правда.
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
было бы интересно взлянуть на 2 класса наследника. судя по тому, что их прям дофига - разница должна быть невелика... вот в чем она?
источник

I

Ioann_V in Software Design/Architecture/Zen
Алексей Гевондян
было бы интересно взлянуть на 2 класса наследника. судя по тому, что их прям дофига - разница должна быть невелика... вот в чем она?
На самом деле - это надуманный пример. Тут будет два наследника все верно, brick - scor brick. Немного мой косяк, я хотел придумать какую-то штуку для себя и найти ее решение. Но у меня есть реальный пример, в котором я ничего не понимаю. Могу задать вопрос?
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
стоит выделить интерфейс и несколько реализаций. интерфейс в с++ - это класс только с чистыми виртуальными функциями. глубину наследования ограничить 1м уровнем. и многое встанет на свои места
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
Ioann_V
На самом деле - это надуманный пример. Тут будет два наследника все верно, brick - scor brick. Немного мой косяк, я хотел придумать какую-то штуку для себя и найти ее решение. Но у меня есть реальный пример, в котором я ничего не понимаю. Могу задать вопрос?
да задавай конечно)
источник

SM

Sergey Milegov in Software Design/Architecture/Zen
Ioann_V
Ребята, у меня такой вопрос. Допустим, есть класс кирпичика - и иго подтипов много-много. Затем, я бы хотел чтобы при разрушении конкретного кирпичика мне начислялось Х очков, но для каждого типа кирпичика - это значение разное. Кто должен хранить инфрормацию о том, сколько очков начислить - сам кирпич/его подтип?
интерфейс кирпичика, классы типов кирпичиков, очки в классах
источник

N

Nikita in Software Design/Architecture/Zen
Sergey Milegov
интерфейс кирпичика, классы типов кирпичиков, очки в классах
а не лучше один класс кирпичика, и сделать его data driven, чтобы грузил количество очков за себя из файла, основываясь на типе кирпичика, который он получает в конструкторе?
источник

I

Ioann_V in Software Design/Architecture/Zen
Алексей Гевондян
да задавай конечно)
Смотри:

Поймешь код?

#include <cstdint>
#include <memory>

class render_data_base_t
{

};

class render_data_rectangle_t : public render_data_base_t
{
public:
   void set_w( uint32_t w )
   {

   }

   void set_w( uint32_t w )
   {

   }
};

class render_data_circle_t    : public render_data_base_t
{
public:
   void set_r( uint32_t )
   {

   }
};

class interface_get_render_data_t
{
public:
   virtual render_data_base_t* get_render_data()                       = 0;
};

class interface_set_render_data_t
{
public:
   virtual void                set_render_data( render_data_base_t* )  = 0;
};

class render_object_base_t : public interface_get_render_data_t,
                            public interface_set_render_data_t
{
   std::unique_ptr<render_data_base_t>    m_render_data;
public:
   virtual render_data_base_t* get_render_data()                       override
   {

   }

   virtual void                set_render_data( render_data_base_t* )  override
   {

   }
};


А теперь вопрос такой, хочу я где-то, получать мои рендер данные и гарантированно известно, что там это всегда render_data_circle_t - дочерний класс, и вот хочется мне у него менять радиус, а я получаюбазовый класс. Кажется, что самое место двойной диспетчеризации и Visitor паттерну, у которого, правда что, для прямоугольника - будет пустой метод, а вот для круга - нужное поведение. И вот это -смущает. Вдумавшись, я вижу тут ошибку проектирования иерархии, и вот, уже кажется что нужен не только render_object_base_t, который полиморфно принимает что угодно, но и render_circle_object_base_t. Вот как сделать? Мне важно как правильно, а не как гибко или быстро и т.п
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
зачем базовый класс, если он пустой? где-то косяк в проектировании...
источник

I

Ioann_V in Software Design/Architecture/Zen
Алексей Гевондян
зачем базовый класс, если он пустой? где-то косяк в проектировании...
Ты про какой пустой класс именно?
источник

I

Ioann_V in Software Design/Architecture/Zen
Здесь чисто набросок
источник

I

Ioann_V in Software Design/Architecture/Zen
Он как минимум виртуальный деструктор содержать будет
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
возможно у тебя нужен дженерик
источник

АГ

Алексей Гевондян... in Software Design/Architecture/Zen
опиши задачу словесно лучше.
источник

I

Ioann_V in Software Design/Architecture/Zen
Алексей Гевондян
опиши задачу словесно лучше.
Есть у меня класс объекта прямоугольнка который рисуется, и класс круга, который рисуется - все они берут скажем интерфейс draw. Но, у каждого из них есть свои специфичные методы - у прямоугольника, это установка ширины и высоты, а у круга - радиус. Есть у меня объект, скажем мячик - гарантированно известно, что он всегда рисуется кругом. То, есть понятно, что внутри него будет лежать объект рисуемого круга. Но вот я хотел у себя в коде, сделать некоторый базовый класс, который бы уже внутри себя хранил какие-то рисуемые данные, а такие объекты как круг и кирпич от него наследовались бы.
источник