use*_*181 8 php expression if-statement ternary
当我偶然发现一个类似于此的构造时,我正在重构一些旧代码:
// function bar() returns a value
// if the value is an instance of customException class, terminate with error code
// else process the regular data
$foo = bar();
checkForException($foo) && exit($foo->errorCode());
process($foo);
Run Code Online (Sandbox Code Playgroud)
虽然它看起来很奇怪,但是它要短得多
$foo=bar();
if(checkForException($foo)) {
exit($foo->errorCode();
}
else {
process($foo);
}
Run Code Online (Sandbox Code Playgroud)
并且稍微更具可读性(至少在最初的惊喜之后)
$foo=bar();
(checkForException($foo)) ? exit($foo->errorCode()) : process($foo);
Run Code Online (Sandbox Code Playgroud)
虽然较短的代码并不一定意味着更易读的代码,但我发现这是在上面两种"标准"方式的中间.
换句话说,而不是
if($foo) {
bar();
}
else {
// there is no real reason for this to exist, since
// I have nothing to write here, but I want to conform
// to the general coding practices and my coding OCD
}
Run Code Online (Sandbox Code Playgroud)
人们可以简单地写
$foo && bar();
Run Code Online (Sandbox Code Playgroud)
那么这个没有多大用处的原因是什么?它可以简单到"不要重新发明轮子,写出更可读的if/else,如果你真的想缩短它,这就是三元运算符的用途"?
编辑:请记住,上面的代码很快从原始代码派生而来,只是一个使用"短路"代码的例子.如果可以的话,请不要建议改进代码,因为这不是问题的理想结果.
例2
userCheckedTheBox($user) && displayAppropriateInfo();
Run Code Online (Sandbox Code Playgroud)
虽然$foo && bar();代码行数较少,但可读性较差.使代码易于理解通常比减少总LoC更重要.即使你不是在一个有多个程序员的环境中工作,你也必须在将来的某个时候回来阅读你的代码,你可能无法记住每一行的基本原理是什么.代码(Eagleson定律).
通常,您应该将这些类型的语句的使用限制在程序员的意图绝对清楚的情况下.在我看来,使用代码来测试条件和代码是非常糟糕的做法,这些代码在同一语句中主动修改程序的当前状态.
以下是此类代码的一种可接受用途:
$isValidUser = $userName && usernameIsValid();
Run Code Online (Sandbox Code Playgroud)
在这里,&&运算符的两端都在测试一个条件,右侧调用函数来执行此操作不会损害代码的可读性.
我认为有一种古老的技术在通过修改 Perl 脚本来显示错误时很流行。伪代码:
myFunction( ) || exitWithError( "Uh-oh" )
Run Code Online (Sandbox Code Playgroud)
当在最后期限内编码时,并且当用户界面不需要很出色时,这是避免错误的快速方法。
这种样式在 javascript 中也很流行用于默认参数:
function myfunction(foo) {
foo = foo || 0;
// note that a non-zero default won't work so well,
// because the user could call the function with 0
}
Run Code Online (Sandbox Code Playgroud)
对于空检查:
var bar = foo && foo.property;
Run Code Online (Sandbox Code Playgroud)
我发现一旦你习惯了它,它就非常易读并且通常比if/else或更直观?:。但你应该只在有意义的时候使用它。在任何地方使用它都会变得非常混乱。例如,在您的示例中,您不应该使用它。我个人用它来进行简单的错误检查和一些默认值。在大型项目中,发生错误时您几乎总是希望执行更多操作,因此在这些情况下您不应该使用此方法。
另外你应该小心;这只适用于具有短路评估的语言(http://en.wikipedia.org/wiki/Short- Circuit_evaluation)。有时and和or是短路的,而&&和||不是。
myfunction() or die("I'm melting!");写得也挺满意的。
最后,空else块通常是我以前从未见过或听过任何人推荐的东西。这对我来说似乎毫无意义。对于您的示例来说,最易读的选项非常简单:
if( $foo ) {
bar( );
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
683 次 |
| 最近记录: |