2014-09-30 24 views
1

我在尋找設計我如何實現大量計算,以便代碼看起來乾淨並且可以是單元可測試的。這就是我現在所做的。c#模式或許多計算的設計

我有一般形式的塊,MainEngine,AuxEngine,Boilers,WaterBoilers等等。每個塊都有很多屬性。現在我的計算類看起來像這樣。

我用不同的計算邏輯部分類塊

之間
/// <summary> 
/// My result class wich fill CalculationResult 
/// </summary> 
public partial class CalculateBlocks 
{ 
    private readonly IClassificatoryService _classificatoryService; 
    private readonly IReportService _reportService; 

    public CalculationResult Result = new CalculationResult(); 

    /// <summary> 
    /// Ctor with DI 
    /// </summary> 
    public CalculateBlocks(IClassificatoryService classificatoryService,IReportService reportService) 
    { 
     _classificatoryService = classificatoryService; 
     _reportService = reportService; 
    } 

    public void Calculate() 
    { 
     CalculateGeneral(); 
     CalculateMainEngine(); 
     //and a lot more blocks 
    } 
} 

public partial class CalculateBlocks 
{ 
    private void CalculateGeneral() 
    { 
     Result.General.TotalReports = 2 + 2; 
    } 
} 

public partial class CalculateBlocks 
{ 
    private void CalculateMainEngine() 
    { 
     Result.MainEngine.Power = 1000; 
    } 
} 

而且我的實體看起來像這樣

public class CalculationResult 
{ 
    public CalculationResult() 
    { 
     General = new General(); 
     MainEngine = new MainEngine(); 
    } 

    public General General { get; set; } 
    public MainEngine MainEngine { get; set; } 
} 

public class General 
{ 
    public decimal? TotalReports { get; set; } 
    //... more here 
    //... more here 
    //... more here 
} 

public class MainEngine 
{ 
    public decimal? Power { get; set; } 
    //... more here 
    //... more here 
    //... more here 
} 
+0

純計算通常是單位可測試的 - 提供輸入,運行計算,驗證輸出。你關心什麼部分? – 2014-09-30 12:35:13

+0

incase你還沒有看到這個,我確定你有..但incase你沒有..很好的資源:http://www.dofactory.com/net/design-patterns – Tony 2014-09-30 12:49:47

回答

5

聽起來就像是strategy pattern是你在找什麼。每個塊將是一個實現接口的獨立類。

喜歡的東西:

interface IBlockCalculator 
{ 
    CalculationResult Calculate(); 
} 

class MainEngineBlockCalculator : IBlockCalculator 
{ 
    public CalculationResult Calculate() 
    { 
     // Calculation goes here... 
    } 
} 

class GeneralEngineBlockCalculator : IBlockCalculator 
{ 
    public CalculationResult Calculate() 
    { 
     // Calculation goes here... 
    } 
} 

然後,您可以實現每個塊的接口。你甚至可以將它們組合起來,這樣你就可以擁有一個帶有子塊的頂層塊。

單元測試也被簡化了,因爲您可以單獨測試每個單獨的塊計算。

[Test] 
public void TestMainEngineBlock...() 
{ 
    // Arrange 
    var sut = new MainEngineBlockCalculator(); 
    // Set up your test scenario here... 

    // Act 
    var actualResult = sut.Calculate(); 

    // Assert 
    // Assertion on actualResult go here... 
} 
+0

我同意這是第一個模式,在我的腦海中流行。 「定義一系列算法,封裝每一種算法,並使它們可以互換。策略可以使算法獨立於使用算法的客戶端。」 – Tony 2014-09-30 12:45:52

0

另一個您可能要考慮的概念是Facade design pattern。更爲人所知的是爲子系統中的一組接口提供統一接口。並在你的情況下

所以代碼看起來乾淨,可以單元測試。

我認爲它可以用來定義更高層次的實現,使子系統更易於使用。

隱藏實現細節也是Encapsulation的概念。因此,其他用戶/合作伙伴正在被提供他們需要知道/使用的東西,而實際的處理由其負責。

如果您打算處理細粒度的實例並共享它們,Flyweight design pattern也可能有用。