У меня есть класс рисования Button
. Должны ли его текстуры храниться и скрываться внутри:
class Button {
private:
Texture idle, hovered, clicked;
public:
void draw_self(Window&, Position) const;
};
void App::draw() {
button.draw_self(window, position);
}
... или более разумно вспомнить какой-нибудь прокси и предоставить бездушный добытчик для использования в "умных" абстракциях?
class Button {
private:
std::string idle_tag, hovered_tag, clicked_tag;
public:
std::string const& get_texture_tag() const; // returns one of its tags
};
class Drawer {
private:
std::map<std::string, Texture> textures;
public:
void draw(std::string const&, Position) const;
};
void App::draw() {
drawer.draw(button.get_texture_tag(), position);
}
Первый подход, по-видимому, представляет Button
как полностью составленный объект, но осведомленный о подмодуле рисования. Второй дизайн избавляет от такой связи и (вероятно) легче распараллелить; однако его Button
выглядит как глупый DTO и предоставляет гораздо менее удобный интерфейс (хотя в приведенных примерах разница не заметна, реальный - болезненный).
Какое решение обычно предпочитается и почему ? Есть ли какие-либо возможные проблемы (или другие решения), которые я не заметил?