Работая в одном из проектов на react+redux вышло так, что я написал свой grid-компонент (с фильтрацией, настройками, подсветкой искомого, специфическим выводом значений).
По ходу дела встал вопрос о том как внутри устроен redux, в частности его методы combineReducers, createStore (возможность подмешивать middleware), store.dispatch.
По отношению к store.dispatch интересовало:
- можно ли сделать dispatch нескольких action за один раз, т.е. не оповещая слушателей store об промежуточных изменения состояния?
- можно ли получать уведомления (подписаться) на момент когда redux завершит оповещение всех слушателей?
- что будет если listener подписанный на изменение store в себе вызовет store.dispatch и можно ли его отложить на момент завершения оповещения всех слушателей да ещё и собрать все вызовы store.dispatch из слушателей в одно общее обновление?
По итогу изучения исходного кода redux-а получилось:
- набор специфических методов combineReducers — идея была в том, что-бы весь совокупный reducer описывать в одном месте явно отображая из каких простых reducer-ов он состоит и как (какими методами) они собираются вместе.
- от реализации интересующего по поводу store.dispatch я отказался т.к. это потребовало бы переписывания redux, дополнительного изучения как бы себя повёл redux-dev-utils в отношении "склеенного" dispatch нескольких action-ов, и главное — усложнение инструмента, которое, возможно, выходит за пределы его изначальной концепции (A Predictable State Container for JS Apps).
Из разсмотрения истории выше передо мной встал вопрос вынесенный в заглавие — переиспользование идеи vs переиспользование кода: что когда и зачем?
Самописный grid-компонент — пример переиспользования идеи "наряженной" в специфические "одежды обстоятельств".
Использование redux и redux-dev-tools — пример переиспользования кода и инструментов.
Набор специфических методов по мотивам combineReducers даёт вариант смешения подходов — переиспользована идея "некоторым образом порождать reducer из составных более простых частей" и переиспользован код combineReducers лежащий в основе специфических методов комбинирования.
Вопрос, в более развёрнутом виде, это постановка задачи о:
- выявлении набора факторов влияющих на выбор одного из вариантов переиспользования.
- выявления критериев выбора (на основе оценки факторов из набора).
- прогнозе последствий выбора одного из вариантов либо их сочетания (отчасти, как одного из факторов влияющих на выбор и, отчасти, как разсмотрение возможностей).
В таком виде вопрос частично философский, т.к. подразумевает что у него есть 2 части ответа:
- собственно философская — не зависимая от конкретных областей применения (таких как вид приложения, язык, библиотеки) и общая для них всех.
- и прикладная — на моём примере это Single-page application, js, react, redux в конкретике требований проекта