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
}
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函数返回布尔值,而且我不太喜欢输出参数。如果函数没有返回连接状态,您可能必须编写一个断开连接的函数/属性(取决于您的样式),以允许有人检查它,因此它保存了一个步骤
就预期而言,让调用代码捕获异常,这将迫使调用方注意: 我同意不能建立连接(在大多数情况下)不应被视为例外情况。然而,强迫用户为错误字符串等提供参数也不好。其他可能的解决办法:
我同意这个答案。通常情况下,无法连接到某个对象被视为例外情况,并且在整个.NET框架(ADO.NET、WCF)中都会被视为例外情况。返回成功/错误消息对是老式的Windows API风格的编程——使用try/catch处理强类型异常要好得多(这是惯例)。如果你有可以使用的工具,你应该使用它们。我喜欢这种方法。这确实让事情变得很清楚。我认为将TyConnect(…)方法与FooVaDIIL的自定义返回类型的建议结合起来是我将要做的。如果您的连接很短,您也可以考虑返回IDISPISTABLE,这样可以轻松地清除连接:使用(var连接=Connect(…)){/ /使用连接}。