编程界的小学生
一、评判代码质量好坏的标准
灵活性(flexibility)、可扩展性(extensibility)、可维护性(maintainability)、可读性(readability)、可理解性(understandability)、易修改性(changeability)、可复用(reusability)、可测试性(testability)、模块化(modularity)、高内聚低耦合(high cohesion loose coupling)、高效(high effciency)、高性能(high performance)、安全性(security)、兼容性(compatibility)、易用性(usability)、整洁(clean)、清晰(clarity)、简单(simple)、直接(straightforward)、少即是多(less code is more)、文档详尽(well-documented)、分层清晰(well-layered)、正确性(correctness、bug free)、健壮性(robustness)、鲁棒性(robustness)、可用性(reliability)、可伸缩性(scalability)、稳定性(stability)、优雅(elegant)、好(good)、坏(bad)……
二、常用的几个
- 可维护性(maintainability)
- 可读性(readability)
- 可扩展性(extensibility)
- 灵活性(flexibility)
- 简洁性(simplicity)
- 可复用性(reusability)
- 可测试性(testability)
三、逐个分析
1、可维护性(maintainability)
1.1、描述
维护性就是修改bug以及完成正常产品需求的迭代所产生的新老代码。
可维护性就是说在不破坏原有代码设计、不引入新的bug的情况下能够顺利的完成产品迭代需求或者修改老的代码所产生的bug。
不可维护性就是说在修改老代码(bug)或完成新迭代需求所产生的代码都可能极大的概率引入新的bug,并需要花费很长时间才能完成,这就是不可维护性。
1.2、是否具备可维护性
若bug容易被修复,修改或新增功能能够轻松完成,那就可以认为这段代码是具备可维护性的。相反,若修改一个bug,或者修改、新增一个功能都可能引入其他意料之外的bug,这就说明这段代码是具备不可维护性的。
2、可读性(readability)
2.1、描述
顾名思义,别人看你这段代码或者做review的时候,在没有你任何提示的情况下别人能不能看懂你写的代码,大到代码逻辑小到变量名称命名。
2.2、是否具备可读性
如何确认是否具备可读性?
需要看代码是否符合编码规范、比如复杂逻辑是否有注释、log、是否能见名知意、模块划分是否合理、是否高内聚低耦合等。
如果其他人能轻松的读懂你写的代码,那就说明你的代码可读性好。反正其他人读不下去,读的过程中有很多疑问,那就说明你的代码不具备可读性。
3、可扩展性(extensibility)
3.1、描述
在不修改或少量修改原有代码的情况下能通过扩展的方式(比如新增个子类实现接口而不是修改老的实现类的方式)来完成某些需求。就是说代码预留了一些功能扩展点,而需求改动的时候不用大动干戈。对应了对修改关闭,对扩展开放设计原则。
4、灵活性(flexibility)
4.1、描述
和扩展性很像,设计模式、设计原则都是为了解决问题而产生。大多数都挺像的但是略有不同。
- 在不修改或少量修改原有代码的情况下能通过扩展的方式来完成某些需求不仅可以说具备可扩展性,还具备灵活性。
- 当要开发一个新功能的时候,发现原有代码中已经抽象出很多可以服用的模块、类等代码,可以拿来直接用。这个时候不仅可以说具备复用性,还可以说代码很灵活。
- 当我们使用某组接口的时候,如果这组接口可以应对各种场景,满足各种需求。这时候也叫灵活。
5、简洁性(simplicity)
5.1、描述
对应设计原则KISS原则:Keep It Simple, Stupid。尽量让代码简单、逻辑清晰,大牛往往都是利用简单的代码完成复杂的需求。而不是一堆设计模式上来过度设计。
6、可复用性(reusability)
6.1、描述
尽量减少重复代码的编写,复用已有的代码。对应DRY(Don’t Repeat Yourself)设计原则。
7、可测试性(testability)
7.1、描述
代码的可测试性差,比较难写单元测试,那基本上就能说明代码设计得有问题。
四、如何写出好代码?
写完后核对下是否符合如下几个特征:
- 可维护性(maintainability)
- 可读性(readability)
- 可扩展性(extensibility)
- 灵活性(flexibility)
- 简洁性(simplicity)
- 可复用性(reusability)
- 可测试性(testability)