InfoQ

新闻

使用高度抽象的DSL来减轻测试负担?

作者 Sadek Drobi译者 李剑 发布于 2007年10月19日 上午3时35分

社区
Architecture,
Agile
主题
设计,
领域特定语言,
敏捷技术,
单元测试,
建模
标签
测试驱动开发,
商业模式,
协作技术,
面向语言编程
用户界面和用户期待,也即用户模型之间的不一致性,是bug的一个重要来源。如果没有面面俱到的信息来描述软件的工作方式,那么用户就会觉得它的行为是不可预知的。Leonardo Vernazzade的观点是,用户和UI所使用的并不是同一种语言,所以需要进行翻译。

他在自己最近的blog上说到,“语言之间的差异越大,翻译时出现的问题也会越多”,同时,为了保证翻译的一致性而带来的测试压力也就越大。所以,在很多 情况下,比较好的解决方式就是提供一个用户模型和用户界面可以共享的“高度抽象的语言”,也就是领域特定语言(DSL)。这可以帮助我们避免翻译和相应的 测试所造成的浪费。Leonardo认为,从更通用的角度来说,提高抽象级别可以减轻测试负担,而且这一做法可以被应用到任何其他模型中,如软件设计、实 现等等: 

当你站在合适的抽象层次上表达一些事情的时候,就无需测试了,[……]你会对C#或者Java中的+=运算符进行测试么?反正我不会。

Andres Aguiar也曾经在他的blog上谈论说,如果我们在完善抽象这一方面投入足够的精力,那么就没有必要进行TDD,甚至是单元测试了。但还是有一些问题是需要考虑周全的。

使用DSL来减轻测试的负担,其前提就是要对DSL本身进行彻底的测试。Leonardo Vernazza声称,“在大多数情况下,这比测试所有的用户界面要简单的多,而且工作量也会大大减少”。这种方法会带来“责任的再分配”,把测试的负担转移到DSL的作者身上。不过Gareth Jones相信,“很多DSL的作者都不会用大量的语言变量来测试他们的代码生成器”。

Scott Bellware在Andres Aguiar的帖子后面着重说到, 判断“抽象所固有的最佳层次”并非易事,但Brad Head指出,这正好就是TTD所做的事情:“用‘试试看’来挑战你的设计抽象”。然而Ron Scott却争论说,TDD是用来找出代码中的变化是否造成了破坏的手段。Bellware实际上所强调的是,如果一个经过设计优化的DSL“功能上已经 全部完成,不再变化”,那么要是想通过关注业务或是技术领域来推进DSL的发展的话,那它就无法再像从前一样为我们带来同样的价值。

您是怎样看待抽象 vs. 测试的呢?你认为可以用DSL来减轻测试的负担么?

查看英文原文High abstraction level of DSLs to reduce the testing burden?

相关赞助商

InfoQ中文站敏捷社区,关注敏捷软件开发和项目管理,通过新闻、深度文章、视频访谈和演讲以及迷你书等为中国技术社区提供一流资讯。

5 条回复

回复

