1

假设我有一个做一些计算的类。这组计算需要一组参数作为输入。

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

我的困境是这个类的用户可能会忘记初始化一些可能导致奇怪行为的字段。可能有意义的解决方案是将字段转换为属性,并且每个私有字段都有一个额外的布尔值,用于保存字段是否已初始化的信息。我还可以创建一个巨型构造函数,它将所有字段都作为参数。

在这种情况下你会选择什么方法?

谢谢

4

4 回答 4

0

如果所有参数都是绝对必需的,那么我会选择“大型构造函数”选项。它是一种更简洁的方式来确保所有内容都已初始化,并且您不必添加额外的布尔属性并处理未初始化某些内容的情况。如果您的布尔值之一包含错误值,您会怎么做?除了某种异常处理之外,您如何强制您的类的用户返回并添加这些值?构造函数将简单地确保这些事情甚至不会在编译时发生,而不是在运行时发生。

于 2012-05-23T12:57:35.703 回答
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;
      }
}
于 2012-05-23T12:57:43.890 回答
0

我将使用另一种方法。

  • 向 CalculatorConfig 类添加另一个名为 Check 的方法(可能是内部方法)。
  • 在Calculate 方法的执行过程中调用此方法。
  • 在 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
            .....
        } 
    } 
    
于 2012-05-23T12:59:42.173 回答
0

我认为您的配置参数应该是readonly(并且可以private通过属性访问)。然后,将警告设置为标记为错误。然后,当您无法初始化这些变量之一时,您将收到编译时错误

该字段CalculatorConfig.param1永远不会分配给,并且将始终具有其默认值。

现在您已经在编译时发现了问题。

于 2012-05-23T12:59:55.760 回答