Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 设计和封装:具有多个类实例的字典,或具有多个内部字典的一个实例_Oop_Dictionary_Encapsulation - Fatal编程技术网

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

Oop 设计和封装:具有多个类实例的字典,或具有多个内部字典的一个实例,oop,dictionary,encapsulation,Oop,Dictionary,Encapsulation,我有一个Calculator类,它接受n种类型的数据,并根据对数据的一些计算返回一个值。我在我的主类中生成数据,在如何设计计算器类方面,我面临两个选项 第一种选择: public class Main { Dictionary<DataType, Calculator> dataTypeToCalculator = new Dictionary<DataType, Calculator>() void RecordResult(Data data)

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

第一种选择:

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;
    }
}
公共类主
{
Dictionary dataTypeToCalculator=新字典()
无效记录结果(数据)
{
Calculator Calculator=dataTypeToCalculator[data.DataType];//假设存在
int结果=计算器。计算(数据);
StoreResult(result);//假设这是实现的,它将结果存储在主对象中的某个位置
}
}
公共类计算器
{
int field1=1;
int field2=2;
int计算(数据)
{
返回数据。值+字段1+字段2;
}
}
第二种选择:

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;
    }
}
公共类主
{
计算器=新计算器();
无效记录结果(数据)
{
计算器。计算(数据);
}
}
公共类计算器
{
Dictionary dataTypeToField1=新字典();
Dictionary dataTypeToField2=新字典();
无效计算(数据)
{
int field1=dataTypeToField1[data.DataType];
int field2=dataTypeToField2[data.DataType];
返回数据。值+字段1+字段2;
}
}

我有两个干净的类,它们没有任何内部字段,在这里我可以有一个实例,只需将数据从主类传递给它,并让它处理不同的数据类型。但是,我还有其他类,它们有多个必需字段,为每个字段创建一个内部字典似乎很糟糕。对于这种情况是否有标准的“最佳实践”?在本例中,我希望计算器封装所有计算任务,而不必依赖主类来分离数据。然而,当我的类有很多字段时,这对我来说似乎并不合适。

您的案例是非常具体的一个,所以我认为没有任何“最佳实践”适合您的问题。幸运的是,这里有一些基本原则,其中我最喜欢的一个是原则

如果我正确理解了你的情况,你已经:

  • 计算器
    负责计算
  • 工厂
    负责创建
    计算器
    实例
  • 包含
    计算器数据的
    配置
  • 存储库
    负责数据持久性
因此,我建议创建负责特定功能的单独类:Calculator、CalculatorFactory、CalculatorConfiguration、CalculationResultsRepository等等


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

您的案例非常具体,因此我认为没有任何“最佳实践”适合您的问题。幸运的是,这里有一些基本原则,其中我最喜欢的一个是原则

如果我正确理解了你的情况,你已经:

  • 计算器
    负责计算
  • 工厂
    负责创建
    计算器
    实例
  • 包含
    计算器数据的
    配置
  • 存储库
    负责数据持久性
因此,我建议创建负责特定功能的单独类:Calculator、CalculatorFactory、CalculatorConfiguration、CalculationResultsRepository等等

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