这是关于方法块结构的一般问题。鉴于以下两种替代方案,有没有人对什么是更好的设计方法有意见?
private void Method1()
{
if (!A)
{
return;
}
if (!B)
{
return;
}
if (!C)
{
return;
}
// DO WORK.......
return;
}
private void Method2()
{
if (A)
{
if (B)
{
if (C)
{
// DO WORK.......
return;
}
}
}
return;
}
答案 0 :(得分:10)
我更喜欢方法1,即“提前退出”方法。在我看来,它更清楚。我真的试图避免许多嵌套的'if'语句。
另外,你不能在void方法中返回'null':)
答案 1 :(得分:4)
个人偏好。
我想我会更喜欢这样做:
if(A && B && C) {
// Do Work...
return;
}
答案 2 :(得分:2)
第一种方法值得商榷 - 个人偏好有多个条件或单个OR。
然而,第二种方法是坏的,坏的,坏。单个方法中的多个缩进级别只是要求错误 - 可维护性和可读性都会下降。众所周知,widely written about and documented。
答案 3 :(得分:2)
在完成任何有用的工作之前,以三个if语句开头的方法具有明显的污垢代码气味。
如果你的方法以一串if语句开头,请暂停一下,重新计算,然后继续。
或许switch
语句比if语句字符串更好。
答案 4 :(得分:1)
您正在交易返回语句的标签。你打电话。
我个人喜欢C ++的#2,你正在处理自动释放对象(例如CComPtr,AutoPtr等),但在C#中没有必要这样做。我倾向于使用C#的第一个例子,因为你有垃圾收集,你可以少担心确保你在早期退出时清理所有内容。
答案 5 :(得分:1)
我会走出一条腿,说这可能是代码味道。我不认为应该教条地遵循旧的“唯一退出”编码哲学,但方法中的许多退出点可能与深度嵌套的IF语句一样,都是维护噩梦。
当看到其中任何一个时,重构灯应该遍布整个地方。
答案 6 :(得分:1)
我倾向于尝试使用看起来相当容易阅读的东西:
private void Method1()
{
if (!A ||
!B ||
!C)
{
return;
}
else if(D)
{
return y;
}
// DO WORK...
return X;
}
但正如其他人提到的那样,除非你的工作场所指定了一个高于其他标准的标准,否则它完全是个人的首选。
答案 7 :(得分:1)
前置条件逻辑可以分解为单独的方法:
private Boolean CanContinue()
{
return A && B && C;
}
private void Method1()
{
if (CanContinue())
{
// Do work...
}
}
这有几个好处:
答案 8 :(得分:0)
怎么样:
if(A && B && C)
{
//Do work
}
return;
或
if(!A || !B || !C)
{
return;
}
//Do work
答案 9 :(得分:-1)
嗯,首先,void方法不能返回值,但假设你要返回一个int?。
private int? method3 ()
{
int? retVal;
if (A && B && C)
{
// do work
retVal = x;
}
return retVal;
}