对一段代码的质量评价,往往有很强的主观性。并不能通过单一的维度去评价一段代码写的好坏。代码质量的好坏是一个综合各种因素得到的结论。其中最常用的、最重要的评价标准是可维护性、可读性、可扩展性、灵活性、简洁性(简单、复杂)、可复用性、可测试性
。
可维护性。
落实到编码开发,所谓的“维护”无外乎就是修改 bug、修改老的代码、添加新的代码之类的工作。所谓“代码易维护”就是指,在不破坏原有代码设计、不引入新的 bug 的情况下,能够快速地修改或者添加代码。所谓“代码不易维护”就是指,修改或者添加代码需要冒着极大的引入新 bug 的风险,并且需要花费很长的时间才能完成。 对于一个项目来说,维护代码的时间远远大于编写代码的时间。所以代码的可维护性也就格外重要。 代码的可维护性是由很多因素协同作用的结果。代码的可读性好、简洁、可扩展性好,就会使得代码易维护;相反,就会使得代码不易维护。更细化地讲,如果代码分层清晰、模块化好、高内聚低耦合、遵从基于接口而非实现编程的设计原则等等,那就可能意味着代码易维护。除此之外,代码的易维护性还跟项目代码量的多少、业务的复杂程度、利用到的技术的复杂程度、文档是否全面、团队成员的开发水平等诸多因素有关。
可读性。
代码是否符合编码规范、命名是否达意、注释是否详尽、函数是否长短合适、模块划分是否清晰、是否符合高内聚低耦合等等。我们无法量化可读性因为很难给出一个覆盖所有评价指标的列表。
可扩展性。
代码的可扩展性表示,我们在不修改或少量修改原有代码的情况下,通过扩展的方式添加新的功能代码。说直白点就是,代码预留了一些功能扩展点,你可以把新功能代码,直接插到扩展点上,而不需要因为要添加一个功能而大动干戈,改动大量的原始代码。
灵活性。
如果一段代码易扩展、易复用或者易用(一组接口可以应对各种使用场景),我们可以称这段代码写得比较灵活。
简洁性。
KISS 原则:“Keep It Simple,Stupid”。尽量保持代码简单。代码简单、逻辑清晰,也就意味着易读、易维护。我们在编写代码的时候,往往也会把简单、清晰放到首位。思从深而行从简,真正的高手能云淡风轻地用最简单的方法解决最复杂的问题。
可复用性。
代码的可复用性是很多设计原则、思想、模式等所要达到的最终效果。它可以简单地理解为,尽量减少重复代码的编写,复用已有的代码。 面向对象特性中的继承、多态存在的目的之一,就是为了提高代码的可复用性;设计原则中单一职责原则也跟代码的可复用性相关;重构时解耦、高内聚、模块化等都能提高代码的可复用性。
可测试性。
代码的可测试性是一个相对较少被提及,但又非常重要的代码质量评价标准。代码可测试性的好坏,能从侧面上非常准确地反应代码质量的好坏。代码的可测试性差,比较难写单元测试,那基本上就能说明代码设计得有问题。
以上告诉我们什么样得代码是高质量的代码,那如何才能写出高质量的代码?
掌握编程方法论,包括面向对象设计思想、设计原则、设计模式、编码规范、重构技巧等。所有这些编程方法论的最终目的都是为了写出高质量的代码。
面向对象。
主流的编程范式或者是编程风格有三种,它们分别是面向过程、面向对象和函数式编程。面向对象这种编程风格又是这其中最主流的。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。
设计原则。
设计原则是指导我们代码设计的一些经验总结。面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式编码实现的基础。
设计模式。
设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。大部分设计模式要解决的都是代码的可扩展性问题。了解它们都能解决哪些问题,掌握典型的应用场景,并且懂得不过度应用。
编码规范。
编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节。如何给变量、类、函数命名,如何写代码注释,函数不宜过长、参数不能过多等等。推荐书籍 《重构》《代码大全》《代码整洁之道》
重构技巧。
重构的目的(why)、对象(what)、时机(when)、方法(how);保证重构不出错的技术手段:单元测试和代码的可测试性;两种不同规模的重构:大重构(大规模高层次)和小重构(小规模低层次)。掌握一些重构技巧、套路,更重要的是建立持续重构意识,把重构当作开发的一部分,融入到日常的开发中。
五者之间的联系。
- 面向对象编程因为其具有丰富的特性(封装、抽象、继承、多态),可以实现很多复杂的设计思路,是很多设计原则、设计模式等编码实现的基础。
- 设计原则是指导我们代码设计的一些经验总结,对于某些场景下,是否应该应用某种设计模式,具有指导意义。比如,“开闭原则”是很多设计模式(策略、模板等)的指导原则。
- 设计模式是针对软件开发中经常遇到的一些设计问题,总结出来的一套解决方案或者设计思路。应用设计模式的主要目的是提高代码的可扩展性。从抽象程度上来讲,设计原则比设计模式更抽象。设计模式更加具体、更加可执行。
- 编程规范主要解决的是代码的可读性问题。编码规范相对于设计原则、设计模式,更加具体、更加偏重代码细节、更加能落地。持续的小重构依赖的理论基础主要就是编程规范。
- 重构作为保持代码质量不下降的有效手段,利用的就是面向对象、设计原则、设计模式、编码规范这些理论。