重载,可选参数或其他什么?

时间:2010-10-18 16:09:00

标签: c#-4.0

我需要根据两个不同的验证规则验证字段的值:

  1. 我自己的一个对象,它包含一个正则表达式和一个范围(对于字符串它的长度范围)。
  2. 可能值的列表。
  3. 所以我可以这样做:

    public static bool Validate(string fieldValue, string fieldType, ValidationParameters validationParameters)
    {
    ...
    }    
    public static bool Validate(string fieldValue, string fieldType, string[] possibleValues)
    {
    ...
    }  
    

    但这需要用户非正常地if 我也可以这样做:

    public static bool Validate(string fieldValue, string fieldType, ValidationParameters validationParameters=null,string[] possibleValues=null)
    {
    ...
    }  
    

    现在,用户可以发送他的数据,但没有多余if,但我无法确保validationParameterspossibleValues(其中一个)获得了值。

    是否有第三个选项,用户不必检查他使用的是哪种方法,但我不必担心他不会发送任何两个字段(代码,而不是文档) )?
    如果不是,上述两种方式哪种方式更好(不易出错且更优雅)?

    感谢。

4 个答案:

答案 0 :(得分:3)

我个人会做两个重载方法。主要原因是:

  

但我无法确保validationParameters或possibleValues(其中一个)获得了值。

在我看来,可选参数应该是:可选。制作两个可选参数,其中一个是必需的,这似乎是一个有问题的设计选择。

避免这种情况的主要原因似乎是:

  

但这需要用户不合情理地。

但是,我没有看到问题。用户将不得不构建字符串集合(我个人会使IEnumerable<string>而不是string[],或params string[] possibleValues)或ValidationParameters。如果他们已经需要构造要传递的参数,那么添加if条件似乎是不必要的(每个路径都可以调用验证)。

答案 1 :(得分:2)

如果他们通过不同的概念进行验证,那么它们的名称应该不同。比方说,ValidateByValidationParametersValidateByPossibleValues。现在问题是,为什么你不希望调用者仔细选择他正在使用哪一个?

答案 2 :(得分:0)

因为你不能要求发送其中一个,我建议使用前一个选项,但我不明白你的意思是你不喜欢用户必须“不合情理地”

答案 3 :(得分:0)

你可以重载方法 - 正如你所说 - 或做这样的事情:

       enum TYPE { VAL_1, VAL_2 }

       void function(TYPE validateType, object o)
       {
        swich(validateType)
        { 
           case VAL_1:
              List<string> par = o List<String>;
              if(par != null)
              {
                 //...
              }
           break;

           case VAL_2:
              List<MyObject> par = o as List<MyObject>;
              if(par != null)
              {
                 //...
              }
          break;
        }
  }

也许它不是非常类型安全,但是对于somteimes很有用。

最后 - 您可以为每个验证案例准备单个委托方法,并在一个地方调用这些方法(单个或多个)。