笔者加入新公司几个月了,因为之前实习和工作的经历都是做新项目,对于维护老项目和阅读旧代码也没太多经验,踩了一些坑。笔者在还没有彻底了解业务的情况下就重构代码,导致延误了项目进度。so naive啊。。。。。。
最近感受最深的就是项目规范化很重要,尤其是多人协作的时候。人多了的时候,不同人的水平和代码风格差异很大,如果没有统一的规范,不同的人写的代码太个人化,有时候还有很多坏味道,导致协作和他人上手很困难,项目进度也会受到影响。
另外就是程序员需要的技能还是很多的,除了写代码实现需求,还需要能够很好地理解业务,和PM,测试,其他开发人员的沟通也很重要。
最近吃到的一些教训:
- 打断点单步执行是理解代码的一种比较好的方式。
- 项目规范化。一定要制定自己公司的代码规范,避免代码腐化,导致以后维护和修改成本巨大。
- 不要一上来就重构你觉得不好的东西,没有单元测试的代码重构起来风险极大,很有可能得不偿失。把你的想法和规范用到新的代码中,旧的代码涉及到的时候再尝试慢慢修改其中不好的地方。
- 注释和文档化很重要,降低别人理解和上手你的代码的难度。代码除了实现需求外,最重要的就是理解和维护。
- 对于不太明白怎么做的地方(比如docstring怎么写),看看知名的开源项目人家是怎么做的。
大概想了一下目前需要实施的规范:
工具
- 机器性能好的话强烈推荐pycharm,非常多实用功能。
- 请在你的IDE或者编辑器里找到pep8和pylint检测插件,务必打开。pylint能帮你消除很多代码坏味道。
- 使用的开发工具应该具有代码高亮,批量注释,pep8检测,pylint检测,自动生成docstring等功能。
- vim请使用python-mode插件,集成了众多实用python插件。
编码风格
请遵循pep8标准,行长度可以适当放宽,但请不要超过120列,请使用格式优美的分行方式。
google的代码风格也可以参考。
《PEP 8 – Style Guide for Python Code》
Google开源项目风格指南-Python风格指南》
命名规范
- 按照pep8规则命名
- 注意函数动词和变量名词词性的区分
- 因为python没有类型声明,可以适当加上后缀比如url_list, info_dict等作为区分
函数
- 保持精简,注意复用,一次只做一件事。当需求变更时候,颗粒度细的代码更容易更改和适应变更。
- 注意函数的副作用,python的可变和非可变类型作为参数传入。
- Think about future, design with flexibility, but only implement for production. 不要过度和超前设计,不要预测未来,仅需保持精简以便适应将来需求变更。
- 代码的写法应当使别人理解它所需的时间最小化
- 注意逻辑分块
docstring书写
对于 复杂
函数应该有良好的docstring注释,现统一使用sphinx格式的docstring,pycharm默认支持,vim请使用 heavenshell/vim-pydocstring
插件,其他编辑器请自行搜索安装。
以下是示例:
- 函数的精确描述,如果名称可以自解释可以省略。应当声明函数的意图和使用注意事项。虽然有时候一行行阅读代码也可以看懂,但是很多时候并不想看代码而是想立马知道该函数的功能。
- 需要说明的参数含义和类型,对于动态语言,不能自解释的参数类型应予以说明,并且复杂的传入参数比如嵌套字典应该有相应的示例。
- 返回值的含义和类型。复杂返回值应该有示例说明。
- 非开源项目并且无老外参与可以使用中文,某些英文注释理解困难。
def add_pdr(process, userid, log):
""" Create and perform the target account operation PDR
If the function/method is complex, I'd put a short one-line
summary in the first line above, and a more detailed explanation
here.
:param dict process: dict of process details
:param str userid: userid to perform actions on
:param obj log: log object to perform logging to
:raises KeyError: if the userid doesn't exist
:raises APIError: if process dict is invalid
:return: True on success, False upon failure
"""
注释:
良好的代码最好是自解释的,但有时候避免不了一些额外说明。
- 好代码>差代码+好注释
- 注释什么?不要重复代码实现。费解的地方需要注释你的想法。
- 什么时候注释?你自己回头都得需要一定时间才能理解的地方。
- 注释应当及时更新,防止和代码不匹配。
- 对于比较tricky的实现应当予以注释。
- 相应的github、stackoverflow、jira、需求文档地址等如果必要也可以注释
- 数据库字段需要注释其含义。
- 以可读性为标准,不要隐晦(代码费解),也不要冗余(过度注释)。
异常
- 不要直接用try/except捕获所有异常,这样会捕获BaseException,请先参考python异常层级。
- 异常发生的时候注意现场记录,可以把相应的locals()变量输出便于排查问题。记录调用点
额外参考:
《软件项目免坑指南》
软件项目质量保证——编码规范
《python-web-guide》
这个我会当做笔记本,把想法和坑记录上去。 最后就是推荐新手同学看看《clean code》《代码大全》之类的书,学习一下如何编写出更易于理解的代码.
原文
http://ningning.today/2016/08/20/python/python项目编码规范/