美文网首页
编写可读代码的艺术 - 变量与可读性

编写可读代码的艺术 - 变量与可读性

作者: DZQANN | 来源:发表于2022-03-22 22:52 被阅读0次

    减少变量

    偶尔会看到这种代码:

    public void method() {
      LocalData now = LocalDate.now();
      message.setCurrentTime(now);
    }
    

    在这种情况写下,其实可以直接把两句合并成一句。理论上来说,每当我们新增加了一个变量,代码的复杂度就会变高,尤其当其它人阅读这段代码的时候,他们需要多追踪一个变量的值变化。

    减少中间结果

    这也是经常在代码库里看到的结构:

    public void method() {
      Contract contract = null;
      if (....) {
        contract = ....
      } else if(...) {
        contract = ...
      }
      if(contract == null) {
        return;
      }
      ....
    }
    

    这种代码看起来比较难受,按道理说应该把这段和contract相关的直接抽出来

    public void method() {
      Contract contract = findContract();
      if (contract == null) {
        return;
      }
      ....
    }
    
    private Contract findContract() {
      if (....) {
        return ....
      } 
      if(...) {
        return ...
      }
      return null;
    }
    

    这种格式带来的好处不止是去掉了一个占着位置的临时结果,还有减少了本身的if代码块缩进结构。

    而且最近看到的一种写法,我们一直讲方法间尽量不要传递null值,看到代码中有人会将结果封装成Optional<T>,通过判断isPresent决定流程,不再直接判断null

    减少控制流变量

    Java8之后,我们经常使用forEach替代传统的for循环,却带来一个提前中断的副作用

    public void method() {
      Flag flag = new Flag(false);
      list.forEach(e -> {
        if (flag.isTrue()) {
          return;
        }
        .....
        if (..) {
          flag.setTrue();
        }
      })
    }
    

    以前for循环的时候可能直接就可以break了,但是在forEach里,用return也只是跳出了当前循环。而且forEach外面的所有变量对于forEach里面的内容都是final的,这就意味着如果你想修改外面的flag,不能把flag作为一个boolean变脸,必须在外面再封一层。

    对于这种情况,其实还不如直接改成本身的for循环

    减少变量的作用域

    这里强调的是,如果一个全局变量只有类里面的少量方法用到了,那么就应该把这个全局变量缩小到局部变量,或者把这几个方法再抽成一个小类。

    我自己本身更支持第二种做法,如果一个类中只有一些方法,而没有成员变量,那其实就是面向过程了。并且这种做法会导致方法的参数不断增多。

    相关文章

      网友评论

          本文标题:编写可读代码的艺术 - 变量与可读性

          本文链接:https://www.haomeiwen.com/subject/rgghjrtx.html