代码整洁之道

5 阅读4分钟

daxue.sankuai.com/personal.ht…

好代码与坏代码

好代码

  1. 包组织合理

  2. 异常设计合理

  3. 函数短小

  4. 类单一职责

  5. 接口SOLID(单一职责、开闭原则、接口隔离、依赖反转、里氏替换)

  6. 命名见名知意

坏代码

  1. 复用难

  2. 难于变化:未做抽象,改一处要改很多地方

  3. 难于理解

  4. 难于测试和验证

命名的整洁

常见命名规范

  1. 匈牙利命名法

  2. 驼峰命名法

  3. 帕斯卡命名法

  4. 下划线命名法

常用Java命名规范

  1. 包名小写

  2. 类名帕斯卡(大驼峰)

  3. 变量、方法名(小驼峰)

  4. 常量、枚举大写

变量命名技巧

  1. 尽量避免使用单字母变量,避免i/j/k,使用pos/index

  2. 变量名长度适中,8-20字符之间

  3. 用词技巧

    1. 布尔:isDone

    2. 状态:if(need)

方法命名技巧

  1. 动词开头,createXXX

  2. 避免query/fetch/find/search混用,应由团队统一约定

  3. 避免get/set开头,避免和关键字冲突

类命名技巧

  1. 名词或名词结尾,如:OrderService,CancelCommand

包命名规则

  1. 公司:com.公司名.{业务线}.项目名.模块名

  2. 个人:priv.个人名.项目名.模块名

命名大数据网站(别人怎么命名)

unbug.github.io/codelf/

类的整洁

  1. 单一职责

  2. 适当时候做类的拆分

  3. 功能复用优先考虑组合(has-a),而不是继承(is-a)

    java不支持多重继承,所以把巧克力咖啡中的巧克力视为添加剂,添加剂和咖啡做组合

隔离改变

  1. 接口隔离原则:一个类对另一个类的依赖,应建立在最小接口上

  2. 迪米特法则:知识最小原则,一个对象对其他对象尽可能少的了解,不要与非直接类通讯

    1. 降低成员访问权限,通过final类、priavte属性方法去控制

    2. 属性get/set方法,而不是直接object.property的方式

  3. 开闭原则:通过新增代码实现新需求,而不是改已有代码

  4. 依赖倒置原则:依赖抽象,而不是具体的实现

函数的整洁

  1. 尽量使用零参数、一参数函数:越多越难理解

  2. 尽量避免三参数及以上:参数越多,覆盖所有可能的值的组合就越多

  3. 参数过多,就该封装成参数对象了

保持同一抽象层级

避免副作用

  1. 函数承诺只做一件事,不做其他被藏起来的事

异常替代返回码

减少深层次嵌套,异常可以从异常类派生出来,抽离try/catch块

分层处理 链式传播

异常只打印一次,包含每一层的信息和调用栈

正确使用受检异常和非受检异常

受检异常:Exception

非受检异常:Error、RuntimeException

使用异常的最佳实践

  1. 总是做一些清理工作:如catch住了异常之后,在finally内执行关闭链接的操作

  2. 不要忽略异常:catch住了之后要做一些处理

  3. 不要使用异常来控制流程:不要把业务逻辑写在异常捕获里

  4. 不要捕获Throwable类:(遇到Error放弃捕获即可)在应用中不应捕获Throwable类,Error石Throwable类的子类,应用抛出Errors的时候,一般都是不可恢复的情况

  5. 要在方法定义分句中,定义具体的异常:也就是不要直接throws Exception,而是throws一个具体的,如IOException等

异常会影响性能

  1. 尽量使用标准异常

2. 正确的包装异常类型

3. 避免在finally内再抛出异常,只在finally内打印错误信息或关闭资源

4. 不要在finally内return,finally内的值都会有被改写的可能性

注释的整洁

一致的布局、一致的风格
  1. (java)优秀代码行数在200-500之间,供参考

  2. 行建议不超过80-120字符,长行换行

    1. 运算符号前断行

    2. 赋值符号之后断行

  3. 善用空行

相似的代码看上去要相似
概念相关代码放到一起
  1. 变量声明尽量靠近使用位置

  2. A调用B,尽量放到一起,A放到B上边

  3. 相关性越强,距离越短