实践是绝对必需的。我们会遵循这原则,确保你明确知道项目的正确状态,而不是主观臆测。
经常的监督 - 频繁反馈以确保代码不会变坏。如何让守护天使来监督你的代码。
防止你设计的接口或API变得笨重和难用,这时,你就要先用它再实现它。
可以看到为什么不同环境,就有不同问题。
自动验收测试来保证代码是正确的。
甘特图、PERT图或者日历工具。其实,你想要的是能度量真实的进度。
需要再倾听用户的声音。
编写能产生反馈的代码。
敏捷式的单元测试正是采取了相同、相似的过程,并且还让其更上一层楼。不用扔掉桩程序,你把它保存下来,还要让其可以自动化地持续运行。
用代码来测试变量的具体值(以及跟踪运行了多少个测试)。
清楚自己要测试的内容:
只要有了单元测试,就要让它们自动运行。
在后台架设一个构建机器,不断获得最新版本的源代码,然后编译代码,并运行单元测试,如果有任何错误它会让你及时知道。
结合本地单元测试,运行每个编译,构建机器不断编译和运行单元测试,这样你就拥有了一个守护天使。
如果你是一个新手,建议阅读《单元测试之道》。如果想要自动化地连接单元测试,可以阅读《项目自动化之道》。
开始单元测试的理由:
使用自动化的单元测试。好的单元测试能够为你的代码问题提供及时的警报。如果没有到位的单元测试,不要进行任何设计和代码修改。
编码之前,先写测试。
什么是成功地实现特定功能的最低成本。总之,程序员很容易走向另一个极端——一些不必要的过于复杂的事情——测试优先会帮助我们,防止我们走偏。
好的设计不意味更多的类。
TDD有机会让你编写代码之前(或者至少在深入到实现之前),可以深思熟虑将如何用它。这会迫使你去思考它的可用性和便利性,并让你的设计更加注重实效。
当然,设计不是在开始编码的时候就结束了。你需要在它的生命周期中持续地添加测试,添加代码,并重新设计代码。
先用它再实现它。将TDD作为设计工具,它会为你带来更简单更有实效的设计。
每次在修改或者重构代码的时候,在提交代码之前,你会运行测试用例。那么现在所要做的就是在各种支持的平台和环境中运行这些测试用例。
使用自动化会节省时间。
持续集成。
用一个持续集成工具,周期性地从源代码控制系统中取得代码,并运行代码。
要在多个平台上测试,你只要为每个平台设置持续集成系统就行了。
不同环境,就有不同问题。使用持续集成工具,在每一种支持的平台和环境中运行单元测试。要积极地寻找问题,而不是等问题来找你。
有一个办法可以使验收测试不同于单元测试。你应该让用户在不必学习编码的情况下,根据自己的需要进行添加、更新和修改数据。你有很多方法来实现它。
FIT,即集成测试框架,它很实用,可以更容易地使用HTML表格定义测试用例,并比较测试结果数据。
使用FIT,客户可以定义带有新功能的使用样本。客户、测试人员和开发人员(根据样本)都可以创建表格,为代码描述可能的输入和输出值。开发人员会参照带有正开发的代码结果的FIT表格中的样本编写测试代码。测试结果成功或者失败,都会显示在HTML页面中,用户可以很方便地查阅。
为核心的业务逻辑创建测试。让你的客户单独验证这些测试,要让它们像一般的测试一样可以自动运行。
不应该去计算工作量完成的百分比,而应该测定还剩下多少工作量没有完成。
花费的时间很可能要比最初估计时间长。没有关系,我们希望这能作为下一次的参考。在为下一个任务估计工作量时,可以根据这次经验调整评估。
如果能一直让下一步工作是可见的,会有助于进度度量。最好的做法就是使用待办事项。
待办事项就是等待完成的任务列表。
度量剩下的工作量。不要用不恰当的度量来欺骗自己或者团队。要评估那些需要完成的待办事项。
当出了错误,你要尽可能地提供详细信息。
每一个抱怨的背后都隐藏了一个事实。找出真相修复真正的问题。
在开发过程中便细心“照看”代码。在编写代码时,每天付出一点小的努力,可以避免代码“腐烂”,并且保证应用程序不至变得难以理解和维护。
都易于理解、扩展和维护。
代码要清晰地表达意图。
用代码沟通。
动态评估取舍。
增量式编程。
编写内聚的代码。
告知,不要询问。
通过设计能够根据契约进行替换的系统。
更注重可读性,代码清晰程度的优先级应该排在执行效率之前。
代码必须明确说出你的意图,而且必须富有表达力。
要编写清晰的而不是讨巧的代码。向代码阅读者明确表明你的意图。可读性差的代码一点都不聪明。
利用代码本身;利用注释来沟通代码之外的问题。
要尽量避免使用神秘的变量名。
注释可用来为读者指定一条正确的代码访问路线图。
可能要说明以下信息:
用注释沟通。使用细心选择的、有意义的命名。用注释描述代码意图和约束。注释不能替代优秀的代码。
要想让应用成功,降低开发成本与缩短上市时间,二者的影响同样重要。
没有适宜所有状况的最佳解决方案。你必须对手上的问题进行评估,并选出最合适的解决方案。
动态评估权衡。考虑性能、便利性、生产力、成本和上市时间。
采用增量式的编程方式。增量式编程可以精炼并结构化你的代码。代码被复杂化、变成一团乱麻的几率减少了。所开发的代码基于即时的反馈,这些反馈来自以小步幅方式编写代码和测试的过程。
采取增量式编程和测试,会倾向于创建更小的方法和更具内聚性的类。
在很短的编辑/构建/测试循环中编写代码。
简单不是简陋。
优雅的代码第一眼看上去,就知道它的用处,而且很简洁。
内聚性用来评估一个组件(包、模块或配件)中成员的功能相关性。内聚程度高,表明各个成员共同完成了一个功能特性或是一组功能特性。
类也要遵循内聚性。
内聚性会影响一个组件的可重用性。
让类的功能尽量集中,让组件尽量小。要避免创建很大的类或组件,也不要创建无所不包的大杂烩类。
将命令与查询分离开来。
告知,不要询问。不要抢别的对象或是组件的工作。告诉它做什么,然后盯着你自己的职责就好了。
Liskov替换原则[Lis88]告诉我们:任何继承后得到的派生类对象,必须可以替换任何被使用的基类对象,而且使用者不必知道任何差异。
那么继承和委托分别在什么时候使用呢?