关于语言不可知论:这些初学者风格的代码有什么问题?

Whats wrong with these beginner style codes?

我是一个初学者,我在读https://stackoverflow.com/questions/237241/what-coding-errors-are-a-telltale-giveaway-of-an-unexperienced-programmer。我什么都没有。

1.为什么写这样的东西会皱眉?

1
2
3
if (IsAManMan == true) {
   Console.WriteLine("It's a MAN, man!");
}

2.这个怎么办?

1
2
3
4
5
6
if (test) {
  return true;
}
else {
  return false;
}

我不写上面这样的代码。应该这样写吗:return test?或者为了可读性,我有时会把它写成return test?true:falsereturn (test==true)? true:false


在本例中:

1
2
3
if (IsAManMan == true) {
   Console.WriteLine("It's a MAN, man!");
}

在大多数语言中,if条件总是计算一个布尔表达式,这意味着IsAManMan只能是真或假。因此,与真或假比较是不必要的,因为它是隐含的。所以我们只写这个:

1
2
3
if (IsAManMan) {
   Console.WriteLine("It's a MAN, man!");
}

在这个例子中:

1
2
3
4
5
6
if (test) {
  return true;
}
else {
  return false;
}

在上面的例子中,这意味着test只能是对的或是错的,就像是说:

1
2
3
4
5
6
if (true) {
  return true;
}
else { // If it's not true, it's false
  return false;
}

这又是不必要的冗长代码,所以我们只是

1
return test;

相反。

最后,这仍然是一个偏好和可读性的问题。例如,如果您认为if (IsAManMan == true)if (IsAManMan)更容易解释,您仍然可以这样写,编译器不会介意。


这只是一个重言式。如果下雨,而且确实下雨,那么你可以(或者应该)去掉多余的比较、检查和返回。


在这两种情况下,您都在测试布尔变量的值。因为您的值已经是一个布尔值,所以不需要对true进行显式测试,因为它在if语句中是隐含的(以及包含布尔值测试的类似构造,如循环)。

例如

1
2
3
if(isAManMan == true){
    //...
}

可以计算为

1
2
3
if(true == true){ //answer: true
     //...
}

1
2
3
if(false == true){ //answer: false
     //...
}

这和刚才写的一样

1
2
3
if(isAManMan){
    //...
}

在第二个示例中,在决定返回哪个布尔值之前,您要检查另一个布尔值的值。

再一次,

1
2
3
4
5
if (test) {
  return true;
}else {
  return false;
}

可以计算为

1
2
3
4
5
if (true == true) { //returns true
  return true;
}else {
  return false;
}

1
2
3
4
5
if (false == true) { //returns false
  return true;
}else {
  return false;
}

if语句是多余的,因为变量已经保存了您想要返回的值,因此这是等效的,并且首选:

1
return test;

但是需要注意的是,您的示例是完全有效的,但是一个好的编译器会将它们优化为我给出的改进版本,因此最终归结为可读性和约定。我相信我给出的版本更具可读性,更接近普遍接受的惯例。


假设您想要返回一个布尔值,而不是第二种情况下测试的实际值。

你可以做到

1
return !!test

在大多数语言中,或类似的

1
return bool(test)

更清晰易读。


由于这被标记为语言不可知论:

有些语言的关键字可以用于变量名。在Fortran中,这是一个有效的语句:if-then-else。

如果将true定义为一个值为false的布尔变量,则所建议的速记解与更详细的解不同。首先,如果test、isaman、true和false不是布尔值,则两者都不是。

python 2.0中的真实世界示例

1
2
3
>>>True = False
>>>True
False

舌头在脸颊上。


这些代码做同样的事情。在我看来,它只是可读性。