2017-05-20 59 views
0

我對這種情況下良好的OOP設計有疑問:OOP設計二傳手vs方法中傳遞參數

這個例子並不真實。但我不能給你真正的例子,因爲它的私有代碼。然而,這個例子的概念完全一樣。

想象一下,我有一個類存儲字符串列表,我有一個名爲ThereIsString(字符串mystring)的方法。

根據我對該字符串「與某個字符串相關」所做的計算是否爲listOfString,我返回true或false。 (這是私有的算法)

實施例:

public class StringBagAlgorithm() 
{ 
    List<string> listofString = new List<string>(); 

    public boolean ComputeString(string myString) 
    { 
     return true or false depending on the computation with the list of strings; 
    } 
} 

確定。字符串列表存儲在其中有StringBagAlgorithm這樣的引用不同的類名爲ListOfStrings:

public class ListOfStrings() 
{ 
    List<string> listofString = new List<string>(); 
    List<string> MySecondListofString = new List<string>(); 
    StringBagAlgorithm _bagAlgorithm 

    public ListOfStrings(StringBagAlgorithm bagAlgorithm) 
    { 
     this._bagAlgorithm = bagAlgorithm; 
    } 

    public void ComputeSecondList() 
    { 
     for (int i=0; i<MySecondListofString; i++) 
      _bagAlgorithm.ComputeString(MySecondListofString[i]); 
    } 
} 

我的問題是什麼是傳遞listofString到StringBagAlgorithm的最佳途徑。通過在for循環中執行例如:

_bagAlgorithm.ComputeString(MySecondListofString [i],listofString);

或者在執行for循環之前使用setter來完成。還是有其他選擇?

想知道哪個是鬆散耦合和單元測試的最佳OO設計。另外我猜想,通過使用一次setter而不是在每次調用中通過列表,性能都會更好,但設計更糟?

+2

該setter意味着共享,可變數據。將對象作爲方法參數傳遞,而不是修改它,是一種更實用,線程安全的方法。 – duffymo

+1

是否ComputeString將特定於每個基類?如果是這樣,你可以有一個抽象基類,並且繼承類可以通過覆蓋它來實現ComputeString。 – Mez

+0

ComputeString算法是唯一的,但它可能會使用抽象類。但是我的疑問是,如果在每個方法調用中傳遞整個列表還是傳遞給setter更好。這是最好的設計?用於單元測試和鬆散耦合 – user3032175

回答

0

它必須是類似的東西:

public class StringBagAlgorithm 
{ 
    public List<string> ListofString { get; set; } 

    public bool ComputeString(string myString) 
    { 
     //return true or false depending on the computation with the list of strings; 
     return true; 
    } 
} 

public class StringsComputer 
{ 
    public List<string> FirstList { get; set; } 
    public List<string> SecoundList { get; set; } 
    public StringBagAlgorithm BagAlgorithm { get; set; } 

    public StringsComputer(StringBagAlgorithm bagAlgorithm, List<string> listA, List<string> listB) 
    { 
     BagAlgorithm = bagAlgorithm; 
     FirstList = listA; 
     SecoundList = listB; 
    } 

    public StringsComputer() 
    { 
    } 

    public void ComputeSecondList() 
    { 
     if(BagAlgorithm != null) 
     { 
      for (int i = 0; i < SecoundList.Count; i++) 
       BagAlgorithm.ComputeString(SecoundList[i]); 
     } 
    } 
} 

public class program 
{ 
    public static void Main() 
    { 
     List<string> listA = new List<string>() { "A", "B", "C", "D" }; 
     List<string> listB = new List<string>() { "E", "F", "C", "H" }; 
     StringBagAlgorithm sba = new StringBagAlgorithm(); 

     StringsComputer sc = new StringsComputer() { 
      FirstList = listA, 
      SecoundList = listB, 
      BagAlgorithm = sba 
     }; 

     sc.ComputeSecondList(); 
    } 
} 

最有名的錯誤打電話給你的類ListOfStrings!班級應該是其中一種類型,如果你想要很多,你會做List<MyNewClass>。瞭解SRP和接口/抽象,並嘗試實現它們以獲得更好的代碼。