2009-12-22 78 views
0

我已经限定为API如下API设计问题

bool IsValid()

现在,我想修改API,这样,如果返回值是假的,那么我就需要额外
信息为何验证失败。
我在找一个优雅的要解决的问题......这里是我的选择有

选项1:如果结果是假
bool IsValid(ref string errorMessage)

的errorMessage只更新

选项2:

class Result<T> 
{ 
    bool Succeeded; 
    T Argument; 
} 

Result<string> IsValid() 

选项3:

void Validate(); 
//throw an exception if it invalid, just return if succeeded. 

我不喜欢上面列出的任何选项。所以,如果有任何优雅的解决方案,我可能不知道的

问候 摹

回答

4

是你的可能的错误消息一组固定的疑惑?在这种情况下,我会在枚举中定义它们,然后创建返回枚举类型值的Validate()方法。这具有额外的优点,如果您需要向用户显示消息,则可以轻松使用本地化的消息。

+0

是的,这听起来比我所拥有的更好。 – SapphireSun 2009-12-22 09:41:36

0

如果您正在使用动态类型语言,你可以这样做:

def IsValid(): 
    if condition: 
     return (True, "") 
    else: 
     return (False, "error message") 

不过,我真的泉水为例外方法。它是标准的,可以在失败代码之上的任何级别上进行处理。

+0

我会说在这种情况下使用异常是矫枉过正。无论如何,如果提供了伴随* TryValidate *方法,这是可以接受的,但是接下来我们将回到原来的问题。 – Konamiman 2009-12-22 09:53:55

3

我会去

int IsValid(); 

string GetErrorString(int id); 

或者如果可以的话,更好的是:

ValidCode IsValid(); 

string GetErrorString(ValidCode code); 

其中ValidCode将是一个枚举

1

如果你必须你可以使用“字符串的isValid ()“方法将在成功时返回null或空字符串,否则返回某种错误消息。

虽然我不会那么做。让API不止一件事增加了复杂性。

0

以防万一你想坚持选项3:validate()不应该因为输入错误而导致验证失败时抛出异常。在特殊情况下应该抛出异常,而不是在可能出现错误输入的情况下。所以,我将在下面的方式设计它

ValidationResult Validate() 

其中的ValidationResult可能是

class ValidationResult 
{ 
    bool IsValid; 
    string Message; 
} 

验证方法时才抛出一个异常时,它是无法验证,例如当它必须在数据库中查找值时,但无法建立连接。

编辑:哇。没有看到帖子的日期....猜猜我有点晚了...