如何从方法中返回多种可能性中的一种

时间:2010-02-18 08:43:51

标签: c#

我有一个登录程序,可能会导致多个结果:

  • 用户未激活
  • 未知用户名
  • 密码无效
  • 有效密码

我正在考虑如何设计方法。我看到了这些选项

  • 每种可能性的一种方法(如IsUserActivated,IsUsernameKnown ..)。这似乎违反了“告诉不要问”的原则,我不知道我只是不喜欢它。

  • 为每种可能性抛出自定义异常(如UserNotActivatedException,UserUnknownException ..)。这对我来说似乎也不对。

  • 返回自定义ValidationResult类

  • 返回自定义枚举

想法? : - )

也可以随意编辑主题(和标签)

4 个答案:

答案 0 :(得分:9)

我会选择最后一个,你不需要一个完整的课程,一个枚举就够了。

但是,您是否计划告诉用户他们的密码错误?这允许黑客验证他们正在使用正确的登录,只需要找到正确的密码。更安全的选择是始终告诉用户他们的登录失败,而不是指定它是用户名还是密码。

答案 1 :(得分:2)

我会返回一个自定义枚举。这是使用Enums的教科书案例。

正如您希望每个结果在某个时间发生的那样,这些结果并不是意料之外的(即它们是预期的),因此例外只是您不需要的开销。

答案 2 :(得分:0)

如果它只是一个简单的状态,那么我肯定会选择枚举,因为枚举是自我记录的。

答案 3 :(得分:0)

我会回来:

class ValidationResult
{
    enum{ not_activated, unknown_user, invalid_password, success} status;
    String session_id; // used if the user is valid

}

并称之为:

result = login(userName, password);
if (result.status == success) then 
 ...

只要用户需要与系统交互

,就可以使用会话ID