6

好的,这可能有点 hack,但请耐心等待:) 背景是我厌倦了一些 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));

所以我想有两个问题,这可以以某种方式完成吗?我对如何通过调用方法进行有条件的返回感到困惑。

另一个问题是,这是个好主意吗?像这样对语言进行猴子补丁有点奇怪,但我更喜欢代码的读取方式。如果可以将其放入方法上方的属性中,我会更干净: [Require(IsOpenFilter(inputStr))]

4

2 回答 2

8

我同意安德斯的观点:颠倒条件并早日返回。当您需要在该返回点明确地进行大量资源清理时,“单个返回点”曾经很有价值;有了finally块、using语句和垃圾收集,它甚至不再是一个有用的指南,IMO。每当您发现自己做某事只是为了获得一个返回点时,请考虑它是否实际上使代码更具可读性。

我几乎总是发现,如果在代码中的某个时刻我知道返回值并且在方法中没有我想采取的其他操作,最好的办法是立即返回。强迫读者浏览其余的方法以防万一有另一个动作既不优雅也不有用,IMO。

我认为一个方法不能表明它应该导致调用者返回是一件好事——这种能力听起来像是一场可读性的噩梦。话虽如此,我考虑了一种新的条件返回语句:

return? expression;

expression如果它是非空的,这将返回评估值;您可以将其用于不可为空的类型,如下所示:

int Foo()
{
    return? Bar(); // Where Bar() has a return type of int?
    ...
}

基本上,它将是等效于 null 合并运算符的 return 语句。

请注意,这对您的情况没有帮助-您尽早返回 null ...

于 2010-04-03T09:19:17.330 回答
3

像这样重写你的第一个例子怎么样:

public SomeClass DoStuff(string inputStr) 
{ 
  if (!IsOpenFilter(inputStr)) 
      return null;

  SomeClass result =null; 

  // Some code .... 

  return result; 
} 

看起来您正试图在每个函数中坚持一个返回点的旧约定。简而言之:有一个返回是具有显式资源处理的语言的遗产。长篇故事可在一些旧的 SO 帖子中找到:

于 2010-04-03T08:56:56.200 回答