API设计问题

时间:2009-12-22 09:35:52

标签: api

我的API定义如下

bool IsValid()

现在,我想修改API,以便如果返回值为false,那么我需要额外的 验证验证失败的原因 我正在寻找一个优雅的想要解决问题......以下是我的选择

选项1:
bool IsValid(ref string errorMessage)

仅当结果为false时才更新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.

我对上面列出的任何选项都不满意。所以,想知道是否有任何我可能不知道的优雅解决方案

问候 ģ

5 个答案:

答案 0 :(得分:4)

您的可能错误消息是固定的吗?在这种情况下,我将在枚举中定义它们,然后创建一个返回枚举类型值的Validate()方法。这样做的另一个好处是,如果您需要向用户显示消息,您可以轻松使用本地化消息。

答案 1 :(得分:3)

我会去

int IsValid();

string GetErrorString(int id);

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

ValidCode IsValid();

string GetErrorString(ValidCode code);

其中ValidCode是枚举

答案 2 :(得分:1)

如果你必须使用“string isValid()”,那么方法会在成功时返回null或空字符串,否则会出现某种错误信息。

我个人永远不会这样做。让API做不止一件事会增加复杂性。

答案 3 :(得分:0)

如果您使用的是动态类型语言,则可以执行以下操作:

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

但是,我真的会选择异常方法。它是标准的,可以在失败代码之上的任何级别进行处理。

答案 4 :(得分:0)

以防万一你想坚持使用选项3:在错误输入验证失败的情况下,validate()不应抛出异常。在特殊情况下应该抛出异常,而不是在您可能期望错误输入的情况下抛出异常。所以我会按照以下方式设计它

ValidationResult Validate()

其中ValidationResult可能是

class ValidationResult
{
   bool IsValid;
   string Message;
}

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

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