设计和封装:具有多个类实例的字典,或具有许多内部字典的一个实例

时间:2013-04-09 19:22:16

标签: oop dictionary encapsulation

我有一个Calculator类,它接收n种类型的数据,并根据对数据的某些计算返回一个值。我在Main类中生成数据,并且我面临着如何设计Calculator类的两个选项。

第一个选项:

public class Main 
{
    Dictionary<DataType, Calculator> dataTypeToCalculator = new Dictionary<DataType, Calculator>()
    void RecordResult(Data data) 
    {
        Calculator calculator = dataTypeToCalculator[data.DataType]; //assume this exists
        int result = calculator.Calculate(data);
        StoreResult(result); //pretend this is implemented, it stores the result somewhere in Main object
    }
}

public class Calculator 
{
    int field1 = 1;
    int field2 = 2;
    int Calculate(Data data) 
    {
        return data.Value + field1 + field2;
    }
}

第二个选项:

public class Main 
{
    Calculator calculator = new Calculator();
    void RecordResult(Data data) 
    {
        calculator.Calculate(data);
    }
}

public class Calculator 
    {
    Dictionary<DataType, int> dataTypeToField1 = new Dictionary<DataType, int>();
    Dictionary<DataType, int> dataTypeToField2 = new Dictionary<DataType, int>();
    void Calculate(Data data) 
    {
        int field1 = dataTypeToField1[data.DataType];
        int field2 = dataTypeToField2[data.DataType];
        return data.Value + field1 + field2;
    }
}

我有几个干净的类,没有任何内部字段,我可以拥有一个实例,只需从Main类传递数据,并让它处理不同的DataTypes。但是,我有其他具有多个必填字段的类,并且为每个字段创建内部字典似乎很糟糕。是否有标准的最佳实践&#34;对于这种情况?在这个例子中,我希望Calculator能够封装所有的计算任务,而不必依赖Main类来分离数据。然而,当我的班级有很多领域时,这对我来说似乎并不合适。

1 个答案:

答案 0 :(得分:1)

您的案例非常具体,所以我认为没有任何&#34;最佳做法&#34;这适合你的问题。幸运的是,我最喜欢的Single Responsibility Principle (SRP)原则SOLID有一般原则。

如果我正确理解你的情况,你有:

  • Calculator负责进行计算
  • Factory负责创建Calculator个实例
  • Configuration包含Calculators
  • 的数据
  • Repository负责数据持久性

所以我建议创建负责特定功能的单独类:Calculator,CalculatorFactory,CalulatorConfiguration,CalculationResultsRepository,...

创建一个具有多个职责的类通常会导致难以管理,测试和未来开发的代码。