编程规范之 if 语句的简单规则

本文分享了提高代码可读性的实用技巧,包括简化条件语句、使用逻辑运算符代替多层if语句、合理使用三元运算符等,旨在让代码如同自然语言般易于理解。
部署运行你感兴趣的模型镜像

来自:http://www.oschina.net/translate/basic-rules-for-code-readability-and-the-if-statement

很多读者都知道我对与类似 Python 和 Javascript 这样的语言的偏爱。其中一个原因就是它们的可阅读性高(好吧,除了    brainfuck  和   whitespace  ,很多语言也有这个优点)。当我们编写了一些代码之后,其它的开发者也得看上几次,例如代码审核、调试和重构。
Khiyuan
Khiyuan
翻译于 23天前

0人顶

 翻译的不错哦!

代码应该是可阅读就像你的自然语言一样。我将从一个有趣的条件语句开始。

if ( !notOk != false ) {
  userObj.ask();
}

这样的表达式有点混乱,你永远不会使用自然语言构建这样的表达式。通过几个步骤,这个问题可以很简单解决:

( !notOk != false )
( !notOk == true )
( !notOk)
现在你应该重新想一个变量名啦:
isOk = !notOk

这个结果更适合阅读:

if ( isOk ) {
  userObj.ask();
}

0595
0595
翻译于 23天前

0人顶

 翻译的不错哦!

if – if – if 层级树

删除一些注释和其他一些代码行后, 这是另一个典型的编码风格:

if ( A ) {
  if ( !B ) {
    if ( C ) {
      f();
    }
  }
}

一些聪明的程序员有较短的变体看起来像这一行:

if ( A ) if ( !B ) if ( C ) { f(); }

但使用逻辑运算符使代码更加可读的:

if ( A && !B && C ) { f(); }

如果你使用一些If层级语句重构一个函数, 可以尝试使用逻辑运算符来代替if层级树。但它应该有像自然语言一样的可读性。

0595
0595
翻译于 23天前

0人顶

 翻译的不错哦!

小心而使用与(&)和或比较整数! 单个 & 在多数编程语言里是按位与(AND)操作符。

请看下面的例子:

ANSI-C:
1 & 2 = 0
1 && 2 = 1 // true, 并且true 等于1

JavaScript:
1 & 2 = 0
1 && 2 = 2 // 第一个为 true, 所以返回第二个

python:
1 & 2 = 0
1 and 2 = 2 # 类似 JavaScript 的变体

Java:
1 & 2 = 0
1 && 2 // 使用int值不合法

0595
0595
翻译于 23天前

0人顶

 翻译的不错哦!

 if – true – false 赋值函数
function isNameSet(name) {
  if (name===null || name==="") {
    return false;
  } else {
    return true;
}

有时这种结构隐藏在多行代码里面, 其它一些语言也可以找到类似的结构。 但下面这个简单的形式是更优雅的解决方案, 也很好理解:

function isNameSet(name) {
  return !(name==null || name=="");
}


0595
0595
翻译于 23天前

0人顶

 翻译的不错哦!

但你只想看看名字的值是否已经声明。 很多语言,例如 Javascript (阅读   Matthias Reuter 写的   all about types)能将值直接转换为真值(阅读   Douglas Crockford 写的   The Elements of JavaScript Style  )。
function isNameSet(name) {
  return name;
}

在代码简无可减后,在判断中直接使用字符串值。

if (!name) {
  name = window.prompt("What’s your name?");
}
Khiyuan
Khiyuan
翻译于 23天前

0人顶

 翻译的不错哦!

使用三元运算符(小心)
function genderStr(gender) {
  if ( gender == "m" ) {
    return "male"; 
  } else {
    return "female";
  }
}

程序也可以总结为:

function trueFalseStr(cond, trueStr, falseStr) {
  if (cond) {
    return trueStr;
  } else {
    return falseStr;
  }
}

或者你可以使用三元运算符(很多语言都有提供):

return (gender == "m")? "male" : "female"

对于 python(v2.5版本之后)可以用下面的语法替代 '?'运算符:

return "male" if gender == "m" else "female"

另一个可用的变体同样可读性很高:

return (gender=="m") and "male" or "female"

Khiyuan
Khiyuan
翻译于 23天前

0人顶

 翻译的不错哦!

yoda 条件

我提供一篇旧文章帮助你理解什么是 yoda conditions. 下面的例子显示它们的不同之处:

if (value = 42) {
   ...
}

为了防止条件式赋值,通常把常量写在前面(这样会得到一个编译时警告):

if (42 = value) {
   ...
}

在 yoda conditions 里, 我不得不收回关于代码可读性的建议。

0595
0595
翻译于 23天前

0人顶

 翻译的不错哦!

其它翻译版本(1)
利用if语句映射值

我在 stackoverflow.com 看到一篇好文:

function norm(v) {
  size = 7;
  if ( v > 10 ) size = 6;
  if ( v > 22 ) size = 5;
  if ( v > 51 ) size = 4;
  if ( v > 68 ) size = 3;
  if ( v > 117 ) size = 2;
  if ( v > 145 ) size = 1;
  return size;
}

其中有很多变体,下面这个以 Javascript 用三元操作符编写的程序可读性很差:

function norm(v) {
  return return v > 145 ? 1 : v > 117 ? 2 : v > 68 ? 3 : v > 51 ? 4 : v > 22 ? 5 : v > 10 ? 6 : 7;
}

下面这个 ANSI C 编写的计算。只有当值能够转换为布尔量时才能运行。

int norm(int x){
  return 7 - (x>10) - (x>22) - (x>51) - (x>68) - (x>117) - (x>145);
}

If语句能够使的条件限定更加可读(python):

def norm(v):
    if   v< 11: size=7
    elif v< 23: size=6
    elif v< 52: size=5
    elif v< 69: size=4
    elif v

且现在变体可以写成 list 形式的(好吧,虽然可读性没有变好,但是很好玩):

def norm(v):
    return 1+len([x for x in [11, 23, 52, 69, 118, 146] if v

Khiyuan
Khiyuan
翻译于 23天前

0人顶

 翻译的不错哦!

我的总结:

尽量像阅读小说一样阅读你的代码。 代码应该有一个简单的说明,然后循序渐进。 如果想深入了解代码整洁之道,请参考这些书籍

0595
0595
翻译于 23天前

1人顶

 翻译的不错哦!

其它翻译版本(1)

您可能感兴趣的与本文相关的镜像

PyTorch 2.6

PyTorch 2.6

PyTorch
Cuda

PyTorch 是一个开源的 Python 机器学习库,基于 Torch 库,底层由 C++ 实现,应用于人工智能领域,如计算机视觉和自然语言处理

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值