本文是《提升你的 Python 项目代码健壮性和性能》系列的第六篇文章。
接下来的三篇,围绕另一个主题
如何写出整洁的代码
『整洁』三篇是基于**『代码整洁之道』和『架构整洁之道』**的一些切身的理解和体会。
感谢这两本书的作者 Bob 大叔。
PPS: 某东读书 VIP 会员有不少 IT 资源类的书籍可以免费看,比如『代码整洁之道』
随着项目代码行数的增加,不可避免的遇到软件架构腐败的问题。
具体表现为:随着每一次产品版本的发布,对现有流程进行优化和修改就格外的费事和吃力。工程师的生产力就开始直线下降。
所谓
眼看他起朱楼,眼看他宴宾客,眼看他楼塌了。 清 孔尚任《桃花扇》
原因可能是多方面的,比如常见的场景:
步骤 1. 领域建模的人对业务里概念的理解不到位,流程不深入了解。
步骤 2. 工程师在实现的时候,按照自己的理解,没有梳理整个流程。就开始动手实现。并且全程人肉测试。
步骤 3. 需求变动,流程更改。
第一步容易埋下坑点:
接着,领域理解不到位就会带来另一个问题。
经验老道的程序员会通过一些手段,比如让这些命名不清晰的东西统一一下,然后等概念清晰了。再改回来。
第二步容易埋下坑点:
当更改已有流程或者是出问题的时候,除了一脸懵逼就还剩下甩锅了。
第三步容易继续在坑里埋坑:
资本市场里,树欲静而风不止,想重构而时不我待。
最后,
屠龙少年变成了恶龙,而产品和工程师们经过不懈努力,终于堆出了『代码屎山』-- 腐败系统
腐败系统有一句成语可以概括,叫做金玉其外,败絮其中。
什么是外,什么是中?
看起来有点抽象,打个比方就清晰多了。
所谓软件系统,可以比作是人。
身体是革命的本钱,所以,要经常锻炼身体。同理可知系统也是如此。
业务方和管理层仅在意软件系统的外在。
优秀的软件工程师,做的就是平衡这两者。必要的时候,需要和业务方以及管理层进行沟通。
不一定。
假如你是做业务逻辑的。
首先,好代码可能是聊出来的。
比如需求确认这一块,多问多画流程图少动手。就可以减少后期很多麻烦事情。
如果在没有理解透需求的情况下动了手,就会做得越多,错的越多。我相信很多工程师都有
这种感觉。
当然,这是基本上不怎么可控的外部条件。所以,不在本文的讨论范围之内。
其次,好代码可能是边读边写出来的。
回顾一下一天的工作,你会发现,不管是,你写文章,或者是做一些其他的东西。
最后,好代码是改出来的。
我们只讨论如何保持代码的清晰整洁
什么是好的代码?
引用 C++ 创始人的说法,我喜欢优雅而高效的代码,
其实还有一些保证代码整洁的手段:
比如本系列的文章讲解
名不正,则言不顺;言不顺,则事不成。事不成,则礼乐不兴;
写代码就是这样。
对于具体业务而言,**起不好名字有一半的锅都是产品经理的锅,因为这是概念认知不清晰的表现。**不要小看这一点,产品经理对项目的理解不到位会在编写代码的过程中被放大。
遇到这种情况,务必要把产品经理拉过来认认真真的扯扯犊子。
对于实际代码而言,
务必不要用单字母命名,取名字要准确,如无必要,也尽量规避掉缩写。
# 差
d = Column # 消逝的时间
# 好
elapsedTimeInDays
daysSinceCreation
daysSinceModification
fileAgeInDays
不要做无意义的区分
fetchAccountList 就不如 fetchAccounts
fetchAccountRecord / fetchAccountInfo / fetchAccountData 就不如 fetchAccount
变量是名词,路由是名词,方法是动宾结构。
即便是名字起的不好,也应该很统一。
每个函数都要做到短小精悍
不同抽象层级
def 日常 ():
用 XX 点外卖 ()
去厨房拿筷子 ()
等小哥送来外卖 ()
睡觉 ()
打豆豆 ()
为什么是不同抽象层级呢? 点外卖不一定是日常。可能自己偶尔也会做饭。
并且,从业务角度来说,吃饭,睡觉,打豆豆比较符合业务人员的认知。
同一抽象层级
def 点外卖吃饭 ():
用 XX 点外卖 ()
去厨房拿筷子 ()
等小哥送来外卖 ()
def 吃饭 ()
if 今天比较懒:
点外卖吃饭 ()
def 日常 ():
吃饭 ()
睡觉 ()
打豆豆 ()
这样写出来的函数,比较符合自顶向下的阅读方式。
参数尽量不要超过三个。
因为超过三个之后,就很难用几个单词把这个方法的意义给概括出来。
如果超过三个,这就需要谨慎的考虑将其中的一部分参数是封装为结构体或者是类。
代码一定要排版整齐
反正是我记不住 pep8 里面要求的那些标准的。当然,flake8 为你提供了比较好的 lint 标准。
在这里推荐两个工具:
至于 black, 是类似于 javascript 圈里面的 prettier 的存在。
在每次 commit 的时候,执行 flake8 和 black, 让你的代码整整齐齐。