结对编译与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)); } } }
相关推荐
**结对编程(Pair Programming)**是极限编程(XP,Extreme Programming)中的一项核心实践,旨在提高软件开发的效率和质量。在这个过程中,两位程序员坐在同一台电脑前,共同编写代码,一人为主程序员(Driver),...
极限编程XP的核心实践包括:频繁交付、客户参与、结对编程、测试驱动开发(TDD)、持续集成、重构、简单设计、集体代码所有制、计划游戏和现场客户。书中对这些实践进行了详尽的解析,分析它们在实际项目中的应用和...
8. **极限编程(XP)的一部分**:TDD是极限编程(Extreme Programming)方法论的一个关键实践,与持续集成、结对编程等其他XP原则一起,提高了团队的开发效率和代码质量。 9. **挑战与局限**:TDD可能会增加初期的...
XP的核心原则包括:小步快跑的发布节奏、频繁的集成、测试驱动开发、重构、结对编程、简单的设计以及欢迎改变。这些原则旨在帮助开发团队面对复杂性和不确定性,保持软件的灵活性和可维护性。 重构是改善现有代码...
在Java领域,极限编程(XP)是一套流行的敏捷开发框架,它包括一系列实践和价值观,如测试驱动开发(TDD)、结对编程、持续集成、简单设计等。 **极限编程(XP)的核心原则:** 1. **价值观**:XP的核心价值观包括...
XP的核心价值观包括沟通、简单、勇气和尊重,以及十二个实践原则,如持续集成、测试驱动开发(TDD)、结对编程等。 1. **测试驱动开发(TDD)**:开发人员首先编写测试,然后编写刚好足够通过测试的代码,确保代码...
《Java 极限编程》是一本深入探讨Java开发实践与技术优化的专业书籍,它主要针对的是如何在实际项目中实现高效、敏捷的编程方法。极限编程(Extreme Programming, XP)是一种敏捷软件开发方法论,强调快速反馈、团队...
《Java极限编程》是一本深度探讨Java开发实践的书籍,主要针对如何在短时间内高效、高质量地完成软件开发项目。极限编程(Extreme Programming, XP)是一种敏捷开发方法论,它强调团队协作、快速反馈、持续集成和...
- XP的十二个实践:小发布、持续集成、重构、结对编程、计划游戏、测试先行、编码标准、单一责任原则、工作软件作为进度的度量、欢迎改变、保持简朴、YAGNI(你不会需要它)。 2. **Java编程** - Java语言特性:...
Martin深入解析了极限编程中的各种实践,如持续集成、测试驱动开发(Test-Driven Development, TDD)、重构、结对编程等,这些都是敏捷开发的核心实践。 此外,书中还探讨了UML(统一建模语言)和设计模式在面向...
3. **结对编程**:两个程序员共享一个工作区,互相审查代码,提高代码质量并促进知识共享。 4. **持续集成**:每天至少集成一次代码,通过自动化测试来发现并解决合并冲突。 5. **测试驱动开发**:先编写测试用例,...
《Java 极限编程》是一本深入探讨Java开发实践与技术优化的专业书籍,其英文版为程序员提供了关于极限编程(XP)理念在Java环境中的应用。极限编程是一种敏捷开发方法论,强调快速反馈、团队协作以及对变化的适应性。...
这本书可能深入探讨了XP的各个方面,包括其12个实践:计划游戏、小发布、结对编程、持续集成、单元测试、重构、简单设计、YAGNI(你不会需要它)、延迟实现、集体所有权、编码标准和现场客户。这些实践是XP成功实施...
实践部分,本书可能会涵盖如结对编程、TDD(测试驱动开发)、重构、持续集成、代码审查和集体所有权等具体实践。这些实践有助于提升代码质量,减少错误,增强团队间的合作,并确保软件始终处于可测试和可部署的状态...
它强调通过严格的编程规范、测试驱动开发(TDD)、结对编程、持续集成等技术来提高软件质量。XP的核心实践包括:计划游戏、小发布、结对编程、持续集成、单元测试、重构、简单设计、YAGNI(你不会需要它)和ISP...
在极限编程中,有几个核心原则和实践,包括测试驱动开发(TDD)、结对编程、持续集成、重构以及最小化工作待办事项列表。这些原则都是为了确保代码的质量和项目的进度得以有效控制。 1. 测试驱动开发(TDD):TDD ...
- **结对编程**:两名程序员共享一个工作台,交替编写和审查代码,提高代码质量和团队知识共享。 - **持续集成**:每天或更频繁地合并代码,确保团队成员的工作始终保持同步。 - **测试驱动开发(TDD)**:先写...
- **结对编程**:两名程序员共享一个工作站,一人编码,另一人审查,促进知识共享和即时问题解决。 - **持续集成**:频繁地将代码集成到主分支,以尽早发现和解决问题。 - **重构**:定期改进代码结构,保持代码的...