怎么写好函数?
- 函数应该做一件事,只做一件事,做好一件事。
- 方法:尽可能小,不断抽象,分离结构,抽象层级足够少,最好一个。
- 面向对象设计五个基本原则(SOLID)之一。这些原则是:单一职责原则、开闭原则、
接口隔离原则、里氏替换原则和依赖倒置原则。 - 函数名通俗易懂,风格统一。
- 参数越少越好。
- 做什么事和检查状态应该分离,分离指令和询问。
代码风格
- 根据逻辑,距离分隔。
- 相关函数位置最好在一起,调用者在被调用者上,增强可读性。
数据抽象和封装
- 找到最原始的特性,封装,对外隐藏具体实现。
错误处理
- 处理错误时使用异常,不使用返回码。
- 打包第三方API,对第三方API也可以封装到适合自己使用。
单元测试
- 测试随代码演进,和生产代码一样重要。
- 测试代码要清晰整洁,可读性好,便于直达目的。
- 原则:FIRST,快速独立可重复自足验证。
类
- 单一权责,类根据职责要足够小
- 内聚,保持内聚能得到更多短小的类
不断迭代
- 通过所有测试
- 不可重复代码,保证表达力
- 尽可能减少类,方法数量
味道与启发(怎么样的代码是好代码)
- 注释
- 不含有不恰当的信息
- 没有废弃的注释
- 注释不冗余
- 要写注释就好好写
- 没有注释掉的代码
- 环境
- 一步构建开发,生产环境
- 一步运行所有测试
- 函数
- 参数尽量少
- 没有死函数
- 一般问题
- 没有重复(代码、功能、模块)
- 低层级概念在派生类,高层级概念在基类,派生类对基类不可见
- 消除死代码
- 命名前后一致
- 逻辑依赖改为物理依赖(依赖者模块不应该对被依赖模块有假定)
- 用命名常量代替魔术数(不能描述自己的符号)
- 只做一件事的函数
- 使用时序耦合,使用必要的函数参数暴露时序性。
- 封装边界条件(next_page = page+1)
- 避免传递浏览(避免 a.get_b().get_c())
NOTE: 整体来说,看完这本书还是发现有很多和自己编程时遇到的问题相通的地方。原则很多,只能一步步逼近理想的情况。追求整洁完美的代码是一件需要持之以恒的事情。