Рабочий процесс в моделях MVC?

Я смотрю на рабочий процесс ruby ​​gem: https://github.com/geekq/workflow

В примерах и других примерах в Интернете код рабочего процесса содержится в самой модели. Я считаю, что это нарушение SOLID. Кроме того, бизнес-логика также будет закодирована в классе модели (действия, предпринимаемые при переходе модели в несколько состояний), что является нарушением контракта MVC.

Пример:

class Message

  workflow do
    state :spam_check do
      event :is_spam, transitions_to => :destroy
      event :is_not_spam,:transitions_to => :finished
    end
  end

  # business logic
  def is_spam
    self.user.spammer_score += 1
    if self.user.spammer_score > 5
        self.user.destroy
    end
  end
end

Это хорошее программирование? Если нет, то где в проекте rails должны быть закодированы изменения состояния?


person Daniel    schedule 16.05.2013    source источник


Ответы (2)


После некоторого изучения...

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

person Daniel    schedule 17.05.2013

Дэниел, кажется, что листинг кода, которым вы поделились, и листинг кода рабочего процесса Ruby Gem (https://github.com/geekq/workflow) — определение состояний, событий, переходов и действий над объектами модели.

Листинг кода по ссылке на рабочий процесс Gem

class Article
  include Workflow
  workflow do
    state :new do
      event :submit, :transitions_to => :awaiting_review
    end
    state :awaiting_review do
      event :review, :transitions_to => :being_reviewed
    end
    state :being_reviewed do
      event :accept, :transitions_to => :accepted
      event :reject, :transitions_to => :rejected
    end
    state :accepted
    state :rejected
  end
end

Я думаю, что для MVC и SOLID этот код можно изменить таким образом, чтобы рабочий процесс применялся к контроллеру, а не к модели.

Модель является экземпляром объекта предметной области - Сообщение или Статья. Они сами не определяют рабочий процесс. Они могут быть в любом состоянии в любое время. Именно системные требования имеют контекст состояний для любых заданных объектов модели. Например, самому сообщению все равно, является ли оно спамом. Сама статья не имеет тега «новая», «отклоненная», «утвержденная», «отправленная» или «находящаяся на рассмотрении».

Следовательно, если на контроллер возложены обязанности рабочего процесса, то контроллер будет обрабатывать события, выполнять действия и выполнять переходы между состояниями. При этом действия, предпринимаемые контроллером, могут выполнять необходимую работу по изменению объектов модели.

Реальная аналогия: автор начинает писать статью в своем блокноте (ручкой). Держит его при себе, пока он не удовлетворит. Сама статья имеет значение, что она новая/свежая. Затем автор отправляет статью на рецензирование. Статья перемещается на стол рецензента, но сама статья не может определить состояние, в котором она не может быть изменена. и так далее.

Имеет ли это смысл!?

person bhavik shah    schedule 20.05.2013
comment
Вроде, как бы, что-то вроде. Вы подразумеваете, что переход из одного состояния в другое — это вызов метода, который ничего не делает. Для события выше: что, если метод submit() действительно сработал? Скажем, отправить электронное письмо рецензенту о том, что необходимо выполнить работу? или accept/reject() требовал дополнительного параметра, почему он был принят или отклонен?. Эти вызовы методов теперь выполняют работу, которая принадлежит контроллеру. Тем не менее, было бы очень удобно в вызове метода рабочего процесса... :) - person Daniel; 21.06.2013
comment
Что ж, я не эксперт по рубину, однако я думаю, что то, о чем вы спрашиваете, должно быть возможно с помощью действий в модели/структуре рабочего процесса. Вы можете написать произвольные действия и расширить вариант использования в соответствии с вашими требованиями — например, отправить статью по электронной почте рецензентам или установить дополнительные параметры в базе данных для принятия или отклонения событий/переходов. - person bhavik shah; 26.06.2013