zoukankan      html  css  js  c++  java
  • 编程规范之 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
  • 相关阅读:
    SQL SERVER 如何处理带字母的自增列--【叶子】
    实现对数据进行分组小计并计算合计的实例 asp.net
    sql 随笔
    事务
    游标
    触发器
    Session的生命周期
    ASP.NET 推荐书籍
    asp.net 查询本地excel 获取信息
    使用DotNetZip压缩与解压缩
  • 原文地址:https://www.cnblogs.com/code-style/p/3503787.html
Copyright © 2011-2022 走看看