貌似很cool 发表人 cao yunfei 发表于 2007年10月21日 上午2时37分
不同意Ron Scott说的:TDD是用来找出代码中的变化是否造成了破坏的手段 发表人 小 熊 发表于 2007年10月21日 上午3时26分
Re: 不同意Ron Scott说的:TDD是用来找出代码中的变化是否造成了破坏的手段 发表人 凉粉 小刀 发表于 2007年10月22日 上午2时45分
对于一个DSL,怎么样才算是design-tuned呢? 发表人 小 熊 发表于 2007年10月21日 上午3时37分
Re: 对于一个DSL,怎么样才算是design-tuned呢? 发表人 小 熊 发表于 2007年10月21日 上午3时38分
  1. 返回顶部

    貌似很cool

    2007年10月21日 上午2时37分 发表人 cao yunfei

    编程由编写商业逻辑转为编写书写商业逻辑的DSL,看起来很cool。从逻辑上讲应该会带来更的错误,只不过错误的分布与以前不同了。部分错误转移到DSL中了。这样的情况下出了bug后程序员不仅要在应用中找bug,也要在DSL中找。不要假设DSL没有错误,在真实工作环境中这不成立。

  2. 如果只是一个类似于扫雷器的工具,那么TDD还能受到现在这样的重视么?虽然我的TDD经验并不丰富,但是我确实体会到了test是如何drive design的。再看TDD的英文,TEST DRIVEN DESIGH。可将Test Driven看作是对design的修饰。

  3. 返回顶部

    对于一个DSL,怎么样才算是design-tuned呢?

    2007年10月21日 上午3时37分 发表人 小 熊

    它的内涵和外延在哪里?如果statically locked down了,那么这个DSL能说是design-tuned吗?敏捷的重要作用是减少浪费,使用DSL,并对其进行设计优化,也应该是为了这个目的。根据边际效应递减原理,优化到某种程度之后,再做新的努力,不但不会提升整体,反而有可能产生新的浪费。也因为如此,文中提到的“如果一个经过设计优化的DSL‘功能上已经 全部完成,不再变化’,那么要是想通过关注业务或是技术领域来推进DSL的发展的话,那它就无法再像从前一样为我们带来同样的价值。”,从约束理论(《拥抱变化》中也有相关内容)来看,要确定当前影响产出的最大瓶颈在哪里,再对症下药。当然,如果是从纯技术的角度考虑DSL的发展,无可厚非,那就不要再幻想它能够像一开始那样带来同样的价值了。

  4. 返回顶部

    Re: 对于一个DSL,怎么样才算是design-tuned呢?

    2007年10月21日 上午3时38分 发表人 小 熊

    加链接没加上,Amr Elssamadisy 关于约束理论的文章:http://www.agilejournal.com/articles/articles/theory-of-constraints,-lean,-and-agile-software-development.html

  5. 我觉得Ron Scott说的就是扯淡

独家内容

运用Ruby纤程进行异步I/O:NeverBlock和Revactor

Ruby 1.9的纤程(Fibers)和非阻塞I/O越来越收到关注了。我们对来自NeverBlock项目的Mohammad A. Ali和来自Revactor项目的Tone Arcieri进行了访谈。

与杨巍一起探讨OpenSocial

InfoQ中文站有幸与Google中国的产品经理杨巍先生在一起探讨了OpenSocial的相关话题,包括OpenSocial的初衷、构成要素、实现方式、以及要实现它的技术储备等等。

书评:敏捷模式──指向成功的路标

Ryan Cooper对Amr Elssamadisy的新书发表了评价,并认为书中提供了一种为实施敏捷量身定做的框架。本书并没有给出一种人人可用的敏捷方法,而是为读者提供一些模式和工具,用以找出哪些敏捷实践可以最有效地达到该组织机构的特定目标。

构建的可伸缩性和达到的性能:一个虚拟座谈会

这个由业界主要专家们参加的座谈会探究了在使应用程序具备尽可能好的伸缩性及性能的过程中所面临的挑战和思考过程。

OpenSocial的分析与实现

本视频主要对OpenSocial进行了分析,并对实现的方式进行了介绍。其中包括:OpenSocial的开发经验、Container Provider的技术准备、平台的构成要素、具体的规范、以及对未来的展望。

缓存系统MemCached的Java客户端优化历程

Memcached在大型网站被应用得越来越广泛,但是Java客户端并不多,本文作者基于现有的开源客户端进行了封装优化,并翔实记录了这一过程。

超越SOA:动态业务应用的新企业应用框架(2)

在他们文章的第二部分,作者探讨了动态业务应用的架构并介绍了资源容器的概念。他们示范了如何在JEE之上构建这个架构,以及它如何影响实现生产力。

使用ClickOnce细分发布版本

ClickOnce让WinForms应用程序的部署轻而易举。David Cooksey演示了如何在ASP.NET中编写一个HttpHandler来实现对ClickOnce部署的版本细分。