C# connect方法是否应该返回一个值?

C# connect方法是否应该返回一个值?,c#,coding-style,C#,Coding Style,我正在看一些我继承的代码,我无法决定是否喜欢一些代码 基本上,有一种方法如下所示: bool Connect(connection parameters){...} 如果连接成功,则返回true,否则返回false 我以前也写过这样的代码,但是现在,当我看到这个方法时,我不喜欢它,原因有很多 编写只忽略返回值或未意识到返回值的代码很容易 无法返回错误消息 string Error = ''; bool Connect(connection parameters) { // do my conn

我正在看一些我继承的代码,我无法决定是否喜欢一些代码

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

bool Connect(connection parameters){...}
如果连接成功,则返回true,否则返回false

我以前也写过这样的代码,但是现在,当我看到这个方法时,我不喜欢它,原因有很多

  • 编写只忽略返回值或未意识到返回值的代码很容易

  • 无法返回错误消息

  • 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
    }
    
  • 检查方法的返回看起来并不太好:

    如果(!Connect(…){…}

  • 我可以重写代码,当它没有成功连接时抛出异常,但我不认为这是一个异常情况。相反,我考虑按如下方式重构代码:

    void Connect(Connection Parameters, out bool successful, out string errorMessage){...}
    
    我喜欢其他开发人员必须提供成功和错误字符串,以便他们知道方法有错误条件,并且我可以知道返回消息

    有人对这件事有什么想法吗

    谢谢
    -Matt

    我会选择异常,而不是
    out
    参数。如果你想让你所在阶层的消费者关心你,就让他们关心例外,否则就别理他们。通过使用out参数,如果他们不必在意,你只会让他们的生活变得更加不方便,让他们使用一次性变量。同样,如果你的函数已经在野外,如果你改变了签名(而不是提供额外的过载),你会引入一个破坏性的改变。p>
    程序员希望在错误情况下出现异常,特别是在C#等语言中。我们受过训练

    我明白你的观点,但要补充我的观点

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

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

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


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

    我只有一个意见,所以请认真考虑它的价值

    名为“Connect”的方法是一个order。这就像给一个士兵,“跳”或“射”。除非士兵无法完成命令,否则你不会期望他回来报到,这将是一种罕见的情况

    因此,我倾向于没有此类方法的返回值,但如果有可能在定期使用该方法的情况下出现故障,那么我将构建第二个方法,名为TryXYZ,返回bool,并在必要时向我提供任何XYZ作为out参数的结果

    这遵循.NETBCL中各种数字类型的解析方法所规定的标准

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

    void Connect(connection parameters);
    bool TryConnect(connection parameters, out status);
    
    很好的一点是,如果正确构建TryConnect方法,那么连接就变得非常容易

    例如:

    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();
                ...
            }
    }
    

    我不希望我的命令不能完成,但从某种意义上说,它们可能会完成,我想明确地说明这一点。

    不确定这是否比您的重构代码更好,但希望这能给您提供另一个想法

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

    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.
    }
    

    这可能不是最好的方法,但应该对您有所帮助:)

    我不介意Connect函数返回布尔值,而且我不太喜欢输出参数。如果函数没有返回连接状态,您可能必须编写一个断开连接的函数/属性(取决于您的样式),以允许有人检查它,因此它保存了一个步骤


    就预期而言,让调用代码捕获异常,这将迫使调用方注意:

    我同意不能建立连接(在大多数情况下)不应被视为例外情况。然而,强迫用户为错误字符串等提供参数也不好。其他可能的解决办法:

  • 使用日志记录。缺点是消息会写入日志,但调用者(不费吹灰之力)不可用
  • 使用布尔返回并提供查询最后一个错误的方法(如C中的errno)。我也不好
  • 重构代码,返回连接类的对象。提供查询连接状态的方法
  • 返回收集所有相关信息的类的实例,如isSuccessfull()、getErrorString等

  • 我同意这个答案。通常情况下,无法连接到某个对象被视为例外情况,并且在整个.NET框架(ADO.NET、WCF)中都会被视为例外情况。返回成功/错误消息对是老式的Windows API风格的编程——使用try/catch处理强类型异常要好得多(这是惯例)。如果你有可以使用的工具,你应该使用它们。我喜欢这种方法。这确实让事情变得很清楚。我认为将TyConnect(…)方法与FooVaDIIL的自定义返回类型的建议结合起来是我将要做的。如果您的连接很短,您也可以考虑返回IDISPISTABLE,这样可以轻松地清除连接:使用(var连接=Connect(…)){/ /使用连接}。