相信你已经读过《Python编程参考》的前面几节了,对代码规范和编程风格指南了然于心,但在实际编写代码或者设计程序的时候,写出来的东西总是不尽如人意,感觉还差点什么。
不只是你,本书作者韦世东之前也有同样的感觉。说实话,没有别人带领、公司没有完善的规范,自己摸着石头过河的学习效率是很低的。作者很喜欢阅读优秀项目的源码,同时也喜欢购买付费专栏和图书,想尽办法提高自己的程序设计能力。幸运的是,在读完《代码整洁之道》后,我一个平台看到了郑晔老师的付费专栏《软件设计之美〉,学习完之后,个人在程序设计方面有了很大的进步。
这篇文章是一个归纳与梳理,归纳程序设计的关键知识点、梳理学习过程中踩过的坑。程序设计的好与坏,早在我们青葱岁月时就接触过了,只是那是并不知道这竟如此重要。能够立即改善程序设计、写出“好”代码的知识有以下几点:
面向对象五个基本原则;常见的三种架构;绘图;起一个好名字;优化嵌套的ifelse代码;
当然,其他技术知识的丰富程度也决定了程序设计的好坏。例如通过引入消息队列解决双端性能差异问题、通过增加缓存层提高查询效率等。下面我们一起来看看,上面列出的知识点包含哪些内容,这些内容对代码和程序设计的改善有何帮助。
面向对象五个基本原则
本书作者是级学生,面向对象是作者青葱时期发展火热的编程范式。它的五个基本原则是:
单一职责原则;开放封闭原则;依赖倒置原则;接口隔离原则;合成复用原则;
下面我们将通过对比和场景假设的方式了解五个基本原则对代码质量的影响。
立竿见影的单一职责原则
没错,立竿见影、效果卓越。对于我们这些自学编程无师自通的人来说,能把功能实现就可以了,根本没有时间考虑代码优化和维护成本问题。时光流逝,竟在接触编程很长一段时间后才发现它竟如此重要。
俗话说只要代码写的够烂,提升就足够明显。以一个从文件内容中匹配关键数据并根据匹配结果发出网络请求的案例,看看大部分程序员的写法:
importre
importrequests
FILE=./information.fet
defextract(file):
fil=open(file,r)
content=fil.read()
fil.close()
find_object=re.search(rurl=\d+,content)
find=find_object.group(1)
text=requests.get(find)
returntext
if__name__==__main__:
text=extract(FILE)
print(text)
需求已经实现,这点毋庸置疑,但是问题来了:
如果读取文件的时候发生异常了怎么办?如果数据源发生变化该如何处理?如果网络请求返回的数据不符合最终要求怎么办?
如果你心里的第一个反应是改代码,那你就要注意了。完成一件事中间的某个环节发生变化,改代码是在所难免的,但是如果按照上面这种写法,不仅代码越改越乱,连逻辑也会越来越乱。单一职责原则表达的是让一个函数尽量只做一件事,不要将多件事混杂在一个函数中。
上面的代码如果重新设计,我认为至少应该是这样的:
defget_source():
获取数据源
return
defextract_(val):
匹配关键数据
return
deffetch(val):
发出网络请求
return
deftrim(val):
修剪数据
return
defextract(file):
提取目标数据
source=get_source()
content=extract_(source)
text=trim(fetch(content))
returntext
if__name__==__main__:
text=extract(FILE)
print(text)
把原来放在一个函数中实现的多个步骤拆分成为多个更小的函数,每个函数只做一件事。当数据源发生变化时,只需要改动get_source相关的代码即可;如果网络请求返回的数据不符合最终要求,我们可以在trim函数中对它进行修剪。这样一来,代码应对变化的能力提高了许多,整个流程也变得更清晰易懂。改动前后的变化如下图所示:
单一职责原则的核心是解耦和增强内聚力,如果一个函数承担的职责过多,等于把这些职责耦合在一起,这种耦合会导致脆弱的设计。当发生变化时,原本的设计会遭受到意想不到的破坏。单一职责原则实际上是把一件事拆分成多个步骤,代码修改造成的影响范围很小。
版权水印