整洁代码实践

    代码整洁,清晰可读,性能优异,是软件开发者追求的永恒目标。

  这个目标不是一步就可以实现的,它是在开发过程中,不断练习,不断总结中提升的。通常来说,高级开发工程师写的代码就比初中级写的更加整洁,bug更少。有些原则,我们在书上看了很多遍,但就是没有执行,或是执行中犯了错。

1、命名规范。

   驼峰命名法是java标准命名规范,但是在写接口时,我们还是会遇到和外部系统对接时,其他语言的命名规范,比如:

public class PORETURN {
  private String DOM_ID; }

  比如这个外部需求要求字段是DOM_ID,这样写好吗?最后测试时发现,其变成了dom_ID。

public class PORETURN {
    @JSONField(name = "DOM_ID")
    private String DOM_ID;
}

  这样其实还是有问题的,我们在定义View Object时,使用DOM_ID,还是侵入了java程序内部,在使用一些通用的框架还是会出现问题,比如mybatiplus,比如apache的BeaUtils.copyProperties就会应为命名不一致,出现问题。

public class PoReturn {
    @JSONField(name = "DOM_ID")
    private String domId;
}

  这样,类名和字段名都符合了java的命名规范,只需要在对接外部系统时,使用@JSONField转换就可以了。

2、职责划分,代码布局。

  我们都知道单一权限职责,具体到开发中,比如controller层只接受请求,打印日志,具体逻辑在service层实现。很多时候,由于业务比较简单,我们就直接在controller中实现了。如果文件确实不大,很好理解,也可以。但是如果代码很长,使xxx.java超过了1000行,我觉得这样就很不合理了,造成了头重脚轻。

3、干掉重复代码。

  我入行的时候,师傅就告诉我,在一个程序中,不要写重复的代码,《重构》也有强调。重复代码不仅很冗余,而且在业务变更时,修改很麻烦。但是,重复代码往往不是我们一个写的,比如我们写的代码和上一任的代码重复了,这是我们就要复用。

  还有情况是,我们没有发现我们在两个地方写了相似的代码,只有很少一部分是不同的。这时需要我们有抽象能力,把这些相同代码抽取出来,形成模板代码,这样大大降低重复率。但是这样精心设计代码,会拖累开发进度,需要把握一个度。

4、抽象思维。

  在高中时,我的数学老师总是给我们灌输一个概念:抽象思维,但是我也不清楚是啥,可能就是老子的道非道,非常道吧,我只是知道我们在做题时候要举一反三,生活中更多的是物理化学现象,却很难看到数学的踪影。但是如果我们能对现象进行抽象,就形成了数学模型,就可以用数学的方法解决了。比如观察一棵行道树的分支情况,每层数量类似于斐波那契数列。买东西是,商机给你找零,到底能有多少种情况,这是排列组合的问题。

     在计算机中最重要的思想就是抽象了吧,或者说封装,那就是不用理解其实现原理,只需要使用即可,在不断的使用过程中,加深对系统的理解。

  比如,对于物理硬盘的抽象,可以把它看成一个存储各种数据的对象,有read和write方法。

  在设计操作系统时,就体现了主要的分层思想,比如说,os管理计算机硬件,app使用硬件是,只能通过os提供的接口调用,并且在os的设计中,在复杂os设计中,都广泛使用了分层设计的思想。在docker中image就是层层堆叠的,具体这是怎么实现了,应该是一个很专业的问题了。

  这也诞生了一个重要的概念,这个一个软件对于另一个软件的依赖,不如最常见的web应用程序,一般需要mysql等数据库服务,需要tomcat等。

5、现身说法 

  真的被公司的后台代码恶心到了,一个FaultServiceImpl.java, 存在很多问题,现身说法一下,优雅的代码该怎么写。

  A、文件巨大,整个文件有1000+行,什么都不看,这么大的文件,肯定存在设计问题,抽象程度不够,摊大饼式开发,一般来说上限300-500是比较好的。

      详细看来,某个方法,有50+几乎重复的代码

      import语句有100+,有的是springframework,apache,xxx.com等。

  B、把通用方法写在专用类中,典型的没有结构设计,没有分层思想,瞎搞。

  C、在CheckServiceJob.java文件中,模仿之前的Job,开了多线程,其实更本没必要,还导致了方法层数过深,无脑复制前人代码。

  D、在AccessoryLibaryVo.java文件中,出现了同名不同包的类,这容易混淆,非常不好,可以简单区分一下,比如根据字段多少,命名为SimpleAccessoryLibaryVo.java

 

参考资料:《重构,代码整洁之道》

posted @ 2019-01-26 09:38  懂得了才能做一些改变  阅读(400)  评论(0编辑  收藏  举报