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
  • 相关阅读:
    Leetcode NO.110 Balanced Binary Tree 平衡二叉树
    Leetcode NO.226 Invert Binary Tree 翻转二叉树
    Leetcode NO.215 Kth Largest Element In An Array 数组中的第K个最大元素
    根据特征的浏览器判断
    Cygwin在打开在当前目录
    【转帖】科学对待 健康养猫 打造快乐孕妇
    解决chrome浏览器安装扩展、应用程序一直处在“检查中”的问题
    对【SQL SERVER 分布式事务解决方案】的心得补充
    关于“点击这里继续访问您选择的百度XXX”
    VBA一例:如何保持文本框焦点
  • 原文地址:https://www.cnblogs.com/code-style/p/3503787.html
Copyright © 2011-2022 走看看