Страница 1 из 1

Для чего экстендеры разделили на два типа?

Добавлено: 02.06.2021, 10:04
korshunov
В документации по модулям есть такое:

Экстендеры могут работать как в режиме ChainExtender (цепочный вызов)так и QueueExtender (поочерёдный вызов).
Экстендеры, которые работают в режиме Chain, передают друг другу модифицированный результат.
Они ОБЯЗАТЕЛЬНО должны возвращать результат, который передал вышестоящий хелпер или экстендер.
Экстендеры работающие в режиме Queue, ничего не возвращают. Они просто вызываются по очереди.
В них можно описывать какие-то процедуры, которые не модифицируют данные возвращаемые хелпером.

В связи с этим вопрос: для чего экстендеры разделили на два типа?
Если разница только в модифицикации/немодифицикации данных, то куда как логичнее обязать экстендер ВСЕГДА возвращать результат - если не модифицировали, то в чистом виде исходные данные. Код стал бы поменьше...

Добавлено: 04.06.2021, 09:39
zyxer
Ну тут чисто философский вопрос. Я наоборот, за то, чтобы дать возможность, а вы решайте что именно и как использовать

Добавлено: 04.06.2021, 09:56
korshunov
У этого вопроса есть и практическая сторона с вполне конкретной ошибкой проектирования.
В текущей реализации сделано так - сначала выполняются все экстендеры Chain, а затем - все экстендеры Queue. И если разработчики будет аккуратно подразделять экстендеры в зависимости от того, надо или нет модифицировать результат, то общий порядок нарушится.
Простейший пример. В модуле MChain применен экстендер Chain, в модуле МQueue - экстендеры Queue. И тогда установкой порядка модулей НИКАК не добиться, чтобы экстендер из МQueue выполнялся ранее экстендера MChain. Это потенциальный источник проблем...

Добавлено: 04.06.2021, 10:03
zyxer
Да, об этом думали. Хоть и вероятность что это создаст проблемы не велика, но в принципе, возможно вы и правы. Еще внутри команды поднимем этот вопрос, может действительно сделаем Queue deprecated и тогда буде вообще один экстендер, а Chain будет его алиасом (для совместимости).