编程kata是一种练习,可以帮助程序员通过练习和重复练习来磨练自己的技能。

本文是“ 通过Katas进行Java教程 ”系列的一部分。

本文假定读者已经具有Java的经验,熟悉单元测试的基础知识,并且知道如何从他最喜欢的IDE(我是IntelliJ IDEA )运行它们。

下面显示证明解决方案正确的测试。 解决此问题的推荐方法是使用测试驱动的开发方法(编写第一个测试的实现,确认它通过并转到下一个测试)。 一旦所有测试通过,就可以认为解决了问题。 有关最佳做法的更多信息,请阅读“ 测试驱动开发(TDD):使用Java范例的最佳做法” 。

测试下方提供了一种可能的解决方案。 尝试先自己解决kata。

火星漫游者

开发一个可在网格上移动漫游车的API。

规则:

  • 您将获得流动站的初始起点(x,y)及其面向的方向(N,S,E,W)。
  • 流动站接收命令的字符数组。
  • 实施使漫游车前进/后退(f,b)的命令。
  • 实现使流动站左/右(l,r)旋转的命令。
  • 实现从网格的一个边缘到另一边缘的环绕。 (行星毕竟是球体)
  • 每次移动到新的广场之前,请执行障碍检测。 如果给定的命令序列遇到障碍物,则流动站将移动到最后一个可能的点并报告障碍物。

测验

以下是一组可用于以TDD方式解决此问题的单元测试。

package com.technologyconversations.kata.marsrover;import org.junit.Before;
import org.junit.Test;import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;import static org.assertj.core.api.Assertions.*;/*
Source: http://dallashackclub.com/roverDevelop an api that moves a rover around on a grid.
* You are given the initial starting point (x,y) of a rover and the direction (N,S,E,W) it is facing.
* - The rover receives a character array of commands.
* - Implement commands that move the rover forward/backward (f,b).
* - Implement commands that turn the rover left/right (l,r).
* - Implement wrapping from one edge of the grid to another. (planets are spheres after all)
* - Implement obstacle detection before each move to a new square.
*   If a given sequence of commands encounters an obstacle, the rover moves up to the last possible point and reports the obstacle.
*/
public class RoverSpec {private Rover rover;private Coordinates roverCoordinates;private final Direction direction = Direction.NORTH;private Point x;private Point y;private List<Obstacle> obstacles;@Beforepublic void beforeRoverTest() {x = new Point(1, 9);y = new Point(2, 9);obstacles = new ArrayList<Obstacle>();roverCoordinates = new Coordinates(x, y, direction, obstacles);rover = new Rover(roverCoordinates);}@Testpublic void newInstanceShouldSetRoverCoordinatesAndDirection() {assertThat(rover.getCoordinates()).isEqualToComparingFieldByField(roverCoordinates);}@Testpublic void receiveSingleCommandShouldMoveForwardWhenCommandIsF() throws Exception {int expected = y.getLocation() + 1;rover.receiveSingleCommand('F');assertThat(rover.getCoordinates().getY().getLocation()).isEqualTo(expected);}@Testpublic void receiveSingleCommandShouldMoveBackwardWhenCommandIsB() throws Exception {int expected = y.getLocation() - 1;rover.receiveSingleCommand('B');assertThat(rover.getCoordinates().getY().getLocation()).isEqualTo(expected);}@Testpublic void receiveSingleCommandShouldTurnLeftWhenCommandIsL() throws Exception {rover.receiveSingleCommand('L');assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.WEST);}@Testpublic void receiveSingleCommandShouldTurnRightWhenCommandIsR() throws Exception {rover.receiveSingleCommand('R');assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.EAST);}@Testpublic void receiveSingleCommandShouldIgnoreCase() throws Exception {rover.receiveSingleCommand('r');assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.EAST);}@Test(expected = Exception.class)public void receiveSingleCommandShouldThrowExceptionWhenCommandIsUnknown() throws Exception {rover.receiveSingleCommand('X');}@Testpublic void receiveCommandsShouldBeAbleToReceiveMultipleCommands() throws Exception {int expected = x.getLocation() + 1;rover.receiveCommands("RFR");assertThat(rover.getCoordinates().getX().getLocation()).isEqualTo(expected);assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.SOUTH);}@Testpublic void receiveCommandShouldWhatFromOneEdgeOfTheGridToAnother() throws Exception {int expected = x.getMaxLocation() + x.getLocation() - 2;rover.receiveCommands("LFFF");assertThat(rover.getCoordinates().getX().getLocation()).isEqualTo(expected);}@Testpublic void receiveCommandsShouldStopWhenObstacleIsFound() throws Exception {int expected = x.getLocation() + 1;rover.getCoordinates().setObstacles(Arrays.asList(new Obstacle(expected + 1, y.getLocation())));rover.getCoordinates().setDirection(Direction.EAST);rover.receiveCommands("FFFRF");assertThat(rover.getCoordinates().getX().getLocation()).isEqualTo(expected);assertThat(rover.getCoordinates().getDirection()).isEqualTo(Direction.EAST);}@Testpublic void positionShouldReturnXYAndDirection() throws Exception {rover.receiveCommands("LFFFRFF");assertThat(rover.getPosition()).isEqualTo("8 X 4 N");}@Testpublic void positionShouldReturnNokWhenObstacleIsFound() throws Exception {rover.getCoordinates().setObstacles(Arrays.asList(new Obstacle(x.getLocation() + 1, y.getLocation())));rover.getCoordinates().setDirection(Direction.EAST);rover.receiveCommands("F");assertThat(rover.getPosition()).endsWith(" NOK");}}

