繁体   English   中英

connect方法应该返回一个值吗?

[英]Should a connect method return a value?

我正在查看我继承的一些代码,如果我喜欢一些代码,我无法决定。

基本上,有一个方法如下所示:

bool Connect(connection parameters){...}

如果成功连接则返回true,否则返回false。

我过去曾编写过这样的代码,但现在,当我看到这种方法时,由于种种原因,我不喜欢它。

  1. 它很容易编写代码,只是忽略返回的值,或者没有意识到它返回一个值。

  2. 无法返回错误消息。

  3. 检查方法的返回并不是很好看:

    if(!Connect(...)){....}

我可以重写代码以在它没有成功连接时抛出异常,但我不认为这是一种特殊情况。 相反,我正在考虑重构代码如下:

void Connect(Connection Parameters, out bool successful, out string errorMessage){...}

我喜欢其他开发人员必须提供成功和错误字符串,以便他们知道该方法有错误条件,我可以知道返回一条消息

有人对此事有任何想法吗?

谢谢 - 马特

我会选择异常与out参数。 如果您希望班级的消费者关心,请让他们关注异常,或者让他们独自一人。 通过使用输出参数,你只是让他们的生活更加不方便,如果他们没有通过让他们使用一次性变量来照顾。 还要考虑一下,如果你的函数已经存在,那么如果更改签名(而不是提供额外的重载),则会引入重大更改。

程序员期望在错误情况下出现异常,特别是在C#等语言中。 我们受过训练。

我只有一个意见,所以要考虑它的价值。

一个名为“Connect”的方法就是一个订单。 这就像给一个士兵,“跳”或“拍”。 你不希望士兵报告,除非他无法完成订单,这将是一件罕见的事情。

因此,我倾向于没有这种方法的返回值,但如果有可能在常规使用该方法时会出现故障,那么我构建第二个方法,名为TryXYZ,返回一个bool,并且如果必要的话,向我提供任何XYZ作为输出参数的结果。

这遵循.NET BCL中各种数字类型的Parse方法所规定的标准。

所以在你的情况下,我可能会:

void Connect(connection parameters);
bool TryConnect(connection parameters, out status);

好的是,如果你正确地构建TryConnect方法,Connect变得非常容易。

例:

public bool TryConnect(string connectionString, out ConnectionStatus status)
{
    ... try to connect
    ... set status, and return true/false
}

public void Connect(string connectionString)
{
    ConnectionStatus status;
    if (!TryConnect(connectionString, out status))
        switch (status)
        {
            case ConnectionStatus.HostNotFound:
                throw new HostNameNotFoundException();
            ...
        }
}

我不希望我的命令没有完成,但从某种意义上说,他们可能,我想要明确它。

我看到了你的观点,但要添加我的2c。

我通常不是输出参数的粉丝。 如果需要从函数中返回多个值,请重新评估函数正在执行的操作,在大多数情况下,多个返回值表示方法执行的操作太多。 在你的情况下,它是合法的,将从你的connect方法返回一个复杂的类型(超出一个简单的布尔值)。

我赞成从connect方法返回一个自定义类型,它存储所有相关信息而不是多个输出参数。 考虑未来的可扩展性,如果您需要在未来包含更多信息,该怎么办? 添加额外的输出参数是一个重大变化

此外,我倾向于不同意强制用户为所有状态数据提供内存分配。 有时我不关心成功消息(也许我只关心它是否有错误)在这种情况下必须通过两个输出参数是一种痛苦。

我同意,但检查发布的初始方法的返回值并不理想。

我不介意Connect函数返回一个布尔值,我不是输出参数的忠实粉丝。 如果函数没有返回连接状态,你可能不得不写一个IsConnected函数/属性(取决于你的样式),以允许某人检查它,这样就省了一步。

就预期而言,让异常被调用代码捕获,这将迫使调用者关心。 :)

我同意不建立联系(在大多数情况下)不应被视为特殊情况。 但是,强制用户为错误字符串等提供参数也不是很好。 其他可能的方案:

  1. 使用日志记录 缺点是消息被写入日志但不能(没有太多努力)可用于调用者。
  2. 使用布尔返回并提供查询最后一个错误的方法(如C中的errno)。 恕我直言也不好。
  3. 重构代码,返回连接类的对象。 提供查询连接状态的方法。
  4. 返回收集所有相关信息的类的实例,即isSuccessfull(),getErrorString等。

不确定这是否比你的重构代码更好,但希望这可以给你另一个想法。

对于我的项目,我创建了一个返回最后一条错误消息的方法。

string Error = '';
bool Connect(connection parameters)
{
// do my connection here
// if there's an error set string variable Error
// This way you can set different error message depending on what you're doing
}

string lastErrorMessage(){
// return Error string
}

这样你可以这样做:

if(!connect(...))
{
string message = lastErrorMessage();
// Then do what you need here.
}

这可能不是最好的方法,但应该帮助你:)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM