Я попадаю в ситуацию, когда у меня есть несколько взаимодействующих виджетов (в веб-интерфейсе), каждый из которых может находиться в нескольких различных состояниях, и поведение которых зависит от других и других. Я сталкиваюсь с ситуациями, когда, например, набор данных сортируется дважды или данные отображаются перед сортировкой, а не наоборот. Это немного странная проблема, когда я думаю, что упростил вещи и заставил их работать, только чтобы узнать, что я что-то сломал где-то еще.
У меня есть функции, которые делают что-то вроде:
widgetAFunction
load data into widget B
tell widget B to sort the data
tell widget B to display the data
Моя любовь к повторному использованию кода заставляет меня хотеть сделать что-то вроде написания функции loadData в виджете A, которая выглядит примерно так:
widgetBLoadDataFunction
update data
sort the data
refresh the view
Так что все, что нужно сделать виджету А - это вызвать одну функцию в виджете Б. Но тогда бывают случаи, когда я просто хочу отсортировать данные без обновления данных, поэтому я пишу:
widgetBSortFunction
sort the data
refresh the view
А потом, может быть, я хочу функцию фильтра
widgetBFilterFunction
фильтровать данные
обновить вид
А может быть, я хочу обновить данные, но не отсортировать их, поэтому у меня есть
widgetBNoSortLoadDataFunction
update data
refresh the view
Это не кажется таким сложным, но я сталкиваюсь с этими очень длинными, очень хрупкими цепочками вызовов функций или набором очень похожих вызовов. Как сказал бы Мартин Фаулер, код становится немного вонючим.
Итак, какие у меня есть альтернативы? Я сделал что-то в недавнем проекте, где я делал что-то вроде конечного автомата, где я зарегистрировал набор функций с набором условий или состояний, которые инициировали бы их выполнение. Это сработало несколько хорошо, и я думаю, что этот подход можно было бы использовать снова.
Кто-нибудь знает, о чем я здесь говорю, и даже лучше, может кто-нибудь указать мне на некоторые шаблоны, которые помогут мне лучше обдумать это?