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

しばらく勉強した後...

状態図はモデルの状態を表し、ワークフロー エンジンとして悪用されやすいと思います。

于 2013-05-17T00:53:36.997 に答える
0

ダニエル、あなたが共有したコード リストと、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 の場合、ワークフローがモデルではなくコントローラーに適用されるように、このコードを変更できればと思います。

モデルは、ドメイン エンティティ (メッセージまたは記事) のインスタンス オブジェクトです。彼らはワークフロー自体を定義しません。彼らはいつでもどんな状態にもなりえます。これは、特定のモデル オブジェクトの状態のコンテキストを持つシステム要件です。たとえば、メッセージ自体はスパムかどうかを気にしません。記事自体には、新規、却下、承認、提出、またはレビュー中というタグはありません。

したがって、コントローラーにワークフローの責任が与えられた場合、コントローラーはイベントを処理し、アクションを実行し、状態遷移を行います。その中で、コントローラーによって実行されるアクションは、モデル オブジェクトを変更するために必要な作業を実行する場合があります。

リアルな例え: 著者はノートに (ペンを使って) 記事を書き始めます。満足のいくものでなくなるまで彼と一緒に保管してください。記事自体には、その新しい/新鮮なという意味があります。次に、著者はレビューのために記事を送信します。記事はレビュアー デスクに移動しますが、記事自体は変更できない状態を定義できません。等々。

それは理にかなっていますか!?

于 2013-05-20T04:44:14.267 に答える