敏捷编码
本文为《敏捷开发修炼之道》中敏捷编码一章的总结
介绍
随着项目变大变复杂,不恰当的编码会让后期的开发变得困难。所以有必要在早期就践行正确的代码编写方式。
- 代码要清晰地表达意图
- 用代码沟通
- 动态评估取舍
- 增量式编程
- 保持简单
- 编写内聚的代码
- 告知,不要询问
- 根据契约进行替换
代码要清晰地表达意图
PIE(Program Intently and Expressively)原则,意图清晰,表达明确
- 充分语义化,尽量不看定义也能明白
- 使用方法名传达意向,方法参数名帮助读者理解背后的想法
- 正确的使用和命名异常
- 使用语言特性提升表现力
- 好的编码规范可以让代码容易理解,同时减少不必要的注释和文档
- 编写清晰而不是讨巧的代码,比如位移操作可读性就不好
- 想象一年后的自己来阅读代码,读一次就能明白
- 有意图的编程不是创建更多的类或者类型,这不是过分抽象的理由
- 使用合适的耦合。例如,通过散列表进行松耦合。散列表存储紧密耦合的组件没有明确的表示意图
用代码沟通
读代码的方式:先阅读注释,然后快速浏览代码。从而理解它做了什么,为什么这么做
建立代码文档有两种方式,利用代码本身以及利用注释来沟通代码之外的事情
适当的注释和良好的代码能让人快速理解代码。知道代码的意图,结果和需要注意的地方。
优雅清晰的代码
优雅的代码易于辨识和理解,简洁,第一眼看上去就知道它的用处
- 变量名运用正确
- 空格使用得当
- 逻辑分离清晰
- 表达式简洁
- 清晰的执行路径
好名字
- 好名字向读者传递大量信息,不好的名字无法传递信息,糟糕的名字传递错误的信息
- 遵循习惯用法。比如i表示循环索引量,s表示字符串
适当的注释
- 克制在方法体内部的注释。
- 为读者指定一条正确的代码访问路线图
- 为代码中的每个类或模块添加一个短小的描述,说明目的以及要求
- 对于类中的每个方法,可能要说明四点。目的,输入,输出和异常
- 注释不能替代优秀的代码
- 在代码可以传递意图的地方不要使用注释
- 解释代码做了什么的注释用处不大。注释要说明为什么这样做
- 重写方法时,保留描述原有方法意图和约束的注释
动态评估取舍
错误观点:性能、生产力、优雅、成本、以及上市时间,在软件开发过程中都是至关重要的因素,每一项都必须达到最理想状态
正确观点:如果性能表现足够了,就把注意力放在其他因素上。不要为了感觉上的性能提升或者设计的优雅,而将设计复杂化
- 由用户或者利益相关者来评估性能是否足够,界面是否吸引人
- 即使不能面面俱到,你也应该得到最重要的东西——客户认为有价值的特性
- 如果现在要投入额外的资源和精力是为了将来可能得到的好处,那么要确认投入一定要得到回报
- 真正的高性能系统,从一开始设计时就在向这个方向努力
- 过早的优化是万恶之源
增量式编程
在很短的编辑/构建/测试循环中编写代码,可以创建更加清晰、简单、易于维护的代码
采取增量式编程,会更倾向于创建更小的方法和更具内聚性的类
- 如果构建和测试花费的时间过长,你就不会经常运行它们了。要保证测试可以快速运行
- 在编译和测试中,停下来想一想,并暂时远离代码细节,这是保证不会偏离正确方向的好办法
- 要像重构代码一样重构测试,并且经常重构测试
保持简单
- 不要过度设计
- 开发可以工作的、最简单的解决方案。就是没有一行多余代码,并且仍能交付全部功能
- 使用模式、原则和高难度技术要有明确的目的
- 代码几乎总可以得到进一步精炼,但是到了某个点之后,再做改进就不会带来实质性的好处了。这时就改停下来去做其他的事情了
- 强行让代码变得优雅与过早优化一样,会产生恶劣的影响
- 简单不是在功能上妥协
- 简单不是单纯的代码量少,要兼顾可读性
- 一个人认为简单的东西,可能对另一个人意味着复杂
编写内聚的代码
内聚性用来评价一个组件中成员的功能相关性。内聚性高说明各成员共同完成了一个或一组功能特性
好处:
- 稳定,维护成本低
- 可重用性高
- 责任清晰,易跟踪,易修改
方法:
- 在创建一个类的时候,想一下,这个类的功能是否与其他类的功能相似
- 让类的功能尽量集中,组件尽量小,避免创建很大的类
- 拆分太小也不行。
告知,不要询问
作为某段代码的调用者,开发人员绝不应该基于被调用对象的状态来做任何决策,更不能改变该对象的状态,这是被调用对象的责任。在对象之外替他做决策,违反了封装原则,而且为bug提供了土壤。
这一条我没理解。想象不出场景
根据契约进行替换
替换组件代码,其他代码无感知
通过替换遵循接口契约的类,来添加并改进功能特性。要多使用委托而不是继承。委托比继承灵活
文章标题:敏捷编码
本文作者:Benny
发布时间:2020-06-08, 19:49:33
最后更新:2019-10-09, 18:42:52
原始链接:https://benny233.github.io/2020/06/08/敏捷编码/版权声明: "署名-非商用-相同方式共享 4.0" 转载请保留原文链接及作者。