2009-01-15 43 views
3

好吧,所以我想獲得有關此主題的意見。數據建模問題 - 數據和計算和訪問邏輯的分離

我有一個愚蠢的數據對象 - CustomerOrder。

CustomerOrder有一個價格和數量,但也有一個TotalCash屬性(價格*數量)。所以我有一個totalCash屬性,但我不想直接將計算放入對象中,因爲這會打破啞數據對象規則。我確實需要在整個應用程序中一遍又一遍地獲得現金流量,所以我需要集中計算。我可以創建一個cashFlowCalculator類並傳入一個customerOrder,但我不希望每個簡單計算都有另一個類。

任何想法或最佳實踐?

+0

您正在使用數據集和數據表? – 2009-01-15 04:31:35

回答

1

在同樣的情況下,我會打破「啞數據對象規則」,因爲我不希望經常改變特定的計算。我可能會把它作爲一個getter來實現。

對於更復雜的場景,創建一個OrderCalculator類來接收與訂單相關的類並且可以執行各種計算(例如包含的稅,測量邊際等)是有意義的。通過這種方式,您可以委託在CustomerOrder之外執行計算。例如,CustomerOrder不需要知道德克薩斯州的州稅來確定是否需要銷售稅。

0

我理解保持數據對象與業務邏輯分離的基本原理。對設計器生成的類使用LINQ,我感到很自在用包含業務邏輯的分部類實現來擴展生成的類。我覺得這足以滿足我的需求。如果這不起作用,那麼我會同時擁有數據對象和業務對象 - 可能與1-1對應,也許不對。工廠類或方法可用於在您的業務對象和數據對象之間進行翻譯。然後,只需在業務對象中實現業務邏輯,而不需要用於計算的輔助對象。

0

爲什麼不採用擴展方法?

public sealed class CustomerOrder 
{ 
    public decimal Price; 
    public decimal Quantity; 
} 

public static class CustomerOrderExtensions 
{ 
    public static decimal GetTotalCash(this CustomerOrder data) 
    { 
     return data.Price*data.Quantity; 
    } 
} 

你甚至可以將你的擴展靜態類移動到不同的命名空間。

0

如果這是從數據表更新的數據傳輸對象(DTO),我會建議在該表中添加一個TotalCash Datacolumn,並將datacolumn Expression屬性設置爲「price * quantity」。在從數據表中更新的啞(DTO)類中創建一個TotalCash只讀屬性。從OO角度來說,它應該做的方式。

0

另一個選擇[對於這裏的複雜事物可能太簡單了;-)]是讓啞數據對象具有計算字段的屬性,但讓檢索數據的SQL查詢執行計算(一次) ;使這些領域的只讀當然

0

我想你應該考慮,如果你真的想TotalCash是一個計算/導出的財產......

考慮 - 如果計算中的業務邏輯的變化,具有TotalCash 現有記錄的屬性改變追溯可能是不希望

我會考慮做財產DTO的非計算成員,或許還可以使用用於確定設定值的TotalCostCalculation服務類。

只是我的2美分。

0

我會在你的DTO中計算TotalCash(這將是YAGNI)。如果將來您需要更改TotalCash的行爲,那麼可以考慮使用TotalCashCalculator並通過DI將其傳遞到訂單中。