你喜欢那些让你把"then"放在"if"之前的语言吗?

Mat*_*ton 9 c# programming-languages

我今天正在阅读我的一些C#代码并找到了这一行:

if (ProgenyList.ItemContainerGenerator.Status != System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated) return;
Run Code Online (Sandbox Code Playgroud)

请注意,您可以在不滚动的情况下判断它是一个与ItemContainerGenerator.Status一起使用的"if"语句,但是如果"if"子句的计算结果为"true",则无法轻易判断该方法将在该点返回.

实际上我应该将"return"语句单独移动到一行,但是它让我想到了首先允许语句的"then"部分的语言.如果C#允许它,该行可能如下所示:

return if (ProgenyList.ItemContainerGenerator.Status != System.Windows.Controls.Primitives.GeneratorStatus.ContainersGenerated);
Run Code Online (Sandbox Code Playgroud)

这可能有点"争论",但我想知道人们对这种结构的看法.它可能有助于使像上面这样的行更具可读性,但它也可能是灾难性的.想象一下这段代码:

return 3 if (x > y);
Run Code Online (Sandbox Code Playgroud)

逻辑上我们只能返回x> y,因为没有"其他",但是我的一部分看着它并且认为,"如果x <= y,我们还在返回吗?如果是这样,我们又回来了什么?"

您如何看待"之前的if"结构?它是否以您选择的语言存在?你经常使用它吗?C#会从中受益吗?

Jon*_*eet 14

让我们重新格式化一下,看看:

using System.Windows.Controls.Primitives;

...

if (ProgenyList.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
{
    return;
}
Run Code Online (Sandbox Code Playgroud)

现在看到返回声明有多难?不可否认,在SO中你仍然需要滚动才能看到整个条件,但是在IDE中你不必......部分原因是因为没有尝试将条件和结果放在同一条线上,并且派对到期了该using指令.

现有C#语法的好处是文本顺序反映了执行顺序 - 如果您想知道将要发生什么,您可以从上到下阅读代码.

就个人而言,我不是"如果......返回"的粉丝 - 我宁愿重新格式化代码以提高可读性而不是改变顺序.


EMP*_*EMP 10

我不喜欢这种邀请的含糊之处.请考虑以下代码:

doSomething(x)
if (x > y);
doSomethingElse(y);
Run Code Online (Sandbox Code Playgroud)

它在做什么?是的,编译器可以解决这个问题,但对于程序员而言,它看起来会让人感到困惑.

  • 这是一个很好的例子,可以介绍这种模糊性.也许它只限于"回归"陈述?我不知道. (3认同)
  • 乍一看.是否有条件地执行`doSomething`或`doSomethingElse`只是放置第一个分号的位置.更容易理解为"doSomething(x); if(x> y){doSomethingElse(y); 因此,开发人员可能会自然地将其读取并弄乱一些东西.最好清楚. (2认同)

Gis*_*shu 9

是.它读起来更好.Ruby将其作为语法的一部分 - 术语为' 语句修饰符 '

irb(main):001:0> puts "Yay Ruby!" if 2 == 2
Yay Ruby!
=> nil
irb(main):002:0> puts "Yay Ruby!" if 2 == 3
=> nil
Run Code Online (Sandbox Code Playgroud)

要结束,我需要强调你需要"谨慎使用".红宝石成语是用于单行的.它可能被滥用 - 但我想这属于负责任的发展领域 - 不要通过建立限制来保护穷人,从而限制更好的开发者.


Fit*_*aki 4

对我来说它看起来很难看。现有的语法要好得多。

if (x > y) return 3;
Run Code Online (Sandbox Code Playgroud)