Главная Юзердоски Каталог Трекер NSFW Настройки

Программирование

Ответить в тред Ответить в тред
Check this out!
<<
Назад | Вниз | Каталог | Обновить | Автообновление | 10 3 2
вот скажите мне как решить проблему. будем говрить в терминах С++, потому что я так приказал. все вы Аноним 22/01/26 Чтв 13:09:53 3629678 1
image.png 32Кб, 500x563
500x563
вот скажите мне как решить проблему. будем говрить в терминах С++, потому что я так приказал.
все вы прекрасно знаете совершенно замечательное изобретение Шона Парента, как паттерн external polymorphism.
вкратце для тех, кто не опп:
хотите вы вывадать объектам некоторую способность, назовет ее action(); вместо того, чтобы наследовать ваши объекты от class IActionable { virtual void action() = 0; } вы, делаете следующую конструкцию (синтаксис упрощен для краткости, концепты не юзаю тоже по этой причине):
class Actionable final
{
struct IActionable { virtual void action_() = 0; }
template <typename T> struct ActionableObject : public IActionable
{
T data_;
ActionableObject(T x) : data_(x) {}
void action() override { return ::action(x); }
};
};

то есть мы просто вызываем глобальную (оберните в какой хотите неймспейс а-ла ActionOverloadset) функцию для нужного типа. это позволяет совмещать SRP и OCP, ведь теперь мы не будем вынуждены добавлять методы action в класс, меняя их код и они не завязаны на action.

так вот вся эта подводка сводится к вопросу: а как провернуть что-то похожее для динамически полиморфных иерархий классов? ну например условное AST мы не построим без динамического полиморфизма.
немного конкретики для примера (пример тупенький, но суть передает):
есть несколько классов нод наследуемых от basic_node. они содержатся в классе AST. пусть я хочу сделать простенький интерпретатор, который обходит дерево рекурсивно и исполняем программу. пусть у меня есть поле Nametable nt_;
при добавлении новой ноды я максимально не хочу лезть в интепретатор и что-то там добавлять. поэтому хочется провернуть что-то похожее на трюк из external polymorphism. однако если я буду определять функции для действий с конкретно нодой, мне придется передать nt_ им как аргумент, что уже кринж. к тому же мне нужна функция, которая была делала
if (auto node = static_cast<const node_type*>(current_node)) visit(node);

то есть при добавлении новой ноды мне все равно надо переписывать код, что уже конечно плохо.


ИТОГО:
как соблюдть SRC и OCP для динамически полиморфных иерархий?
Аноним # OP 22/01/26 Чтв 13:17:19 3629691 2
Аноним 22/01/26 Чтв 15:24:17 3629781 3
Бамп
Аноним 22/01/26 Чтв 15:24:44 3629782 4
Бамп
Аноним 22/01/26 Чтв 15:25:14 3629784 5
Бамп
Аноним # OP 23/01/26 Птн 04:16:45 3630153 6
горшок.png 569Кб, 1140x1159
1140x1159
Да я уверен что вы знаете, чего не отвечаете
Аноним 23/01/26 Птн 08:00:37 3630190 7
лучшийтредза10л[...].png 4Кб, 222x70
222x70
ну пазязя бамп бамп бамп
Аноним 23/01/26 Птн 09:53:28 3630218 8
Аноним # OP 23/01/26 Птн 10:16:48 3630235 9
>>3630218
С Новым Годом! долбоеб.
Аноним 23/01/26 Птн 11:59:33 3630350 10
>>3630235
Андрей, залогинься.
Настройки X
Ответить в тред X
15000
Добавить файл/ctrl-v
Стикеры X
Избранное / Топ тредов