OOP设计setter与方法中的传递参数

时间:2017-05-20 16:21:43

标签: java c# oop

我对这种情况下的优秀OOP设计存有疑问:

这个例子并不真实。但是我不能给你真正的例子,因为它的私有代码。然而,示例概念完全相同。

想象一下,我有一个存储字符串列表的类,我有一个名为ThereIsString的方法(字符串mystring)。

我返回true或false,具体取决于我对该字符串执行的计算“是否与其中一个字符串相关”是listOfString。 (这是私有算法)

示例:

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;
    }
}

确定。字符串列表存储在名为ListOfStrings的不同类中,该类具有对StringBagAlgorithm的引用,因此:

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而不是在每个调用中传递列表,性能更好,但设计更差?

1 个答案:

答案 0 :(得分: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打电话!!! class应该是它的类型之一,如果你想要很多,你会做List<MyNewClass>。了解SRP和接口/抽象,并尝试实现它们以获得更好的代码。