Войти
ПрограммированиеФорумОбщее

Красивый код на C++

#0
3:34, 11 апр. 2016

Здравствуйте. Хотелось бы посоветоваться по поводу написания иерархии классов. Суть такова: есть класс(Пусть А), и от него наследуются еще классы B C D (на самом деле их может быть больше офк). Продолжу рассматривать на примере GUI. У основного класса А есть методы на добавление детей к объекту. (пример: есть форма, мы вешаем на нее контролы). Сам А абстрактный, а скажем В - фигуры, C - эвенты, D - звук. Откинем пока что возможность добавления на звук фигуру. Суть в чем. Скажем создал я объект B(фигура), и добавил в чилды к ней еще n-фигур m-евентов, d-звуков. Теперь. у фигуры есть метод "Изменить прозрачность", причем я меняю прозрачность и у чилдов фигур. Так вот. У меня класс А возвращает ссылку на массив с указателями типа А. И теперь чтобы выбрать из массива только те элементы мне нужно использовать dynamic_cast иначе никак. А приведение типов не рекомендуется. Как можно красивее реализовать это все?


#1
4:59, 11 апр. 2016

Ты реализовал класс A как универсальный контейнер, и потом недоволен что он хранит универсальные элементы.
Раздели универсальный контейнер на несколько по одному на тип и размести их у нужных классов на нужном уровне иерархии
Или перейди к множественому наследованию, каждый контейнер определи в отдельный базовый класс - Контейнер Фигур, Генератор Событий, Источник звука и т.д., и наследуй дочейрние классы от них
Да, кода будет чуть больше, зато статическая типизация и меньше вероятность добавить фигуру на звук

#2
7:03, 11 апр. 2016

Frongal
> Как можно красивее реализовать это все?
Надо разделить в голове понятия иерархия классов и хранение/обращение к объектам классов.
Иерархия должна обладать необходимой функциональностью на каждом уровне. А хранение/обращение достаточной для прикладной задачи типизацией.
Если у объекта есть чилды и паренты это хорошо, но это не значит что это есть объект формы. Если появился колламбур, похоже не хватает какой то сущности. Например FormControl который уже понимает как работать с добавлением удалением звуков, эвентов и прочего к нему, а также понимает что значит изменить прозрачность для себя.

#3
8:07, 11 апр. 2016

Frongal
проектирование нормального гуи — одна из не самых простых задач с точки зрения архитектуры. так как пока ты делаешь неправильно практически всё, имеет смысл сперва посмотреть, как делают те, кто уже на этом собаку съел — система контролов в Qt, VCL(или как там называется та, что в Delphi), в CEGUI.

#4
9:19, 11 апр. 2016

Frongal
> класс А возвращает ссылку на массив с указателями типа А. И теперь чтобы
> выбрать из массива только те элементы мне нужно использовать dynamic_cast иначе
> никак. А приведение типов не рекомендуется. Как можно красивее реализовать это
> все?
паттерн visitor поможет в такой ситуации, а уж красиво получится или нет - зависит от радиуса кривизны рук.

#5
9:20, 11 апр. 2016

Красивее этого ничего нет :)

void main (void)
{
 Код мечта :)  ;
 }
Данный код так прост и понятен, и в нем нет ничего лишнего :)

#6
12:24, 11 апр. 2016

Frongal
очевидно надо чтоб изначально А содержал метод SetAlpha() = 0;
точнее сделать интерфейс типа ColorChangeable. в нем метод SetAlpha = 0;
класс А пусть наследует этот интерфейс и реализует его пустым.
если не хочешь, чтоб базовый интерфейс распухал, можешь делать аля КОМ: queryInterface - запрос возможностей объекта в виде интерфейса. это прикольно, но немного геморно.
тогда в цикле по чилдам, ты либо говоришь "смени прозрачность" а объект сам решает что ему делать. на своем уровне ты не паришься об этом
либо ты говоришь "можешь ли ты сменить прозрачность? если да, то меняй"

#7
12:33, 11 апр. 2016

Frongal
> И теперь чтобы выбрать из массива только те элементы мне нужно использовать
> dynamic_cast иначе никак.
Да, всё так.

ПрограммированиеФорумОбщее

Тема в архиве.