`

翻转句子的TDD讨论:)

阅读更多
http://www.iteye.com/topic/122472?page=1
需求:把字符串"Tdd is a software devolopment technology" 按照单词反转为
"technology devolopment software a is Tdd"
是看了这个帖子后一直有困惑。直接促成了我找了Kent Beck大的Test-Driven Development
By Example来看。自此进入TDD的世界。其实这题目和书后面的那个fibonacci的解法一样。
关键在于:“分解多项式” 且听我忽悠..

import junit.framework.TestCase;
public class NewStringReverserTest extends TestCase{
	//"a b" - "b a"
	public void testSimpleReverse(){
		assertEquals("b a", reverse("a b"));//从最简单的情况开始
	}

 	private String reverse(String string) {		
		return "b a";//最“直接”的实现,绿了吧- -!
	}
}


public class NewStringReverserTest extends TestCase{
	...
	private String reverse(String string) {		 	
		return "b"+" "+"a";//拆,为什么这么拆? 往下看
	}
}

public class NewStringReverserTest extends TestCase{
	...
	private String reverse(String string) {	
                //要拆得有意义,注意描述= =
                //其实是一个一个拆的,每步都执行test,边绿边拆...小步快跑	 	
		String splitToken = " ";
		String preWord = "a";
		String postWord = "b";
                //下面其实是业务逻辑了,看后面的postWord被放在了前面——所谓的交换
		return postWord + splitToken + preWord;
	}
}


public class NewStringReverserTest extends TestCase{
	...
	private String reverse(String inputString) {	               
		String splitToken = " ";
                //实现切词逻辑
		String preWord =    inputString.substring(0,inputString.indexOf(splitToken));
		String postWord = inputString.substring(inputString.indexOf(splitToken)+1);               
		return postWord + splitedToken + preWord;
	}
}

ok 目前为止似乎无法继续了。那么继续添加test描述需求:"a b c"-"c b a"
public class NewStringReverserTest extends TestCase{
	//"a b" - "b a"
	public void testSimpleReverse(){
		assertEquals("b a", reverse("a b"));
                assertEquals("c b a", reverse("a b c"));//红了吧?- -
	}
        ...
}

Expected:c b a Actual:b c a
好吧 分析下:bc 反了,bc看做一个整体,再“交换”一次就ok了,即: reverse("b c")+"a"
        private String reverse(String inputString) {	               
		...          
		return reverse(postWord) + splitToken + preWord;
	}

还是会红,debug发现“切到剩一个词”了就不能切了嘛= =
        private String reverse(String inputString) {	
                int tokenIndex = inputString.indexOf(splitToken);
		if (tokenIndex == -1)
			return inputString;
		String prePart = inputString.substring(0, tokenIndex);
		String postPart = inputString.substring(tokenIndex + 1);               
		//描述为prePart,postPart 更符合语义,也是一步重构吧        
		return reverse(postPart)+ splitToken + prePart
	}

这下绿了,想想其实prePart其实是reverse(prePart)
另外把那个需求的test加上 看看符合需求否?
       public class NewStringReverserTest extends TestCase {
	// "a b" - "b a"
	public void testSimpleReverse() {
		assertEquals("b a", reverse("a b"));
		assertEquals("c b a", reverse("a b c"));
                assertEquals("Tdd is a software devolopment technology",  reverse("technology devolopment software a is Tdd"));

	}

	private String reverse(String inputString) {
		String splitToken = " ";
		int tokenIndex = inputString.indexOf(splitToken);
		if (tokenIndex == -1)
			return inputString;
		String prePart = inputString.substring(0, tokenIndex);
		String postPart = inputString.substring(tokenIndex + 1);
		return reverse(postPart) + splitToken + reverse(prePart);
	}

	public void testReverseWithSingleWords() {
		assertEquals("a", reverse("a"));
	}

	public void testReverseWithSplitTokenIn() {
		assertEquals(" ", reverse(" "));
		assertEquals("   ", reverse("   "));
		assertEquals("   a", reverse("a   "));
		assertEquals("b a", reverse("a b"));
		assertEquals("c b a ", reverse(" a b c"));
		assertEquals("c b a", reverse("a b c"));
	}

}


最后总结:"a b c"到"c b a"
原来是a b c->[b c] a->[c b] a
2
1
分享到:
评论
2 楼 woods 2008-05-07  
My google SVN
# Project:mouse-action 
# http://code.google.com/p/mouse-action/

# Non-members may check out a read-only working copy anonymously over HTTP.
svn checkout http://mouse-action.googlecode.com/svn/trunk/ mouse-action-read-only

1 楼 woods 2008-05-07  
一直在想最后一步”prePart 其实是reverse(prePart) ”没啥必要= =

今天突然发现,其实这对某些情况很有意义:
reverse(postPart) + splitToken + reverse(prePart);

这不描述了这个问题的实质嘛- -#
完全可以多线程分成多个part来处理,最后再合成嘛- -#
这对提高效率,处理超大文件超有意义- -#

TDD的“副作用”? :-)

相关推荐

    C-C++项目的测试驱动开发(TDD):从单元测试到集成测试.md

    在C/C++项目中应用测试驱动开发(TDD)的方法,从单元测试到集成测试,详尽介绍了测试的基础、框架选择、实际应用及最佳实践。文章首先阐述了TDD的核心理念及其优势,包括提升代码质量、减少错误和改进设计等。接着...

    云杉测试:通过云杉体验平台中的3条法律进行TDD。 :shield:

    在IT行业中,Test-Driven Development(TDD)是一种软件开发实践,它强调编写测试用例在实际编写功能代码之前。这种做法确保了代码的质量,并且能够及时发现和修复问题。"云杉测试"可能是指一个特定的测试框架或工具...

    tdd1t:GitHub的Probot,可确保您的功能规格与测试相匹配

    tdd1t 支持您的TDD努力的机器人 一个GitHub应用程序,用于根据“拉取请求”中提交的测试检查功能规范。 设置 # Install dependencies npm install # Run the bot npm start 贡献 如果您对如何改进tdd1t有任何建议,...

    nodejs-tdd-learn:使用NodeJS和TDD进行项目:test_tube::beaming_face_with_smiling_eyes:

    接下来,我们将详细讨论Node.js和TDD在实际项目中的应用: 1. **Node.js介绍**:Node.js基于Chrome V8引擎,提供了丰富的非阻塞I/O库,使其在处理网络服务和实时应用时表现出高效性能。它使用事件驱动、异步编程...

    demo-tdd1:演示测试驱动的Spring-boot开发

    标题中的“demo-tdd1”是一个项目名称,意在展示如何使用测试驱动开发(Test-Driven Development, TDD)的方法来构建一个基于Spring Boot的应用程序。Spring Boot是Java生态系统中的一个流行框架,它简化了创建独立...

    TDD 测试驱动开发 文档 详细

    7. TDD的挑战与陷阱:讨论可能遇到的问题,如过度测试、测试驱动的反模式,以及如何避免它们。 总之,这个压缩包提供了一套全面的TDD学习资源,适合Java开发者深入理解和实践测试驱动的开发方式。通过系统学习并...

    TDD:通过大量测试寻找最优解决方案.docx

    标题中的"TDD"指的是Test-Driven Development,即测试驱动开发,是一种软件开发方法论,强调在编写实际代码之前先编写测试用例。这种方法的核心理念是通过编写测试来定义需求,确保代码的质量和功能完整性。TDD的...

    Test Driven: Practical TDD and Acceptance TDD for Java Developers (PDF英文版)

    《Test Driven: Practical TDD and Acceptance TDD for Java Developers》是一本专注于Java开发者进行测试驱动开发(TDD)和验收测试驱动开发(Acceptance TDD)的专业书籍。这本书以PDF英文版的形式提供,旨在帮助...

    Ruby-TDD实战TestDrivenDevelopmentinAction

    **Ruby-TDD实战:Test Driven Development in Action** 在软件开发领域,Test-Driven Development(TDD)是一种编程实践,它强调先编写测试用例,然后编写满足这些测试的最小功能代码。Ruby作为一种动态、灵活的...

    tdd:在 JAVA 中学习 TDD @odd-e

    标题 "TDD:在JAVA中学习TDD @odd-e" 提到的是Test-Driven Development(测试驱动开发,简称TDD)在Java编程语言中的实践。TDD是一种软件开发方法论,强调先编写测试用例,然后编写刚好足够通过测试的生产代码。这种...

    TDD测试驱动开发

    测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,强调在编写实际功能代码之前,先编写测试用例。这种方法的核心理念是“先写测试,再写代码”。TDD通过引入测试来引导软件设计,使得开发过程...

    tdd:简单的TDD实现

    测试驱动开发(Test-Driven Development,简称TDD)是一种软件开发方法,强调在编写实际功能代码之前先编写测试用例。TDD的核心理念是“先写测试,再写代码”。这个过程可以分为三个主要步骤:红、绿、重构。 1. **...

    TDD测试驱动开发(Kent Beck) 讲解代码(C#)

    测试驱动开发(Test-Driven Development, 简称TDD)是一种软件开发方法,由Kent Beck在其著作中提出。在TDD中,测试是开发过程的先驱,开发者首先编写测试用例,确保它们失败,然后编写最小化的代码来使这些测试通过...

    phaser_tdd:示例 TDD 移相器

    Phaser TDD 示例:探索测试驱动开发在游戏开发中的应用 在JavaScript开发领域,Test-Driven Development(TDD)是一种广泛采用的编程方法,它强调先编写测试用例,然后根据这些测试用例来实现功能代码。在这个...

    phpunit-TDD驱动开发

    ### 使用PHPUnit进行TDD驱动开发 #### 一、引言 测试驱动开发(TDD, Test-Driven Development)是一种软件开发方法论,它要求在编写实际功能代码之前先编写测试用例。通过这种方式,可以确保代码的质量,并且有助...

    FizzBuzz-TDD:研究TDD的项目

    FizzBu​​zz TDD 关于 研究测试驱动开发(TDD)的项目。 锻炼: 编写一个程序,打印从1到100的数字。但是,对于三个打印数字“ Fizz”(而不是数字)的倍数,以及五个打印“嗡嗡声”的倍数。 对于三和五的倍数的...

    flaskr-tdd:Flaskr:Flask,测试驱动开发(TDD)和JavaScript简介

    无论如何,我想通过添加测试驱动开发(TDD),一些JavaScript和部署使本教程更进一步。 这篇文章就是该教程。 请享用。 另外,如果您一般不熟悉Flask和/或Web开发,那么掌握以下基本概念很重要: GET和POST请求...

    tdd-tutorial:TDD教程

    3. 在Java中使用TDD: - **JUnit**:JUnit是Java最常用的单元测试框架,用于编写和运行测试用例。了解断言、测试注解(如@Test、@Before、@After)以及如何组织测试类是关键。 - **Mockito**:Mockito允许我们创建...

Global site tag (gtag.js) - Google Analytics