我已经用C语言编程了几十年了.在某个地方,我决定不再想写:
if (var) // in C if ($var) # in Perl
当我的意思是:
if (var != 0) if (defined $var and $var ne '')
我认为部分原因是我有一个强类型的大脑,在我看来,"if"需要一个布尔表达式.
或者也许是因为我使用Perl这么多,Perl中的真相和虚假就是这样一个雷区.
或者也许只是因为这些天,我主要是一名Java程序员.
你有什么偏好?为什么?
我if
大声朗读时喜欢我的意思:
if (is_it_happening) ... if (number_of_sheep != 0) ... if (pointer_to_something != NULL) ...
我更喜欢
if (var != 0)
它更容易阅读/理解.由于您只编写了一次代码但是阅读了很多次,因此轻松阅读比简单编写更重要.
这很简单. if( var )
测试真实性. if( var != 0 )
测试它不是数字0.它们 不是可交换的! 有三个原因.
首先,if( var != 0 )
用来检验真相更复杂.还有更多东西可供阅读和理解.你必须克服这个!=
并且0
是"是真的"的成语.由于缺乏独特的视觉模式,你必须多做一点研究才能知道它与它不一样if( var == 0)
.这是一个很薄的区别,但值得一提.if( 0 != var )
风格存在的事实让人信服.最好只是消除问题并if( var )
用于真实性.
其次,更重要的是,意图必须明确.您是在测试真相还是在测试一些(或缺少)? if( var )
正在测试真相,if( var != 0 )
正在测试一个数字.要确定任何其他内容,需要了解作者的风格,我们必须假设维护程序员没有.
第三,这里假设真假和数字运算符的值可能在某些语言中有效,而在其他语言中则不然.在Perl中,我认为Javascript也是空字符串是假的.很多运算符返回空字符串为false.所以测试真相if( var != 0 )
会导致警告.当你做一些更天真的事情时,它变得更加明显,就像if( var == 1 )
真理一样,这是一个明显危险的假设.我似乎有很多初级程序员写这个,然后编写函数返回奇数但真实的数字来惩罚这类事情.或者当我心情愉快的时候,我已经清理了我的回报价值return var ? 1 : 0
.
在相关的说明中,Perl将从子例程返回最后一个计算的表达式,因此没有必要实际写入return
.将此与人们认为明显return
较慢的想法相结合,你会让很多人滥用这个事实.
sub set { my( $self, $key, $value ) = @_; $self->{$key} = $value; }
set
会回来的$value
.这是有意的吗?我不知道.我所知道的是有人会开始依赖它.维护程序员不知道他们是否可以改变它.所以我喜欢在每个非平凡的子程序中明确地返回一个.
sub set { my( $self, $key, $value ) = @_; $self->{$key} = $value; return; }
在那种情况下,我决定set
暂时不返回任何内容,这个决定对读者和用户都很清楚.
if (var)
少打字,只要你确定你没有测试错误的东西.
我更喜欢显式测试,除非括号内的结果是显式布尔值.短语"if(1)"虽然在语法上在语法和语义上是正确的,但却不符合逻辑.它应该是真或假,不是自动投射.
我喜欢可读的逻辑代码,以减少任何一天的输入.
我也鄙视形式的强烈代码:
if (gotError == FALSE) ... if (isComplete == TRUE) ...
如果布尔值被正确命名(并且它应该是),那么正确的方法是:
if (!gotError) ... if (isComplete) ...
那是因为(使用reductio ad absurdum)boolVal == TRUE
只是另一个布尔值,所以你在哪里停止?
if (isComplete == TRUE) ... if ((isComplete == TRUE) == TRUE) ... if (((isComplete == TRUE) == TRUE) == TRUE) ... if ((((isComplete == TRUE) == TRUE) == TRUE) == TRUE)...
等等,无限的.
我会说如果你比较一个真正的整数,那么永远不要隐式转换为布尔值,因为它暗示了变量的不同含义.
但是那种风格如此受欢迎可能并不是一件大事,但是从我与C#的合作中,我用这种风格编写了我的C++代码:
布尔或int基本上是布尔值:
if (val)
超过true/false的真正整数很重要:
if (val != 0)
某种指针:
if (val != NULL)
但是,正如许多人会说的那样,编码样式没有任何功能差异,最好是保持一致,如果你正在使用现有的代码,那就要与代码保持一致.
在Perl if (defined $var and $var ne '')
和if( $var)
不相等.尝试一下$var=0
.相反,如果您测试$var!=0
所有无法转换为数字的字符串将无法通过测试(如果您打开它们会发出警告).
因此,您必须确切知道您的变量包含的内容(数字或字符串,是否可以undef
),以便您可以进行相应的测试.
我通常只是写if( $var)
,让Perl照顾它.我相信这更容易阅读,这是Perl中最常见的风格.
通常,实际上,正确的测试最终会成为if( defined $var)
.这就是perl的新(5.10)//
运算符派上用场的地方.$var= $val // $default
或经常$var //= $default
,只有(resp )$var
才会收到.$default
$val
$var
undef