8

我使用 C# 工作,因此我将其发布在 C# 下,尽管这可能是一个可以用任何编程语言回答的问题。

有时我会创建一个方法来执行诸如将用户登录到网站之类的操作。我经常从该方法返回一个布尔值,但这通常会导致问题,因为布尔返回值不传达任何上下文。如果在登录用户时发生错误,我无法知道是什么导致了错误。

这是我当前使用的方法的示例,但想更改以使其返回的不仅仅是 0 或 1。

public bool LoginToTwitter(String username, String password)
{
    // Some code to log the user in
}

上述方法只能返回 True 或 False。这很好用,因为我可以调用以下命令:

if(http.LoginToTwitter(username, password))
{
    // Logged in
} else {
    // Not Logged in
}

但问题是我无法知道用户未登录的原因。可能存在多种原因,例如:错误的用户名/密码组合,暂停帐户,帐户需要用户注意等。但是使用以下方法,并且逻辑,这是不可能知道的。

我有什么替代方法?

4

6 回答 6

8

您可以选择抛出带有相关消息的异常(并让调用方法处理异常),或者让函数返回enum具有不同状态的 an(例如LoginState.SuccessLoginState.IncorrectPassword等)。

如果您使用异常,最好让您的函数不返回任何内容 ( public void LoginToTwitter),但如果您使用的是enum,请确保将返回类型设置为您的enum( public LoginState LoginToTwitter) 名称。

于 2013-07-21T19:54:27.597 回答
8

您可以创建并返回enum具有预期 LoginResults 的值。

public enum LoginResult
{
   Success,
   AccountSuspended,
   WrongUsername,
   WrongPassword,
}

然后在您的方法中使用枚举类型返回:

public LoginResult LoginToTwitter(String username, String password)
{
    // Some code to log the user in
}
于 2013-07-21T19:53:51.570 回答
6

有两种标准方式。如果您只对结果感兴趣,而不对任何元数据感兴趣,请返回一些枚举。将可用值设置为SuccessSuspended等(所有可能的结果)

如果您需要更多详细信息,您可以随时使用异常。基本上遵循“告诉,不要问”的想法,并以一种仅在成功时返回所需值(例如用户 ID?或者如果您有一些全局登录状态,则可能没有)的方式编写您的函数,并引发详细的异常否则说明故障。关于层次结构本身,您很可能应该LoginException使用一些更具体的子类来实现 a 并只捕获那些。(它可以很容易地验证所有相关的异常都得到了处理,并且所有未知的异常都被传递到更高的级别)

于 2013-07-21T19:56:11.263 回答
3

正如其他答案中所建议的那样,返回枚举或抛出异常都是合理的。但我的偏好是返回异常。听起来很疯狂,但它让你的调用者决定是使用错误检查还是异常处理。而且,与枚举不同,异常是分层的,因此它可以更轻松地处理整个故障类别,并且可以携带任意额外数据。

我认为 Sayse 也有类似的想法,但他删除了他的答案,也从未真正解释过。

于 2013-07-21T20:10:00.287 回答
0

您可以使用 c 中经常使用的成语。赋值表达式的结果是表达式本身 - 这意味着您可以在评估结果代码是否为特定值的同时捕获结果代码:

if ((status = DoSomething()) == AnErrorEnum.NotAnError)
{//success handler
}
else
{//failure handler
}

我被要求提供 MSDN 文章的链接 - 这是规范的旧版本:http: //msdn.microsoft.com/en-us/library/aa691315 (v=vs.71).aspx

“简单赋值表达式的结果是分配给左操作数的值。结果与左操作数具有相同的类型,并且始终被归类为值。”

于 2013-07-21T20:40:11.123 回答
0

根据干净的代码趋势,您应该为您的方法提供一个有意义的名称,以揭示意图。

要知道如果无法完成日志记录操作会发生什么,您可以在流程中引入Exceptions并在调用者上下文中处理它。

http://msdn.microsoft.com/en-us/library/ms173160(v=vs.80).aspx

于 2013-07-21T19:59:25.830 回答