切换导航
首页
技术问答
编程语言
前端开发
移动开发
开发工具
程序设计
行业应用
CMS系统
服务器
频道导航
▸ PHP
▸ Java
▸ Java SE
▸ Python
▸ C#
▸ C&C++
▸ Ruby
▸ VB
▸ asp.Net
▸ Go
▸ Perl
▸ netty
▸ Django
▸ Delphi
▸ Jsp
▸ .NET Core
▸ Spring
▸ Flask
▸ Springboot
▸ SpringMVC
▸ Lua
▸ Laravel
▸ Mybatis
▸ Asp
▸ Groovy
▸ ThinkPHP
▸ Yii
▸ swoole
▸ HTML
▸ HTML5
▸ JavaScript
▸ CSS
▸ jQuery
▸ Bootstrap
▸ Angularjs
▸ TypeScript
▸ Vue
▸ Dojo
▸ Json
▸ Electron
▸ Node.js
▸ extjs
▸ Express
▸ XML
▸ ES6
▸ Ajax
▸ Flash
▸ Unity
▸ React
▸ Flex
▸ Ant Design
▸ Web前端
▸ 微信小程序
▸ 微信公众号
▸ iOS
▸ Android
▸ Swift
▸ Hybrid
▸ Cocos2d-x
▸ Flutter
▸ Xcode
▸ Silverlight
▸ cocoa
▸ Cordova
前端之家
设计模式
TDD,测试代码可以代替文档吗?
TDD,测试代码可以代替文档吗?
2020-04-19
设计模式
前端之家
前端之家
收集整理的这篇文章主要介绍了
TDD,测试代码可以代替文档吗?
,
前端之家
小编觉得挺不错的,现在分享给大家,也给大家做个参考。
曾经,我认为只要做好详细设计工作,软件编码就成为一种体力活。在我印象中传统软件工程理论好像是这么说得:分析和设计是软件生产过程中最重要的两个阶段,好的设计产生好的结果,坏的设计产生坏的结果,详细设计文档是软件过程中最重要的部分,甚至比
代码
还重要。国内某人的书中还提到,“只要有了详细设计,哪怕原来的开发人员都离开了,换一批人照着详细设计仍然能把软件做完”。一提到详细设计我的脑子里也已经出现了这样的影子:长长的(或者厚厚的)文档,详细到每个
函数
,甚至是每个
函数
参数的名字都定义好了,用这样的详细设计指导
代码
编写应该是一件多么惬意的事情啊。我推崇这种事无巨细的详细设计,认为只要是设计好就能够适应变化,并把软件项目的失败归咎与设计人员的知识、能力或经验不足。这种想法持续了很长时间,直到我有了实际软件项目的经验并开始单独做设计为止。 促使我思想转变的原因就是两个字:变化。我原来也知道变化对设计的影响,但是还是低估了变化对设计带来的冲击。现实中的详细设计只是一个看上去很美的东西,开始编写
代码
一个月后的详细设计就基本上不能指导
代码
编写了,甚至变成和实际
代码
完全两回事的东西,成了一堆废纸,原因还是那两个字:变化。是的,变化,在某个时间已经很缜密的设计,在下个时间就会变得漏洞百出,因为计划赶不上变化,通常情况下,详细设计文档从其完成的那一刻起就开始散发出“腐败”的味道。只有没有任何软件开发经验的人才会天真地认为一次做好完备的详细设计,然后就可以在其指导下完成软件开发,最终得到产品。 在传统的软件过程中,面对逐渐散发出“腐败”味道的设计文档,通常有两种对策,一种是安排专职的文档开发人员,每次在
代码
中
修改
设计都及时更新到设计文档中,以保持文档的“新鲜”。其实这种
方法
也只是一种看上去很美的东西,且不说多数项目组都不会有多余的人手专职做文档开发(有哪个项目组敢在项目还在进行中就说自己的人手足够了?),就算有这样一个文档开发人员,那么是否每次设计上的小
修改
都会
通知
到他(她)呢?显然不会,他(她)必须Review每一个开发人员的
代码
,并与大家随时沟通,发现与原始设计不一致的
修改
,这样会累死人的。那么是否可以由开发人员自己负责维护与自己工作相关的那部分文档呢?试想一下,当轰轰烈烈地
代码
编写开始后,或者头顶着产品交付倒计时牌,开发人员是否还有“闲情逸致”时不时停下正在Coding的手去重新
修改
一下设计文档呢?另一种对策是任由设计文档慢慢“腐败”,把主要力量集中在
代码
上,毕竟最终交付产品依靠
代码
而不是设计文档。这种情况下原来花费大量时间完成设计文档纯粹是浪费时间,哪怕是对自己人也没有丝毫用处,如果我是这个项目组中补充进来的新人,看到这样的文档和那样的
代码
,可能会得精神分裂症。 所以在敏捷(Agile)的词汇表里已经没有详细设计这个词汇了,取而代之的是“够用设计”,就是所谓的Not less not more, just enough。那么在敏捷这种短迭代周期,
快速
反馈体系中,是否还有必要编写一份用自然语言或图表展示的详细设计文档呢?Jack W.Reecves在他的论文《什么是软件设计?》中提出了“源
代码
就是设计文档”的观点,Jack说得设计文档和我本文提到的设计文档还不是同一个概念,我把他的观点引用在这里主要是为了和另一个观点做对比。Jack认为,“任何工程活动的最终目标都是某些类型的文档。当设计工作完成时,设计文档就被转交给制造团队。该团队是一个和设计团队完全不同的群体,并且其技能也和设计团队完全不同”【1】,由此看来,如果源
代码
不是文档,那么软件开发人员就不能被称为是工程师了,他们就和建筑工地上的工人一样,只是一群Builder。是否可以用源
代码
代替任何用自然语言描述的文档呢?我看还不太可行,源
代码
相对于自然语言来说过于晦涩,只有开发人员能够读懂(即便是开发人员,也不是所有人都能理解所有
代码
),显然制约了源
代码
作为文档的用途。不是有人在研究用自然语言编程序吗,如果这样的类似自然语言的源
代码
作为文档,倒是很合适。 上文提到,有一个与之对比的观点,那就是用测试
代码
代替源
代码
作为设计文档,但是前提条件是:使用TDD作为开发模式。很显然,源
代码
产生以后做单元测试用的测试
代码
已经失去了作为设计文档的前提,那就是每次迭代的设计文档必须早于或不晚于本次迭代的源
代码
产生出来。因为作为单元测试的测试
代码
是为已经存在的源
代码
量身定做的,并且已经受到这些
代码
的思维定势影响,失去了“设计”的意义。做为测试先行的TDD本身就是一个分析、设计、实现的过程,而测试
代码
又是这个过程的产物,测试
代码
理所当然的就是设计文档了。加之TDD要求在编写任何
代码
之前要先完成测试用例,这就是说任何新
代码
(新加的模块)都有配套的测试
代码
,自然而然的,测试
代码
就成为了新
代码
的描述文档,其中包含了如何建立使用新模块以及期望达到什么样的
效果
,而这正式设计文档的主要
功能
。源
代码
不适合取代自然语言的文档,因为源
代码
过于
功能
细化,逻辑纷繁复杂,分支和
跳转
加剧了理解
代码
的困难,缺乏对整个模块的宏观表达能力。与源
代码
相比,测试
代码
显然“单纯”很多,测试
代码
侧重于使用源
代码
,通常可以用作源
代码
的一份sample,所以它对整个模块的宏观表达能力要强于源
代码
。另外,测试
代码
通常是线性结构,比较容易看懂,从可理解性上看,测试
代码
比源
代码
更接近自然语言,因此测试
代码
比源
代码
更适合作为软件的设计文档。 那么测试
代码
是否可以完全取代自然语言形式的设计文档呢?我看还不行,原因有三: 其一,测试
代码
虽然比源
代码
容易理解,但它仍然是
代码
,不是所有人都能理解的; 其二,测试
代码
的宏观表达能力还是不如自然语言或图表; 其三,很多人习惯看
文字
而不是看
代码
,彻底改变人的习惯很难。 所以在TDD开发过程中,比较好的形式是自然语言的文档和测试
代码
相结合,用自然语言的文档做一个够用的设计就行了,这个设计只要详细到模块关系这一级别就足够了,各个模块的详细设计就由测试
代码
充当。 不管是“源
代码
就是文档”的观点还是“测试
代码
就是文档”的观点,目的都只有一个,那就是消除那些浪费人力物力做出来的、没用的、总是散发着“腐败”味道的东西。 [1] Jack W.Reecves. 什么是软件设计. 2002.
上一篇:利用文件锁,实现单一线程运行
下一篇:只有通过实践才能真正了解TDD
猜你在找的设计模式相关文章
适配器模式-让不兼容的接口得以适配
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合...
作者:前端之家 时间:2021-02-24
策略模式-定义一个算法族
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独...
作者:前端之家 时间:2021-02-24
设计模式之高质量代码
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的...
作者:前端之家 时间:2021-02-24
模板方法模式-封装一套算法流程
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在...
作者:前端之家 时间:2021-02-24
迭代器模式-统一集合的遍历方式
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
作者:前端之家 时间:2021-02-24
单例模式的五种实现方式及优缺点
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
作者:前端之家 时间:2021-02-24
组合模式-统一的处理个别对象与组合对象
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方...
作者:前端之家 时间:2021-02-24
装饰者模式-动态的包装原有对象的行为
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
作者:前端之家 时间:2021-02-24
观察者模式-将消息通知给观察者
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候...
作者:前端之家 时间:2021-02-24
代理模式-访问对象的代理而非其本身
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下...
作者:前端之家 时间:2021-02-24
编程分类
算法
设计模式
多媒体技术
正则表达式
Elasticsearch
Flink
Hadoop
IDE
最新文章
• 适配器模式-让不兼容的接口
• 策略模式-定义一个算法族
• 设计模式之高质量代码
• 模板方法模式-封装一套算法
• 迭代器模式-统一集合的遍历
• 外观模式-简化子系统的复杂
• 单例模式的五种实现方式及
• 组合模式-统一的处理个别对
• 装饰者模式-动态的包装原有
• 观察者模式-将消息通知给观
热门标签
更多 ►
受约束
摘*
day25
Java常用类库
置信
lamda
留存
持续录入
年后
正则表达式30
3.17
regularexpre
匹
多模
适
20130322
基础理论
pathmunge
涵义
reec
tok
需要转义的特
资源分享
validationex
简明魔法
里弄
形如
源码实现
完备
actionscript