1

我正在查看紅寶石寶石工作流程:https://github.com/geekq/workflowMVC模型中的工作流程?

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 

這是很好的編程?如果不是,那麼在鐵路項目中應該對狀態變化進行編碼?

回答

0

一些研究之後...

我認爲一個狀態圖表示狀態的模型,很容易被濫用成爲工作流引擎。

0

Daniel,看來您共享的代碼清單和Ruby Gem Workflow(https://github.com/geekq/workflow)上的代碼清單 - 定義了模型對象上的狀態,事件,轉換和操作。

代碼從Gem Workflow link

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和固體,我想,如果這個代碼能夠以這樣的方式修改工作流程適用於控制器,而不是模型。

模型是域實體的實例對象 - 消息或文章。他們沒有自己定義工作流程。他們可以隨時處於任何狀態。系統要求具有任何給定模型對象的狀態上下文。例如,一條消息本身並不在乎它的垃圾郵件。文章本身沒有新標籤,拒絕,批准,提交或正在審覈。

因此,如果控制器被賦予工作流的責任,那麼控制器將處理事件,將採取行動,並將做狀態轉換。在這種情況下,控制器採取的行動可能會執行修改模型對象的必要工作。

真像比喻: 作者開始在筆記本上寫文章(用筆)。與他保持一直到它不令人滿意。文章本身已經知道它的新/新鮮的含義。然後作者提交文章進行審查。文章轉到審稿人桌面,但文章本身不能定義它不能被修改的狀態。等等。

這是否有道理!?

+0

整理。你暗示着從一種狀態轉換到另一種狀態是一種無所作爲的方法調用。對於上面的事件:如果submit()方法實際上有效,該怎麼辦?說給審稿人發郵件需要完成工作?或接受/拒絕()需要一個額外的參數爲什麼被接受或拒絕?這些方法調用現在執行屬於控制器的工作。然而,在工作流方法調用中會非常方便。:) – Daniel

+0

那麼,我不是紅寶石專家,但我認爲你所問的應該是可能的工作流模型/框架中的行動。您可以根據需要編寫任意操作並擴展用例 - 例如,通過將文章發送給審閱者或者爲了接受或拒絕事件/轉換而在數據庫中設置其他參數。 –