编程规范之 if 语句的简单规则
原文:
http://www.oschina.net/translate/basic-rules-for-code-readability-and-the-if-statement
代码应该是可阅读就像你的自然语言一样。我将从一个有趣的条件语句开始。
if ( !notOk != false ) {
userObj.ask();
}
这样的表达式有点混乱,你永远不会使用自然语言构建这样的表达式。通过几个步骤,这个问题可以很简单解决:
( !notOk != false )
( !notOk == true )
( !notOk)
现在你应该重新想一个变量名啦:
isOk = !notOk
这个结果更适合阅读:
if ( isOk ) {
userObj.ask();
}
if – if – if 层级树
删除一些注释和其他一些代码行后, 这是另一个典型的编码风格:
if ( A ) {
if ( !B ) {
if ( C ) {
f();
}
}
}
一些聪明的程序员有较短的变体看起来像这一行:
if ( A ) if ( !B ) if ( C ) { f(); }
但使用逻辑运算符使代码更加可读的:
if ( A && !B && C ) { f(); }
如果你使用一些If层级语句重构一个函数, 可以尝试使用逻辑运算符来代替if层级树。但它应该有像自然语言一样的可读性。
小心而使用与(&)和或比较整数! 单个 & 在多数编程语言里是按位与(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值不合法
if – true – false 赋值函数
function isNameSet(name) {
if (name===null || name==="") {
return false;
} else {
return true;
}
有时这种结构隐藏在多行代码里面, 其它一些语言也可以找到类似的结构。 但下面这个简单的形式是更优雅的解决方案, 也很好理解:
function isNameSet(name) {
return !(name==null || name=="");
}
但你只想看看名字的值是否已经声明。 很多语言,例如 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?");
}
使用三元运算符(小心)
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"
yoda 条件
我提供一篇旧文章帮助你理解什么是 yoda conditions. 下面的例子显示它们的不同之处:
if (value = 42) {
...
}
为了防止条件式赋值,通常把常量写在前面(这样会得到一个编译时警告):
if (42 = value) {
...
}
在 yoda conditions 里, 我不得不收回关于代码可读性的建议。
利用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
编程规范之 if 语句的简单规则的更多相关文章
- JAVA 编程规范
软件开发技术规范 PTHINK-DEVELOP-JAVA-091010 Java语言编程规范 2009-10-10发布 2009-10-11实施 ...
- 《C+编程规范 101条规则、准则与最佳实践》笔记
<C+编程规范 101条规则.准则与最佳实践> 0.不要拘泥于小节(了解哪些东西不应该标准化) * 与组织内现有编码规范一致即可 * 包括但不限于: - 缩进 - 行长度 - 命名规范 - ...
- Java编程规范(命名规则)
1.目的 编程规范是对编程的一种约定,主要作用是增强代码的可读性和可维护性,便于代码重用. 2.命名规则 首先要求程序中的各个要素都遵守命名规则,然后在编码中严格按照编码格式编写代码.命名规则包括以下 ...
- Fortify规则与CERT JAVA 安全编程规范的对照表
Fortify规则与CERT JAVA 安全编程规范的对照表http://www.automationqa.com/forum.php?mod=viewthread&tid=4353& ...
- JAVA 编程规范(上)
2016-03-20 J120-CHARLIEPAN JAVA 编程规范(上) 1. 应用范围 本规范应用于采用J2EE规范的项目中,所有项目中的JAVA代码(含JSP,SERVLET,JA ...
- Python编程规范(PEP8)
Python编程规范(PEP8) 代码布局 缩进 对于每一次缩进使用4个空格.使用括号.中括号.大括号进行垂直对齐,或者缩进对齐. 制表符还是空格? 永远不要将制表符与空格混合使用.Python最常用 ...
- Python 编程规范-----转载
Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -*- coding:utf-8 -*- .设置编辑器,默认保存为 utf-8 格式. ...
- 华为C语言编程规范
DKBA华为技术有限公司内部技术规范DKBA 2826-2011.5C语言编程规范2011年5月9日发布 2011年5月9日实施华为技术有限公司Huawei Technologies Co., Ltd ...
- 中兴软件编程规范C/C++
Q/ZX 深圳市中兴通讯股份有限公司企业标准 (设计技术标准) Q/ZX 04.302.1–2003 软件编程规范C/C++ 20 ...
随机推荐
- [置顶] 【Git入门之十三】Ubuntu和git
原创作品,转载请标明:http://blog.csdn.net/jackystudio/article/details/12374291 之前我们都是在Windows平台下操作git.现在我们改用Ub ...
- 主流H.264编码器对比测试 (MSU出品)
俄罗斯的MSU Graphics & Media Lab (Video Group)出品的H.264编码器性能测试报告.测试了主流的H.264编码器的性能.从测试的结果来看,开源产品x264性 ...
- Python里的map、reduce、filter、lambda、列表推导式
Map函数: 原型:map(function, sequence),作用是将一个列表映射到另一个列表, 使用方法: def f(x): return x**2 l = range(1,10) map( ...
- redis学习心得之二【redis主从配置】
在前一节我们已经实践启动了一个redis服务,我们将其作为主机,现为其创建一个从机作备份使用 1.复制一份配置出来为从机所用 ~$ cp redis/etc/redis.conf ...
- JAVAEE filter总结
1. 为什么需要filter? filter相当于客户端和服务器端之间的一扇门,就像保安一样.作用:比如说设置字符集和权限控制等等. 2. 细节; * . 只能对post请求起作用 * .可以使 ...
- Ubuntu12.04安装hadoop
1. 创建hadoop用户组和用户 a. 创建hadoop用户组 sudo addgroup hadoop b. 创建hadoop用户 sudo adduser –ingroup had ...
- 开启.htaccess重写之前先来看看mod_rewrite(转)
Apache的Mode Rewrite模块提供了一个基于正则表达式分析器的重写引擎来实时重写URL请求.在大多数情况下,它和.htaccess文件配合使用.就是说,.htaccess文件的一个主要功能 ...
- Effective C++ 总结(一)
一.让自己习惯C++ 条款01:视C++为一个语言联邦 为了更好的理解C++,我们将C++分解为四个主要次语言: C.说到底C++仍是以C为基础.区块,语句,预处理器,内置数据类型, ...
- PuTTY?Bash?Out了!!!终端应该这么玩~
由于语言的障碍,国内一直存在一个问题,就是新技术引入太慢.比如PuTTY,其实已停止维护N久了,但大部分人却仍然在用(包括之前的我).比如Bash,明知有那么多的问题,却一直没有什么想法,似乎Linu ...
- Android Studio学习随笔-移动动画的实现
在上一篇博客我已经讲述了三种事件的实现方法,而现在我用复用方法来实现控件的自动移动,当然要实现控件的移动,先得在activity_main.xml文件中放置一个控件,此处我放置的是一个button控件 ...