Как вы справляетесь со сложными ситуациями, в которых важен порядок операций? - PullRequest
4 голосов
/ 23 февраля 2009

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

У меня есть функции, которые делают что-то вроде:

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

Это не кажется таким сложным, но я сталкиваюсь с этими очень длинными, очень хрупкими цепочками вызовов функций или набором очень похожих вызовов. Как сказал бы Мартин Фаулер, код становится немного вонючим.

Итак, какие у меня есть альтернативы? Я сделал что-то в недавнем проекте, где я делал что-то вроде конечного автомата, где я зарегистрировал набор функций с набором условий или состояний, которые инициировали бы их выполнение. Это сработало несколько хорошо, и я думаю, что этот подход можно было бы использовать снова.

Кто-нибудь знает, о чем я здесь говорю, и даже лучше, может кто-нибудь указать мне на некоторые шаблоны, которые помогут мне лучше обдумать это?

Ответы [ 2 ]

4 голосов
/ 23 февраля 2009

Что вам нужно, это реализация с конечным автоматом . В основном каждый конечный автомат нуждается в:

  • События, на которые программа отвечает
  • Состояния, в которых программа ожидает между событиями
  • Переходы между состояниями в ответ на события
  • Действия, предпринятые при переходах
  • Переменные, которые содержат значения, необходимые для действий между событиями

A Хорошая статья от IBM научит вас, как реализовать ее с помощью Javascript.

Редактировать : Вот строитель FSM , поэтому вам не нужно создавать свой собственный.

0 голосов
/ 24 февраля 2009

Фернандо уже упомянул автоматов и дал хорошую информацию и ссылки. :)

Кроме того, я добавлю, что ваши классы уже должны включать достаточное количество состояний, чтобы вы не беспокоились о сортировке дважды и т. Д. Т.е. widgetB.sort () должен проверить, отсортированы ли они с момента последнего обновления, и просто вернуть если так. В этом практически нет недостатков, и это может улучшить производительность (а также защитить последовательность).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...