好吧这可能是一些黑客攻击但是请耐心等待:)背景是我厌倦了一些方法,那些if语句会弄乱整个方法,例如:
public SomeClass DoStuff(string inputStr)
{
SomeClass result =null;
if (IsOpenFilter(inputStr))
{
....
}
return result;
}
所以我在想,如果我可以这样做,那不是很好吗:
public SomeClass DoStuff(string inputStr)
{
Require(IsOpenFilter(inputStr),null);
....
return result;
}
这种情况可能会被代码合同以某种形式涵盖,如果是这样,请纠正我:)
这个想法是,如果语句的计算结果为true,它将返回null。如果没有该方法的返回类型,它只是:Require(IsOpenFilter(inputStr));
所以我想有两个问题,这可以用某种方式完成吗?我对如何通过调用方法进行条件返回感到难过。
另一个问题是,这是一个好主意吗? monkeypatch这样的语言有点奇怪,但我更喜欢代码读取的方式。如果它可以放在方法上面的属性中,我会更干净:[Require(IsOpenFilter(inputStr))]
答案 0 :(得分:7)
我同意安德斯:反转条件并尽早返回。当您需要在该返回点明确地执行大量资源清理时,“单一返回点”曾经很有价值;使用finally
块,using
语句和垃圾收集它甚至都不是一个有用的指南,IMO。每当你发现自己做只是以获得单个返回点时,请考虑它是否实际上使代码更具可读性。
我几乎总能发现,如果在代码中的某个时刻我知道返回值,并且我不想在方法中采取其他操作,那么最好是立即返回。强迫读者浏览方法的其余部分以防万一,另一个动作既不优雅也不实用,IMO。
我认为方法不能表明它应该导致调用者返回是一件好事 - 这种能力听起来像是一种可读性的噩梦。话虽如此,我已经考虑了一种新的条件返回语句:
return? expression;
如果它是非空的话,这将返回expression
的评估值;您可以将它用于非可空类型,如下所示:
int Foo()
{
return? Bar(); // Where Bar() has a return type of int?
...
}
基本上它将是null语句等效的返回语句。
这对你的情况没有帮助,请注意 - 你希望早点返回null ...
答案 1 :(得分:3)
如何重写你的第一个例子:
public SomeClass DoStuff(string inputStr)
{
if (!IsOpenFilter(inputStr))
return null;
SomeClass result =null;
// Some code ....
return result;
}
看起来你正试图坚持每个函数中一个返回点的旧约定。简而言之:获得一次回报是具有明确资源处理的语言的遗产。长篇故事可以在一些旧的SO帖子中找到: