1

我正在查看 ruby​​ gem 工作流程:https ://github.com/geekq/workflow

Web 上的示例和其他示例在模型本身中包含工作流代码。我认为这是违反 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 项目中的哪个位置对状态更改进行编码?

4

2 回答 2

0

Daniel,您分享的代码清单和 Ruby Gem 工作流 ( https://github.com/geekq/workflow )上的代码清单似乎在模型对象上定义了状态、事件、转换和操作。

Gem Workflow 链接中的代码清单

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,我认为是否可以修改此代码,使 Workflow 适用于 Controller 而不是 Model。

模型是域实体的实例对象 - 消息或文章。他们自己没有定义工作流程。他们可以随时处于任何状态。系统需求具有任何给定模型对象的状态上下文。例如,消息本身并不关心它是否是垃圾邮件。一篇文章本身没有新的、拒绝的、批准的、提交的或正在审查的标签。

因此,如果控制器被赋予了工作流职责,那么控制器将处理事件、采取行动并进行状态转换。在那里,控制器采取的行动可能会执行必要的工作来修改模型对象。

类比:作者开始在他的笔记本上写文章(用笔)。一直陪着他,直到不满意为止。文章本身已经知道它的新/新鲜的含义。然后作者提交文章进行审查。文章移到审稿台,但文章本身不能定义不能修改的状态。等等。

那有意义吗!?

于 2013-05-20T04:44:14.267 回答
0

经过一段时间的学习...

我认为状态图代表了模型的状态,很容易被滥用为工作流引擎。

于 2013-05-17T00:53:36.997 回答