假设我有一个类进行一些计算。这组计算需要一组参数作为输入。
public class Calculator
{
private CalculatorConfig _config;
public Calculator(CalculatorConfig config)
{
_config = config;
}
public Result Calculate(object obj){}
}
我的CalculatorConfig类非常简单:
public class CalculatorConfig
{
public double param1;
public double param2;
...
}
我非常简单地初始化
var config = new CalculatorConfig();
config.param1 = val;
....
var calculator = new Calculator(config);
我遇到的困境是这个类的用户可能忘记初始化一些可能导致奇怪行为的字段。 可能有意义的解决方案是将字段转换为属性,并且每个私有字段都有一个额外的布尔值,用于保存字段是否已初始化的信息。 我还可以创建一个megaconstructor,它将所有字段都作为参数。
在这种情况下,您会选择哪种方法?
由于
答案 0 :(得分:0)
如果所有参数都是绝对必需的,那么我会选择“mega constructor”选项。它是一种更加干净的方式来确保所有内容都已初始化,并且您不必添加额外的布尔属性并处理未初始化内容的情况。如果你的一个布尔值包含假值,你会怎么做?你怎么能强制你的类的用户返回并添加这些值,除了某种异常处理?构造函数将简单地确保那些事情甚至不能在编译时发生,而不是在运行时发生。
答案 1 :(得分:0)
在声明中设置默认值:
public class CalculatorConfig
{
public double param1 = 1.0; // a default value chosen by you
public double param2 = 2.0; // a default value chosen by you
}
或更多OO解决方案:使用属性而不是公共字段,然后在创建实例时设置默认值:
public class CalculatorConfig
{
public double param1 {get;set;}
public double param2 {get;set;}
public CalculatorConfig()
{
InitParams();
}
private void InitParams()
{
param1 = 1.0;
param2 = 2.0;
}
}
答案 2 :(得分:0)
我将使用另一种方法。
在Check方法中验证每个参数并抛出自定义 异常是有问题的
public class CalculatorConfig
{
public double param1;
public double param2;
...
internal void Check()
{
if(param1 == 0.0)
throw new ArgumentException("Configuration error: param1 is not valid!");
if(param2 == 0.0)
throw new ArgumentException("Configuration error: param2 is not valid!");
.... // other internal checks
}
}
public class Calculator
{
private CalculatorConfig _config;
public Calculator(CalculatorConfig config)
{
_config = config;
}
public Result Calculate(object obj)
{
// Throw ArgumentException if the configuration is not valid
// Will be responsability of our caller to catch the exception
_config.Check();
// Do your calcs
.....
}
}
答案 3 :(得分:0)
我认为您的配置参数应该是readonly
(可以说是private
,但可以通过属性访问)。然后,将警告设置为标记为错误。然后,当您无法初始化其中一个变量时,您将收到编译时错误
永远不会将字段
CalculatorConfig.param1
分配给,并且始终具有默认值。
现在你已经在编译时发现了这个问题。