`

结对编程与TDD结合开发实践

阅读更多

        结对编译与TDD结合的方式是:首先,第一个人写一个失败的单元测试,第二个人写代码让这个单元测试通过,然后第二个人再写一个失败的单元测试,交给第一个人,他再写代码让其通过...依次交替,直至完成。写代码之前或完成编码单元测试通过后都可对代码进行重构。

训练题目:机器人探查火星

RobotTest.java

package com.study.robot.test;

import org.junit.Assert;
import org.junit.Test;

import com.study.robot.ControlCenter;
import com.study.robot.Position;
import com.study.robot.Robot;

public class RobotTest {

	@Test
	public void test_turn_left() {
		Position position = new Position(0, 0, "N");
		Robot robot = new Robot(position);

		robot.command("L");
		
		Position resultPosition = robot.position; 
		Assert.assertEquals(new Position(0, 0, "W"), resultPosition);
	}

	@Test
	public void test_turn_right() {
		Position position = new Position(0, 0, "N");
		Robot robot = new Robot(position);
		
		robot.command("R");
		
		Position resultPosition = robot.position;
		Assert.assertEquals(new Position(0, 0, "E"), resultPosition);
	}
	
	@Test
	public void test_when_given_0_0_S_position_turn_right() {
		Position position = new Position(0, 0, "S");
		Robot robot = new Robot(position);
		
		robot.command("R");
		
		Position resultPosition = robot.position;
		Assert.assertEquals(new Position(0, 0, "W"), resultPosition);
	}
	
	@Test
	public void test_when_given_0_0_S_position_and_turn_twice() {
		Position position = new Position(0, 0, "S");
		Robot robot = new Robot(position);

		robot.command("R");
		robot.command("R");
		Position resultPosition = robot.position;
		Assert.assertEquals(new Position(0, 0, "N"), resultPosition);
	}
	
	@Test
	public void test_when_given_0_0_N_move_and_no_turn() {
		Position position = new Position(0, 0, "N");
		Robot robot = new Robot(position);
		robot.command("M");
		Position resultPosition = robot.position;
		
		Assert.assertEquals(new Position(0, 1, "N"), resultPosition);
	}
	
	@Test
	public void test_when_given_0_0_E_move_and_no_turn() {
		Position position = new Position(0, 0, "E");
		Robot robot = new Robot(position);
		robot.command("M");
		
		Position resultPosition = robot.position;
		Assert.assertEquals(new Position(1, 0, "E"), resultPosition);
	}
	
	@Test
	public void test_when_given_0_0_S_move_then_return_0_0_S() {
		Position position = new Position(0, 0, "S");
		Robot robot = new Robot(position);
		robot.command("M");
		
		Position resultPosition = robot.position;
		Assert.assertEquals(new Position(0, 0, "S"), resultPosition);
	}
	
	@Test
	public void test_when_given_0_3_W_move_then_return_2_3_N() {
		Position position = new Position(0, 3, "W");
		Robot robot = new Robot(position);
		robot.command("M");
		robot.command("R");
		robot.command("R");
		robot.command("M");
		robot.command("M");
		robot.command("L");
		
		Position resultPosition = robot.position;
		Assert.assertEquals(new Position(2, 3, "N"), resultPosition);
	}
	
	@Test
	public void test_two_robots() {
		Position position = new Position(0, 0, "E");
		Robot robot1 = new Robot(position);
		Robot robot2 = new Robot(position);
		ControlCenter controlCenter = new ControlCenter();
		controlCenter.addRobots(robot1);
		controlCenter.addRobots(robot2);
		
		controlCenter.command("M");
		
		Assert.assertEquals(new Position(1, 0, "E"), robot1.position);
		Assert.assertEquals(new Position(1, 0, "E"), robot2.position);
	}
	
	@Test
	public void test_two_robots_turn_left_and_move() {
		Position position = new Position(0, 0, "E");
		Robot robot1 = new Robot(position);
		Robot robot2 = new Robot(position);
		ControlCenter controlCenter = new ControlCenter();
		controlCenter.addRobots(robot1);
		controlCenter.addRobots(robot2);
		
		controlCenter.command("L");
		controlCenter.command("M");
		
		Assert.assertEquals(new Position(0, 1, "N"), robot1.position);
		Assert.assertEquals(new Position(0, 1, "N"), robot2.position);
	}
}

Position.java

package com.study.robot;

public class Position {

	public int x;
	public int y;
	public String direction;
	
	public Position(int x, int y, String direction) {
		this.x = x;
		this.y = y;
		this.direction = direction;
	}
	
	public Position(){
		super();
	}
	
	@Override
	public boolean equals(Object object) {
		Position position = (Position)object;
		if(x != position.x){
			return false;
		}
		if(y != position.y){
			return false;
		}
		if(!direction.equals(position.direction)){
			return false;
		}
		return true;
	}
	
	public void operateX(Integer opx){
		if(opx == null) {
			return;
		}
		if(this.x == 0 && opx < 0) {
			return;
		}
		this.x += opx;
	}
	
	public void operateY(Integer opy) {
		if(opy == null) {
			return;
		}
		if(this.y == 0 && opy < 0) {
			return;
		}
		this.y += opy;
	}
}

ControlCenter.java

package com.study.robot;

import java.util.ArrayList;
import java.util.List;

/**
 * 采用命令模式实现
 */
public class ControlCenter {

	private List<Robot> robots = new ArrayList<Robot>();
	
	public void addRobots(Robot robot) {
		robots.add(robot);
	}
	
	public void command(String command) {
		for(Robot robot: robots) {
			robot.command(command);
		}
	}
}

Robot.java

package com.study.robot;

import java.util.HashMap;
import java.util.Map;

/**
 * 表驱动法实现命令的执行
 * 表驱动法是一种编程模式——从表中查找信息而不是使用逻辑语句(if或else)。如果逻辑很复杂,导致逻辑判断链很长,使用驱动表法有助于降低复杂度。否则,表驱动法只会增加复杂度。
 * 从表中查询条目有三种方法:
 * a.直接访问(Directory access)表
 * b.索引访问(Index access)表
 * c.阶梯访问(Stair-step access)表
 * 表中保存的可能是数据、函数指针,对象实例等(说明:如果保存的是对象实例的话,那就是命令模式)
 */
public class Robot {

	public Position position;

	private String DIRECTION_EAST = "E";
	private String DIRECTION_WEST = "W";
	private String DIRECTION_SOUTH = "S";
	private String DIRECTION_NORTH = "N";

	private String COMMAND_LEFT = "L";
	private String COMMAND_RIGHT = "R";
	private String COMMAND_MOVE = "M";
	
	Map<String,String> directionSearchTable = new HashMap<String,String>(){{
		put(DIRECTION_EAST+COMMAND_LEFT, DIRECTION_NORTH);
		put(DIRECTION_WEST+COMMAND_LEFT, DIRECTION_SOUTH);
		put(DIRECTION_SOUTH+COMMAND_LEFT, DIRECTION_EAST);
		put(DIRECTION_NORTH+COMMAND_LEFT, DIRECTION_WEST);
		
		put(DIRECTION_EAST+COMMAND_RIGHT, DIRECTION_SOUTH);
		put(DIRECTION_WEST+COMMAND_RIGHT, DIRECTION_NORTH);
		put(DIRECTION_SOUTH+COMMAND_RIGHT, DIRECTION_WEST);
		put(DIRECTION_NORTH+COMMAND_RIGHT, DIRECTION_EAST);
	}};
	
	Map<String,Integer> xSearchTable = new HashMap<String,Integer>(){{
		put(DIRECTION_EAST, new Integer(1));
		put(DIRECTION_WEST, new Integer(-1));
	}};
	
	Map<String,Integer> ySearchTable = new HashMap<String,Integer>(){{
		put(DIRECTION_SOUTH, new Integer(-1));
		put(DIRECTION_NORTH, new Integer(1));
	}};	

	public Robot(Position position) {
		this.position = new Position();
		this.position.x = position.x;
		this.position.y = position.y;
		this.position.direction = position.direction;
	}

	public void command(String command) {
		
		if(command.equals(COMMAND_LEFT) || command.equals(COMMAND_RIGHT)) {
			position.direction = directionSearchTable.get(position.direction+command);
		}
		if(command.equals(COMMAND_MOVE)){
			position.operateX(xSearchTable.get(position.direction));
			position.operateY(ySearchTable.get(position.direction));
		}
	}
}
  • 大小: 180.9 KB
分享到:
评论

相关推荐

    XP实践结对编程demo

    **结对编程(Pair Programming)**是极限编程(XP,Extreme Programming)中的一项核心实践,旨在提高软件开发的效率和质量。在这个过程中,两位程序员坐在同一台电脑前,共同编写代码,一人为主程序员(Driver),...

    重构极限编程XP的实践与反思

    极限编程XP的核心实践包括:频繁交付、客户参与、结对编程、测试驱动开发(TDD)、持续集成、重构、简单设计、集体代码所有制、计划游戏和现场客户。书中对这些实践进行了详尽的解析,分析它们在实际项目中的应用和...

    测试驱动的软件开发 TDD

    8. **极限编程(XP)的一部分**:TDD是极限编程(Extreme Programming)方法论的一个关键实践,与持续集成、结对编程等其他XP原则一起,提高了团队的开发效率和代码质量。 9. **挑战与局限**:TDD可能会增加初期的...

    重构极限编程_XP的实践与反思(PDF).rar

    XP的核心原则包括:小步快跑的发布节奏、频繁的集成、测试驱动开发、重构、结对编程、简单的设计以及欢迎改变。这些原则旨在帮助开发团队面对复杂性和不确定性,保持软件的灵活性和可维护性。 重构是改善现有代码...

    Java 极限编程(PDG)

    在Java领域,极限编程(XP)是一套流行的敏捷开发框架,它包括一系列实践和价值观,如测试驱动开发(TDD)、结对编程、持续集成、简单设计等。 **极限编程(XP)的核心原则:** 1. **价值观**:XP的核心价值观包括...

    SCRUM与极限编程(中文版)-带书签高清版

    XP的核心价值观包括沟通、简单、勇气和尊重,以及十二个实践原则,如持续集成、测试驱动开发(TDD)、结对编程等。 1. **测试驱动开发(TDD)**:开发人员首先编写测试,然后编写刚好足够通过测试的代码,确保代码...

    (PDF)Java 极限编程

    《Java 极限编程》是一本深入探讨Java开发实践与技术优化的专业书籍,它主要针对的是如何在实际项目中实现高效、敏捷的编程方法。极限编程(Extreme Programming, XP)是一种敏捷软件开发方法论,强调快速反馈、团队...

    [免费高清PDF]Java极限编程.扫描版.rar

    《Java极限编程》是一本深度探讨Java开发实践的书籍,主要针对如何在短时间内高效、高质量地完成软件开发项目。极限编程(Extreme Programming, XP)是一种敏捷开发方法论,它强调团队协作、快速反馈、持续集成和...

    Java极限编程_src源码源码整理

    - XP的十二个实践:小发布、持续集成、重构、结对编程、计划游戏、测试先行、编码标准、单一责任原则、工作软件作为进度的度量、欢迎改变、保持简朴、YAGNI(你不会需要它)。 2. **Java编程** - Java语言特性:...

    敏捷软件开发:原则模式与实践

    Martin深入解析了极限编程中的各种实践,如持续集成、测试驱动开发(Test-Driven Development, TDD)、重构、结对编程等,这些都是敏捷开发的核心实践。 此外,书中还探讨了UML(统一建模语言)和设计模式在面向...

    捷建模-极限编程和统一过程的有效实践

    3. **结对编程**:两个程序员共享一个工作区,互相审查代码,提高代码质量并促进知识共享。 4. **持续集成**:每天至少集成一次代码,通过自动化测试来发现并解决合并冲突。 5. **测试驱动开发**:先编写测试用例,...

    Java 极限编程-英文版-高清无书签

    《Java 极限编程》是一本深入探讨Java开发实践与技术优化的专业书籍,其英文版为程序员提供了关于极限编程(XP)理念在Java环境中的应用。极限编程是一种敏捷开发方法论,强调快速反馈、团队协作以及对变化的适应性。...

    极限编程资料大全

    这本书可能深入探讨了XP的各个方面,包括其12个实践:计划游戏、小发布、结对编程、持续集成、单元测试、重构、简单设计、YAGNI(你不会需要它)、延迟实现、集体所有权、编码标准和现场客户。这些实践是XP成功实施...

    敏捷软件开发:原则、模式与实践 PDF电子书

    实践部分,本书可能会涵盖如结对编程、TDD(测试驱动开发)、重构、持续集成、代码审查和集体所有权等具体实践。这些实践有助于提升代码质量,减少错误,增强团队间的合作,并确保软件始终处于可测试和可部署的状态...

    敏捷软件开发:原则、模式与实践

    它强调通过严格的编程规范、测试驱动开发(TDD)、结对编程、持续集成等技术来提高软件质量。XP的核心实践包括:计划游戏、小发布、结对编程、持续集成、单元测试、重构、简单设计、YAGNI(你不会需要它)和ISP...

    Java极限编程.part05.rar

    在极限编程中,有几个核心原则和实践,包括测试驱动开发(TDD)、结对编程、持续集成、重构以及最小化工作待办事项列表。这些原则都是为了确保代码的质量和项目的进度得以有效控制。 1. 测试驱动开发(TDD):TDD ...

    Java极限编程.rar

    - **结对编程**:两名程序员共享一个工作台,交替编写和审查代码,提高代码质量和团队知识共享。 - **持续集成**:每天或更频繁地合并代码,确保团队成员的工作始终保持同步。 - **测试驱动开发(TDD)**:先写...

    敏捷建模:极限编程和统一过程的有效实践———— 好东西!

    - **结对编程**:两名程序员共享一个工作站,一人编码,另一人审查,促进知识共享和即时问题解决。 - **持续集成**:频繁地将代码集成到主分支,以尽早发现和解决问题。 - **重构**:定期改进代码结构,保持代码的...

Global site tag (gtag.js) - Google Analytics