2017-05-31 44 views
-2

我有具有3個函數ExtractData,ValidateFinishForms的類DataManipulation
所有的方法都需要訪問該類的私有變量(還有更多,爲了可讀性而縮短的例子)。重構出具有許多共享變量的類方法的設計模式

實際的班級非常長,我想將它分成3個班級,每個班級都有一個班級,每個班級都有一個班級。
我使用依賴注入來實例化類,並簡單地將3個方法分成3個類將意味着通過相當多的變量,我認爲這不利於可讀性。

TL; DR。我有一個非常長的類,其中方法操縱很多內部變量。方法可以分爲3個不同的責任區域,但將類別劃分爲3將意味着傳遞許多內部變量。

我正在尋找適合我的問題的正確設計模式。

public class DataManipulation 
    { 
     private readonly IUnityContainer unity, 

     private ImportModel VarUsedEverywhere; 
     //VarUsedEverywhere1 to 10 also defined here 

     private List<string> _errorMessages = new List<string>(); 

     public DataManipulation(IUnityContainer unity) 
     { 
      _unity = unity; 
     } 


     public async Task<ImportLogModel> Process(Stream importFile) 
     { 

      ExtractData(importFile); 

      await Validate(); 

      await FinishForms(); 

      return VarUsedEverywhere1; 
     } 
    } 

 private bool ExtractData(Stream importFile) 
     {     
      for (var row = 1; row <= importFile.MaxDataRow; row++) 
      { 
       foreach (var header in importFile.headerMap) 
       { 
        var value = importFile.Cells[row, header.Value.Item1].GetUnmergedValue(); 
        VarUsedEverywhere1.rows[row].add(value);   
       } 
      } 
      //Extract more data into VarUsedEverywhere 
      //Add to _errorMessages if operations do not succeed. 
     } 

 private bool Validate() 
     { 
      if (!VarUsedEverywhere1.Headers.Contains(VarUsedEverywhere2.sourceHeaderKey)) 
      { 
       _errorMessages.Add(string.Format("Could not find header in Excel file: [{0}]", importMap.sourceHeaderKey)); 
       success = false; 
      } 
      //validate data in VarUsedEverywhere1 to 10 
      //Add to _errorMessages if operations do not succeed. 
     } 

 private bool FinishForms() 
     { 
      foreach (var importMap in VarUsedEverywhere1.importMap.Where(m => m.sort != 0).OrderByDescending(m => Math.Abs(m.sort))) 
      { 
       if (importMap.sort > 0) 
       { 
        rows = rows.OrderBy(r => r[importMap.sourceHeaderKey]); 
       } 
      } 
      //Order all the values in VarUsedEverywhere 
      //Add to _errorMessages if operations do not succeed. 
     } 

編輯添加一些代碼的方法的要求。

+1

您顯示的代碼只有三個成員。如果我們無法看到完整的代碼,那麼理解什麼建議會有點困難。你可以請張貼[mcve]嗎? – Enigmativity

+0

這是一個設計問題,我不清楚爲什麼它會影響我的代碼的實際外觀? 我試圖從方法中包含一些實際的代碼。 – Jeppe

+0

這就是爲什麼我想看完整的代碼,因爲我不知道直到我看到它是如何重要的。 – Enigmativity

回答

2

您可以使用屬性而不是變量創建類,並將此屬性容器傳遞給您的3個類。它會減少代碼(因爲你從類中移動了所有的字段)。如果你決定增加一個新的變量,你將會把它添加到這個容器類中,而其他所有的類將有權訪問它,並且你將不必在多個方法中添加這個參數。

+0

我有理由考慮創建一個數據容器來傳遞,這會使代碼看起來更乾淨。問題是不同變量中有很多數據,而且你的建議會讓我把所有的數據都傳遞出去,而不管數據是否在函數中需要。 – Jeppe

+0

對不起,但我不能幫助你,因爲我沒有看到/知道你的代碼。但在大多數情況下,至少可以分組(創建少量容器類)或將您的功能分解爲較小的類,以保持適當的問題分離。例如,創建Validator類並移動驗證方法,並將其作爲構造器參數傳遞給DataManipulation類,以便可以公開驗證器可以設置的一些屬性。這只是一個想法,但正如我所說我不知道​​你的代碼。 –