提高代码可读性和可修改性的一些建议
一、关于内聚和耦合
内聚
内聚是一个模块的内部功能相互关联的紧密程度
执行某个特定的任务或相关任务组的模块是具有高内聚性的,而没有核心功能只是将大量功能凑到一起的模块有低聚性
耦合
各模块间相互联系紧密程度的一种度量。
模块之间联系越少,耦合性越低,也就是模块的独立性越强
二、可读性好的特点
可读性不仅与代码是不符合编码规范有关,还与代码逻辑的清晰程序,代码利用了多少编程语言的标准风格以及功能的模块化程序有关.
结构规整、文档齐全的代码:同时符合编程语言规范和编程实践规范,具有可读性高、简单简洁、容易阅读和修改等好处
1. 写得好(well-written)
写得好的代码能准确展现它的功能。
一段代码如果用简单的语法,用最鲜明的编程语言风格写成,且逻辑清楚,变量、函数、类和模块等命名明了易懂,就认为编码写得好。
2. 文档齐全(well-documented)
所谓的文档齐全通常指代码中的注释齐全。
一段有良好注释的代码能清晰的表达它的功能、输入参数和输出值以及编写逻辑或算法。
注释也可以包含引用的外部库或相关API的用法,以及运行此行代码或此段代码需要的环境配置
3. 结构规整(well-formatted)
大多数编程语言,尤其是开源的编程语言,都是由分布在不同地理位置却紧密相连的编程社区通过网络发展起来的,这也决定了编程语言往往都有良好的注释风格规范。一段符合注释风格的代码由于结构规整,更易于理解。
三、可读性-反模式
反模式,就是导致编程难以阅读或不可读的代码的做法。
一种编程语言的最佳实践一般来自开发者社区中多年使用该语言的经验以及它产生的有效反馈。
最佳实践总结了解决问题的最佳编程方式,更进一步讲是总结了该语言的一些惯用法和常见模式
没有经验程序员或“跨界”程序员往往没有遵守这些规范
意大利面代码(spaghetti code)
没有清楚结构和控制流的代码。
无条件的跳转、无序的异常处理、设计糟糕的并发结构等,往往都会导致混乱的结构和不清晰的控制流
大泥团(big ball of mud)
由不能展示整体结构和目标的代码构成的系统。
大泥团一般包括很多段的意大利面代码,通过指很多人写成的代码,经过多次修补,但只有少量说明文档或是没有文档
复制-粘粘编程(copy-paste programming)
若一味为了代码的交付方便而不对整体进行周到的设计,往往会产生复制-粘贴程序。
复制-粘贴程序中有长而重复的代码块,这些代码大体上没有什么不同,只有一点小修改,基本处理相同的事情 。
自负编程(ego programming)
自负编程是指某个程序员(通常是一个经验丰富的程序员)喜欢把他的个人风格在已有的最佳实践或组织机构的编程规范之上,这有时候会产生对其他人而言隐晦和难以阅读的代码。
四、提高可修改性的一些方法
可修改性是指对一个系统进行修改的容易程度,以及系统适应这些修改的灵活性,处软件的可读性紧密联系。
只提供必须开放的接口
这里的接口可以理解成api,也可以理解成一个类的方法,简单地说,就是能用private或protected的就不要设置成public。
减少双向依赖
双向引用简单地说就是A调用了B,B又调用了A。
如果耦合的方向是单身的,两个软件模块之间的耦合是可以管理的,而双向依赖的模块会造成难以维护。
比如python采用的是基于引用的垃圾回收机制,如果存在双向耦合,可能会导致变量与对象之间的隐式循环引用链,进而导致垃圾回收运行结果不理想。
打破双向依赖的方法:
- A模块总是使用B模块之外的函数,B也一样
- 将A和B模块共同使用的函数封装到一个新的模块中
抽取公共服务
抽取出模块中的重复功能,减少共用代码的重复封装
还可以一个模块中与核心函数关系不大的函数移动到一个辅助模块中,提高模块的内聚性
可以使用组合或继承这样的方式