

























code review中一些小结, 还没来得及加例子, 简要记录, 供参考
一: 一切都与复杂度有关 二: 代码应当易于理解
对人:
“好程序员”应当竭尽全力, 把程序写得让其他程序员(以及以后的自己)容易理解.
对代码:
- 代码被阅读的次数远多于编写和修改的次数
- E = mc2 (Error = more codes)
对项目:
公式: 可行性=(当前价值+未来价值)/(实现成本+维护成本). 即相比降低实现成本, 降低维护成本更加重要
团队成员遵守统一的风格, 保持风格的一致性, 减少理解难度
遵循基础的编码风格:
请仔细阅读, 使用对应编辑器插件工具协助检查
遵循 pep8 风格 利用pep8工具(编辑器相关插件)来解决这个问题, 在review之前处理. 以避免在review过程中出现此类问题.
遵循 Google Code Style / 中文版
不要吝啬空行, 把相关的代码行分组, 形成代码块. 声明按块组织起来, 并且把代码分成”段落”(按步骤/顺序/逻辑结构分), 排版合理
每行只写一个语句, 每行只声明一个变量
注释应该有很高的
价值(传递信息/空间占用)
代码本身应该尽力做到自说明
注释, 记录了在写代码过程中的思考, 保持紧凑, 简单准确的描述
不要使用尾注释. 容易被整行拷贝/不容易被编辑修改/逐渐腐烂
x = 1 # bad comment
# good comment
x = 1
不需要的代码, 维护到版本库后(写明commit info), 然后删除. 不要注释起来
不要给不好的命名加注释, 应该去修改命名
不要给那些从代码本身就能快速推断出来的事实写注释.(不要为了注释而注释)
对于复杂的计算逻辑, 要给出注释, 可以通过列举例子, 简单的输入输出来描述
对于大段的逻辑或模块, 需要给总结性注释
注释代码时, 应注重-为何做, 而不是-怎么做
每行注释前用一个空行分开. 注释缩进要和相应代码一致
把信息装入名字中.(自说明)
type 和 dirparams/args等, 没有隐含任何信息bool类型, 除非名字本身有True/False的含义, 否则建议统一使用is_前缀is_not_passfor a in b, 注意 a 和 b 的单复数区分compile, 放入变量中.Enum, 对可读性提升很大提前返回来消除) c.减少控制流变量import *, 会出现各种突如其来的变量名, 可能导致名字空间污染, 造成诡异问题dict, 不要使用for key in d.keys(), 直接使用for key in d原则: 保持简短, 易懂.(拆分超长表达式)
numbers[0]['obj'].namenot a and not b to not (a or b)u"中文"魔数, 使用常量/枚举替代之if/else顺序: a. 先处理正逻辑而不是负逻辑. b. 先处理掉简单的情况, 还能保证if/else在同一个屏幕内都可见(否则到了else需要回头查) c.先处理有趣或可疑的逻辑return early, 从函数中提前返回. 使用guard clause来实现. 某些情况返回后, 将不必要思考某个分支出口, 剩余注意力集中在为数不多的情况. 另一个好处是, 能有效减少代码缩进.return early来减少嵌套. 而循环中的减少嵌套方式, 可以使用if condition: continue/break来进行提早返回.is来判定是否是None, 而不是==if...else, 三目运算只有在最简单的情况下才使用if condition: return 则不需要elseif/else的多层嵌套, 在某些情况下, 判断条件中恒真/恒假的情况enumerate而不是维护index变量( enumerate 还可以从1开始计数)break), 否则不要使用for...else.(增加理解成本)for _ in l: _.x, 可读性太差if...else...嵌套层次, 可以使用if condition: continue异常日志同注释, 应该有很高的
价值(传递信息/空间占用)
try except中, 只捕获会出异常的代码片段. 注意粒度, 不要放入不必要的代码logging而不是print打日志)except Exception捕获所有异常.finally语句中使用return进行返回, 有坑.有用, 即足够明确, 对问题排查有帮助.try...except处理了, 调用方不需要再次处理函数不要太大, 嵌套不要太深
return 值不要使用0/1来代表True/Falsereturn, 返回值要保持一致(个数/类型)return early, 减少阅读代码时的逻辑堆积, 减少贯穿函数始终用于最终判断return的变量数量. 超过3个就变得有些难以维护了, 阅读过程中确定其值有困难dict封装来进行传递.isinstanceproperty封装这层处理, 同时处理异常情况.import顺序: 标准库/第三方库/本项目, 之间使用空行隔开import, 请使用from a import (b, c, d)而不是\来进行换行from A import *软件设计三大误区: 1.编写不必要的代码 2.代码难以修改 3.过分追求通用
print语句领地, 他人不敢修改/不敢大改, 容易造成代码腐烂. 占用空间且没啥用.此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。