经典编码概念

2018-07-01
3 min read

持续更新中…

  1. TDD & 面向 Debug 编程,TDD 是为了尽早暴露问题;防御性编程,编码过程要尽量细致,基本原则是不相信任何人、任何依赖代码;面向 Debug 编程是为了未来出现问题好排查

    1. 不好测试的代码要么是设计有问题,要么就是特殊场景,一般都是设计问题
    2. 防御性编程常规观点,我的理解是依赖倒置,不可控的代码要封装一层,防止被其他模块牵着鼻子走
    3. 面向 Debug 编程就是提供良好的 Debug 工具,常规 RPC 工具常内置小型 http 服务,可以很方便的通过控制台直接访问
  2. 好代码的检验标准就是人们是否能轻而易举地修改它

  3. 与其猜测未来需要哪些灵活性、需要什么机制来提供灵活性,我更愿意只根据当前的需求来构造软件,同时把软件的设计质量做得很高

  4. 每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中

代码质量的重要性

代码的生命周期中有不少与一半的时间都用于阅读,代码的可阅读性(质量)很重要

经典概念

  1. SOLID:Single Responsibility / Open&Closed / Liskov Substitution / Interface Segregation / Dependency Inversion
  2. CLEAN:内聚(Cohesive)/松耦合(Loosely Coupled)/封装(Encapsulated)/自包含(Assertive)/无冗余(Nonredundant)
  3. YAGNI:YAGNI 有很强的扩展性,比如只做好当前、不重复、尽量不添加新功能
  4. 3Y:层次化( hierarchy)/ 模块化( modularity) / 规整化( regularity,保存模块接口的通用性)
  5. 测试驱动开发。逻辑测试 & 边界测试。函数或模块的编写要方便测试,而且每当你收到 bug 报告,请先写一个单元测试来暴露这个 bug

其他资料:https://users.ece.utexas.edu/~adnan/pike.html

重构

下面的内容截取自 《重构:改善既有代码的设计》 /

重构:在不改变代码外在行为的前提下,对代码做出修改,以改进程序的内部结构

在软件开发的大部分历史时期,大部分人相信应该先设计而后编码。重构正好与此相反,哪怕手上有一个糟糕的设计,甚至是一堆混乱的代码,我们也可以借由重构将它加工成设计良好的代码

重构原则

重构原则(2nd chap)

  1. 重构的第一步:确保即将修改的代码拥有一组可靠的测试(TDD),合理的测试可以极大的减少调试时间
  2. 两顶帽子。将重构与添加新功能在版本控制的提交中分开
  3. 何时重构。让扩展变得容易、事不过三,拒绝重复、帮助理解、逐步清理不合理的地方
  4. YANGNI。不需要理解的代码不要重构
  5. 自动化重构。使用智能工具可以减少工作量

CR CheckList

参考:https://github.com/mgreiler/code-review-checklist

Type Items Type Items
Requirements Have the requirements been met?
Have stakeholder(s) approved the change?
Code Formatting Is the code formatted correctly?
Unecessary whitespace removed?
Best Practices Follow Single Responsibility principle?
Are different errors handled correctly?
Are errors and warnings logged?
Magic values avoided?
No unnecessary comments?
Minimal nesting used?
Maintainability Is the code easy to read?
Is the code not repeated (DRY Principle)?
Is the code method/class not too long?
Performance Is the code performance acceptable? Architecture Is it secure/free from risk?
Are separations of concerned followed?
Relevant Parameters are configurable?
Feature switched if necessary?
Testing Do unit tests pass?
Do manual test plans pass?
Has been peer review tested?
Have edge cases been tested?
Are invalid inputs validated?
Are inputs sanitised?
Documentation Is there sufficient documentation?
Is the ReadMe.md file up to date?
Other Has the release been annotated (GA etc)?

资料

相关书籍

软件构建组成

细节请参考《代码大全》