2010年10月13日 再次补充:这个笔记可以删了,大家请无视,包括下面的加粗黑体字。
之前写的一篇东西,现在看来问题很多:
http://yuan.iteye.com/blog/257923
(其实当前这篇也是我在摸索的过程中记录自己想法的一篇笔记,现在回头再看,认为有两个错误:1,TDD应该从Entity开始;错,自顶向下的TDD也可以从Controller甚至View开始。当然,也许有自底向上的,从Entity开始的,但我不会这么做,我觉得从需求入手更自然。这句话主要是错在“应该”那两个字,应改为“可以”。2、遇到接口就mock?错,stub和mock是有区别的。mock适用于那些创建成本很高的对象,比如HttpServletRequest。 当然这些也只是我现在的想法,之所以回来补充,是因为我发现有人在看我这些笔记,我不希望有人被我误导。其实我是个菜鸟。)
其中一个我自己也想不明白的问题就是:这里的接口是怎么来的?
这个问题我思考了很久,也在JavaEye搜索过很久,一直没有发现答案。
几乎我看过的所有描述TDD的帖子、资料、书籍——包括Test-Driven Design、Agile Java——都是先写出测试代码,然后写产品实现代码,没有见到过接口,那么接口到哪里去了?实际项目中那些Service、DAO可都是有接口的呀。唉唉,不该这么想……这么想的话岂不是让以前的做法、想法先入为主了?以前的想法是不对的(其实不能说不对,只是我觉得在采用TDD的方式开发时,所有一切的产生,包括接口,都应该是自然而然的——我需要它,所以它存在。)。TDD反对预先设计,接口不该是预先写好的,不该。
我能想到的、能接受的出现接口的场景只有下面这种:
写了段Stack的测试代码,然后用数组实现了一个栈。当我准备用链表再实现一个栈的时候,我发现我将要写的测试代码和前一个完全一样,这时候重构之前的类,使这两个类都实现同一个接口,测试代码针对接口测试。
这是接口的一个作用:切换实现。
可是项目中的那些接口怎么来的?(我怎么觉得我在思考一个老问题,似乎之前思考过……)
实在想不通的情况下,我找朋友开始讨论了。
我:我是在想,那接口是怎么出来的。
朋友:先写测试。再写接口。再写实现。。
我:再写接口干嘛?
朋友:写接口。。为什么不写接口呢?面向接口实现。。。这个是面向对象基础。。。
(这时候我应该反应过来的,其实我的问题跟以前初学Java不久时遇到的一样:为什么要有接口?但我当时一心想表达自己的想法,没意识到这个问题。不过很快,我就想到了。)
我:只有一种情况下我可能会写接口。就是比如说,我实现了2种栈,一种是用数组实现的,一种是用链表实现的。然后针对它们的测试代码完全一样,这时候重构。
朋友:这个方式不一样嘛。如果一开始你就预计到你要写接口。那就先接口
我:tdd不赞成预先设计
朋友:如果你100%确认这个是需要的。。。那你干嘛去返工呢?XP也讲究设计的。
我:我知道,但接口不应该是这么出来的。。
我:像我说的那种情况我才能接受。但往往代码只有一种实现,所以接口的主要用处并不是“切换实现”。
我:而是分离关注点……
我(终于想起来了……):哦。。我知道了。
我:TDD应该从Entity开始,Entity没有接口。写Entity需要用到与Entity逻辑无关的对象的时候,但你又不想去考虑这个无关对象具体实现的时候,接口就出来了。然后mock这个接口……
然后怎么着?然后一切就自然而然了。
p.s:在记录这些东西的时候,我在翻看聊天记录,发现朋友说的一些并不是没有道理,比如说这个:“实际上你写模型也是接口。最初的时候可以叫接口。比如你写了方法。但里面没实现。也是接口嘛。”也许这两句表达得不是很好,但我很清楚的知道他要说的意思,同时我明白了为什么后来他问我:“ruby有接口么?”只是我在思考一个问题的时候,不喜欢被另一个问题打断。好在这不是面对面的讨论,我可以先不看对方的文字,只顾发言、思考,否则像我这种本来就很容易分心走神的人思路肯定中断。所以我在公司里会议上从来不喜欢发言——因为被打断得太多了——只是在会议之后写些文字。我很明白发言之前为什么最好要先举手。——这后面的不重要,p.s而已。
分享到:
相关推荐
测试驱动开发.ppt”和“测试驱动开发—1.1_测试驱动开发简介.ppt”很可能包含了关于TDD的详细讲解,涵盖了TDD的概念、原则、实践技巧以及如何在实际项目中应用TDD等内容。这些资源对于学习和理解TDD至关重要,可以...
此外,TDD也要求开发者对产品需求和设计有着更深入的理解,从而使得开发出的产品更贴近用户需求。 在TDD的实践中,需要掌握一系列的方法和原则。例如,模块划分是将复杂系统分解为可管理的部分,而集成计划则是确定...
- **设计改进**:编写测试迫使开发者思考接口设计,使得代码更易于理解和测试。 - **提高信心**:大量的自动化测试可以给开发人员带来更大的信心,因为他们知道每次更改后都有安全网。 - **更好的文档**:测试...
测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,由Kent Beck提出并在其著作中倡导。然而,DHH(David Heinemeier Hansson)在其文章《TDD已死,长久测试》中表达了对TDD的质疑,认为TDD已经...
- **提高代码质量**:由于代码必须通过测试才能被认为是完成的,所以TDD通常能产生更健壮、更少bug的代码。 - **降低风险**:在开发过程中尽早发现并修复问题,避免了后期集成时可能出现的大规模错误。 - **更好的...
通过深入学习和分析这个"接口自动化源代码--自己练习部分",不仅可以增强对接口自动化测试的理解,还可以提升编程技能,为实际工作中的接口测试打下坚实的基础。记得在实践中不断探索和优化,将理论知识转化为实际...
总之,《测试驱动开发的3项修炼》是理解并掌握TDD的宝贵资源,它不仅介绍了技术层面的实践,也探讨了如何在团队中成功实施TDD,帮助开发者和团队领导者在TDD的丛林中找到前行的方向。通过阅读和应用书中的知识,可以...
8. 实战案例:可能包含实际项目中的TDD和ATDD应用示例,帮助读者理解和掌握这些技术。 总的来说,《Test Driven TDD and Acceptance TDD for Java Developers》这本书旨在帮助Java开发者掌握TDD和ATDD的核心概念和...
4. **测试驱动开发(TDD)**:TDD是一种先写测试再写实现的开发方式,书中解释了其背后的原理,以及如何通过TDD来提高代码质量并减少错误。 5. **异常处理**:异常处理是软件开发中的关键部分,书中讲解了如何有效...
在嵌入式系统中,TDD可以显著提高代码质量,减少错误,并促进模块化设计。测试用例通常由单元测试构成,通过断言来验证代码功能是否正确。使用TDD时,开发者需要遵循“红-绿-重构”原则:先写失败的测试(红),然后...
7. **测试驱动开发(TDD)**:TDD是一种先写测试再写实现的编程方式,书中解释了为何TDD能促进代码质量。 8. **性能优化**:讨论了何时以及如何进行性能优化,避免过早优化,同时也讲述了如何使用各种性能分析工具。 ...
**测试驱动开发(Test-Driven ...在项目"tdd-jbrains"中,可能包含了一些示例代码和测试用例,用于演示如何在Java环境中运用TDD。通过学习和实践这些代码,你可以加深对TDD的理解,并提升自己的Java编程技能。
1. **代码规范**:书中强调了遵循统一的编码风格和命名约定的重要性,这不仅有助于团队协作,还能使代码更易于理解和调试。例如,使用有意义的变量名,遵循缩进规则,以及避免过长的函数和过深的嵌套。 2. **注释与...
在“测试驱动开发的艺术”中,我们可以通过前三章深入理解TDD的核心理念和实践技巧。 首先,"第一个测试"是TDD过程的起点。在开始任何编码工作前,开发者应编写一个失败的单元测试,这个测试明确地定义了待开发功能...
3. **提升设计**:编写测试的过程促使开发者思考接口设计,使代码更易于理解和维护。 4. **更好的文档**:测试用例本身就是一种形式的文档,说明了代码应该如何使用和期望的行为。 四、TDD的挑战与应对策略 1. **...
测试驱动开发(Test-Driven Development,简称TDD...通过研究`TDD_study`文件,我们可以深入理解如何在Eclipse环境中设置和运行测试,以及如何根据测试结果调整和优化代码。这将是一个学习TDD和Java编程实践的好资源。
书中阐述了TDD如何辅助安全地修改代码,确保改动不会引入新的错误。 4. **错误处理**:良好的错误处理机制是代码稳定性的保障。书中讨论了异常处理、错误码返回和防御性编程等策略,以减少程序因错误崩溃的可能性。...