2015-10-13 171 views
1

在閱讀https://softwareengineering.stackexchange.com/questions/165444/where-to-put-business-logic-in-mvc-design/165446#165446之後,我仍然對我想將計算折扣代碼放在哪裏感到困惑。計算產品或服務的折扣價格我認爲這絕對是業務邏輯的一部分,不屬於應用程序路由或數據庫交互。因此,我正在努力在哪裏放置我的業務邏輯。業務邏輯是否存在於模型或控制器中?

class Model 
{ 
    public function saveService($options) 
    { 
     $serviceId = $options['service_id']; 

     //Model reads "line Item" from database 
     $service = $this->entityManager->find('Entity\ServiceLineItem', $serviceId); 
     //uses the data to compute discount 
     //but wait.. shouldn't model do CRUD only? 
     //shouldn't this computation be in Controller? 
     $discount = ($service->getUnitPrice() * 0.25); 

     // Add the line item 
     $item = new SalesItem(); 
     $item->setDiscount($discount); 
    } 
} 


class Controller 
{ 
    function save() 
    { 
     $this->model->saveService($options); 
    } 
} 

問:

以上$discount計算,它應該留在型號呢,還是進入控制器?如果進入控制器,控制器必須首先調用$service(通過模型),然後在控制器內計算$discount,然後將其值發送回要保存的模型。這是做到這一點的方式嗎?

注意

我可能會混淆模型與「存儲」。我可能需要有一個模型來處理業務邏輯,Database/Persistent Storage應該是一個單獨的層。

回答

0

我使用了一個名爲「Yii Framework」的MVC框架,它在控制器中有一個名爲beforeSave()的函數,用於在保存模型值之前更改模型值。

按照這一邏輯也許是最好的做法是隻保存模型(在你的控制器)

1

如何從數據不容易回答到業務邏輯分離的問題之前,應用折扣,你的價格。但是,Daniel Rocco構建了a good discussion of the subject,如果不是針對這個特定問題,那麼您可能會發現有幫助,然後再構造一般的業務應用程序。

2

回答這樣的問題通常是自以爲是的,或者可以說這取決於您的業務用例。

首先,我感覺在你的Modelservice措辭在這裏的一些混淆。 A model應該是您的domain modelservice應該是domainapplication service,在不同的類或不同的層。

建築學上認爲你可以遵循一個相當簡化的DDD實現。

即:

  1. 您實現您的域模型中的所有行爲的概念,這是有關模型當前狀態
  2. 使用工廠將從庫
  3. 使用查詢行項目域服務主要是與您的模型無關的所有內容,在您的情況下計算折扣(如果您需要邏輯可重用,例如在更多模型或服務中)。你不想污染你的領域模型與非相關的機制和依賴關係
  4. 爲了持久性,你最好使用不同的層,通過這個你最好分離你可以關心的大部分問題,其原因是可測試性和另一個原因 - 最多的其他 - 更少的代碼改變後

通過在長期內維修器材您的代碼實現一個更清潔架構和痛苦少,不要忘記去思考如何設計模式和SOLID principles可以幫助你實現你的解決給出業務用例。

4

業務邏輯屬於一個服務,所以你需要添加一個服務層。

業務邏輯往往跨越多個模型,從而推斷它不屬於任何單一模型。因此,你不應該把邏輯放在哪個模型中。

輸入服務等級。 我傾向於爲軟件設計的每個用例提供服務。 在你的情況下,可能會有一個CheckOutService計算你的總金額,包括折扣。 這樣每種服務都有一個特定而直觀的目的。然後,當控制器需要一些業務邏輯時,它會調用一個專門用於該目的的服務。

在MVC模式是什麼服務做了很好的說明可以在這裏找到: MVCS - Model View Controller Service

我還要舉最精華的部分:

服務層將被負責:

  • 從各種數據源(或數據訪問對象)撤回並創建'模型'。
  • 更新各個存儲庫/資源的值。
  • 執行應用程序特定的邏輯和操作等

編輯:我剛纔看到kayess答案。我會說他的答案比我的答案更精確,但鑑於問題的不確定性,我不知道它有多可信。所以我希望我的編程生涯的早期階段能夠幫助一些人。

0

下面的圖片顯示如何,我認爲您的「業務」的邏輯應該去:)

enter image description here

上面圖片中的「服務」層作爲服務器端「控制器」。

它是「客戶端」控制器和「邏輯」層之間的中間人。

所有任務,需要一些像

型「邏輯學」的「計算一個產品或服務的折扣價」

將進入一個ProductLogic類的地方需要投入如果需要,從服務中獲得,並使用該信息來幫助計算折扣價格。

如果需要,ProductLogic類還將查詢「數據」源以獲取項目的當前價格。

ProductLogic Class將從服務和存儲庫收集的信息拼湊在一起進行計算,如果需要返回給用戶,那麼ProductLogic類將把它發送到服務層。

如果只需將其保存在存儲庫中,則邏輯將傳遞信息至存儲庫以進行處理。

希望這有助於:)

有一個偉大的一天!

相關問題