以下是一种可能的解决方案。

package com.technologyconversations.kata.marsrover;/*
Method receiveCommands should be used to transmit commands to the rover.*/
public class Rover {private Coordinates coordinates;public void setCoordinates(Coordinates value) {coordinates = value;}public Coordinates getCoordinates() {return coordinates;}public Rover(Coordinates coordinatesValue) {setCoordinates(coordinatesValue);}public void receiveCommands(String commands) throws Exception {for (char command : commands.toCharArray()) {if (!receiveSingleCommand(command)) {break;}}}public boolean receiveSingleCommand(char command) throws Exception {switch(Character.toUpperCase(command)) {case 'F':return getCoordinates().moveForward();case 'B':return getCoordinates().moveBackward();case 'L':getCoordinates().changeDirectionLeft();return true;case 'R':getCoordinates().changeDirectionRight();return true;default:throw new Exception("Command " + command + " is unknown.");}}public String getPosition() {return getCoordinates().toString();}}

完整源代码位于GitHub存储库[https://github.com/vfarcic/mars-rover-kata-java)中。 上面的代码仅表示主类的代码。 还有其他几个类/对象及其相应的规范。 除了测试和实现之外,存储库还包括build.gradle,可用于下载AssertJ依赖项并运行测试README.md包含有关如何设置项目的简短说明。

您有什么解决方案? 将其发布为评论,以便我们可以比较解决此kata的不同方法。

翻译自: https://www.javacodegeeks.com/2014/10/java-tutorial-through-katas-mars-rover.html

Katas编写的Java教程:Mars Rover相关推荐

  1. 通过Katas进行Java教程:网球比赛(轻松)

    编程kata是一种练习,可以帮助程序员通过练习和重复练习来磨练自己的技能. 本文是"通过Katas的Java教程"系列的一部分. 文章分为易,中和难. Fizz Buzz(轻松) ...

  2. java记事本应用程序_Java教程:使用记事本编写运行Java程序

    Java教程经过上节的操作已经配置完了 Java 的开发环境,但并不清楚所配置的开发环境是否真的可以运行 Java 应用程序.为了解除这个疑虑,也为了使读者对开发 Java 应用程序的步骤有一个初步的 ...

  3. java第九章编写一个能够产生_第九章java教程.ppt

    第九章java教程 5.下面哪个选项能够构造一个BufferedInputStream流?() A. New BufferedInputStream("in.txt"); B. N ...

  4. Java教程:使用记事本编写运行Java程序

    Java教程经过上节的操作已经配置完了 Java 的开发环境,但并不清楚所配置的开发环境是否真的可以运行 Java 应用程序.为了解除这个疑虑,也为了使读者对开发 Java 应用程序的步骤有一个初步的 ...

  5. java编写流星_[Java教程]【原创】java 流星划过天空

    [Java教程][原创]java 流星划过天空 0 2015-10-29 10:00:06 1 import java.awt.Color; 2 import java.awt.Graphics; 3 ...

  6. 好程序员Java教程分享之jvm篇

    好程序员java教程分享之jvm篇,在前面的文章中,介绍了JVM内存模型分为:堆区.虚拟机栈.方法区.本地方法区和程序计数器,其中堆区是JVM中最大的一块内存区域,在Java中的所有对象实例都保存在此 ...

  7. java mvc 小程序_[Java教程]Spring MVC 的环境搭建和入门小程序

    [Java教程]Spring MVC 的环境搭建和入门小程序 0 2017-02-17 00:00:16 1.1.下载spring框架包. 1.1.1百度搜索Spring Framework. 进入s ...

  8. 用python写脚本看什么书-终于知晓python编写脚本入门教程

    PyQt5是基于Digia公司强大的图形程式框架Qt5的python接口,由一组python模块构成.PyQt5本身拥有超过620个类和6000函数及方法.在可以运行于多个平台.PyQt5拥有双重协议 ...

  9. java with关键字_[Java教程]javascript 里面 with 关键字

    [Java教程]javascript 里面 with 关键字 0 2016-02-18 11:00:02 1.with的基本概念 with语句的作用是将代码的作用域设置到一个特定的作用域中,目的是为了 ...

最新文章

  1. mysql 5.7解压缩,Mysql5.7 windows解压缩ZIP版安装
  2. layui时间怎么设置年月日时分秒_安卓手机便签敬业签到时间提醒后怎么设置延时30分钟再提醒?...
  3. Linux中常用头文件的作用--转
  4. php 8 jit,深入理解PHP8 JIT
  5. 100万“愤怒的小鸟”:中国手机开发者生存调查
  6. WebRTC/Chromium在2020年的更新
  7. cmd 中 net start mysql 提示发生系统错误 5
  8. SAP Spartacus LayoutConfig的配置为何运行时不生效
  9. springboot项目访问不到controller方法。
  10. 6月21日武汉见!华为nova 5正式官宣:麒麟980+40W快充
  11. matlab 运算程序时间计算
  12. VC开发过程中数据类型不兼容的问题
  13. 性能测试-Loadrunner脚本录制步骤
  14. 《分布式微服务电商源码》-项目简介
  15. Ain_搜索引擎这样用才有效率
  16. 软件测试常用的测试方法有哪些?
  17. 汽车用泄露测试系统2022年全球行业分析报告
  18. 李标明新书《生命的觉醒》发布
  19. 自动化代码审查平台: 基于Docker Compose整合Jenkins + SonarQube
  20. 大国的崛起:第一集:海洋时代(开篇·葡西)

热门文章

  1. SpringCache与Redis
  2. MyBatis中动态SQL
  3. JS中DOM节点的CRUD
  4. 2017蓝桥杯省赛---java---A---7(正则问题)
  5. 2015蓝桥杯省赛---java---C---1(隔行变色)
  6. p2p linux 开源项目,权威开源项目(linux系统、sip、live555)
  7. docker 安装elasticsearch
  8. js解析json数组+java对象转json字符串
  9. Sprng boot(十三):Spring boot 小技巧
  10. aws生态系统集成商_通过通用数据访问扩展AWS生态系统