From 57bf2d399960afdc237b649a31f1bc4a6fd438cd Mon Sep 17 00:00:00 2001 From: Xavier Fontanet Date: Sun, 23 Jun 2024 22:29:14 +0200 Subject: [PATCH] encapsulate all command classes from outside the module, through a Factory facade --- SOLUTION.md | 2 +- misc/images/mars-rover design.png | Bin 0 -> 41719 bytes misc/images/mars-rover-uml.png | Bin 38486 -> 0 bytes rover-commands/pom.xml | 2 +- .../codingtests/marsrover/CommandFactory.java | 18 ++++++++++++++++++ .../marsrover/MoveBackwardsCommand.java | 2 +- .../marsrover/MoveForwardCommand.java | 2 +- .../codingtests/marsrover/RoverCommand.java | 2 ++ .../marsrover/TurnLeftCommand.java | 2 +- .../marsrover/TurnRightCommand.java | 2 +- .../codingtests/marsrover/MarsRoverTest.java | 11 +++++++---- .../marsrover/MarsRoverWithObstaclesTest.java | 15 +++++++++------ user-interface-console/pom.xml | 2 +- .../ui/console/RoverCommandsPerformer.java | 16 +++++++++++----- 14 files changed, 54 insertions(+), 22 deletions(-) create mode 100644 misc/images/mars-rover design.png delete mode 100644 misc/images/mars-rover-uml.png create mode 100644 rover-commands/src/main/java/cat/hack3/codingtests/marsrover/CommandFactory.java diff --git a/SOLUTION.md b/SOLUTION.md index 6213252..70fc012 100644 --- a/SOLUTION.md +++ b/SOLUTION.md @@ -1,4 +1,4 @@ # MY SOLUTION ## Current design -![Current design](misc/images/mars-rover-uml.png) \ No newline at end of file +![Current design](misc/images/mars-rover design.png) \ No newline at end of file diff --git a/misc/images/mars-rover design.png b/misc/images/mars-rover design.png new file mode 100644 index 0000000000000000000000000000000000000000..0930a74393782f989e1d94b216964d6c8b87ba6d GIT binary patch literal 41719 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 Q^Mou}DaE@vl7`;@7lj>pegFUf literal 0 HcmV?d00001 diff --git a/misc/images/mars-rover-uml.png b/misc/images/mars-rover-uml.png deleted file mode 100644 index 8bd30c5d354a866c2499244d015c89ed52dd026d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38486 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 diff --git a/rover-commands/pom.xml b/rover-commands/pom.xml index 9b219eb..04962eb 100644 --- a/rover-commands/pom.xml +++ b/rover-commands/pom.xml @@ -10,7 +10,7 @@ 4.0.0 rover-commands - 1.0 + 2.0 17 diff --git a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/CommandFactory.java b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/CommandFactory.java new file mode 100644 index 0000000..77104cb --- /dev/null +++ b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/CommandFactory.java @@ -0,0 +1,18 @@ +package cat.hack3.codingtests.marsrover; + +public class CommandFactory { + private final RotableRiderRover rover; + + public CommandFactory(RotableRiderRover rover) { + this.rover = rover; + } + + public RoverCommand createCommand(RoverCommand.Type type) { + return switch (type) { + case MOVE_FORWARD -> new MoveForwardCommand(rover); + case MOVE_BACKWARDS -> new MoveBackwardsCommand(rover); + case TURN_LEFT -> new TurnLeftCommand(rover); + case TURN_RIGHT -> new TurnRightCommand(rover); + }; + } +} diff --git a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/MoveBackwardsCommand.java b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/MoveBackwardsCommand.java index c6a6602..de9ac8c 100644 --- a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/MoveBackwardsCommand.java +++ b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/MoveBackwardsCommand.java @@ -1,6 +1,6 @@ package cat.hack3.codingtests.marsrover; -public class MoveBackwardsCommand implements RoverCommand { +class MoveBackwardsCommand implements RoverCommand { private final RotableRiderRover rover; public MoveBackwardsCommand(RotableRiderRover rover) { diff --git a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/MoveForwardCommand.java b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/MoveForwardCommand.java index 3374e2c..2f2d11b 100644 --- a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/MoveForwardCommand.java +++ b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/MoveForwardCommand.java @@ -1,6 +1,6 @@ package cat.hack3.codingtests.marsrover; -public class MoveForwardCommand implements RoverCommand { +class MoveForwardCommand implements RoverCommand { private final RotableRiderRover rover; public MoveForwardCommand(RotableRiderRover rover) { diff --git a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/RoverCommand.java b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/RoverCommand.java index 54c139c..27e65ce 100644 --- a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/RoverCommand.java +++ b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/RoverCommand.java @@ -1,5 +1,7 @@ package cat.hack3.codingtests.marsrover; public interface RoverCommand { + enum Type {MOVE_FORWARD, MOVE_BACKWARDS, TURN_LEFT, TURN_RIGHT} + void execute(); } diff --git a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/TurnLeftCommand.java b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/TurnLeftCommand.java index fd2b892..065082d 100644 --- a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/TurnLeftCommand.java +++ b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/TurnLeftCommand.java @@ -2,7 +2,7 @@ package cat.hack3.codingtests.marsrover; import static cat.hack3.codingtests.marsrover.RotableRiderRover.Rotation.LEFT; -public class TurnLeftCommand implements RoverCommand { +class TurnLeftCommand implements RoverCommand { private final RotableRiderRover rover; public TurnLeftCommand(RotableRiderRover rover) { diff --git a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/TurnRightCommand.java b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/TurnRightCommand.java index 8d7c12c..a4273e6 100644 --- a/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/TurnRightCommand.java +++ b/rover-commands/src/main/java/cat/hack3/codingtests/marsrover/TurnRightCommand.java @@ -2,7 +2,7 @@ package cat.hack3.codingtests.marsrover; import static cat.hack3.codingtests.marsrover.RotableRiderRover.Rotation.RIGHT; -public class TurnRightCommand implements RoverCommand { +class TurnRightCommand implements RoverCommand { private final RotableRiderRover rover; public TurnRightCommand(RotableRiderRover rover) { diff --git a/rover-commands/src/test/java/cat/hack3/codingtests/marsrover/MarsRoverTest.java b/rover-commands/src/test/java/cat/hack3/codingtests/marsrover/MarsRoverTest.java index 50fb1ee..53b8398 100644 --- a/rover-commands/src/test/java/cat/hack3/codingtests/marsrover/MarsRoverTest.java +++ b/rover-commands/src/test/java/cat/hack3/codingtests/marsrover/MarsRoverTest.java @@ -8,12 +8,14 @@ import org.testng.annotations.Test; import java.util.stream.IntStream; +import static cat.hack3.codingtests.marsrover.RoverCommand.Type.*; import static cat.hack3.codingtests.marsrover.cartography.Direction.*; import static org.testng.Assert.assertEquals; public class MarsRoverTest { private MarsRover rover; + private RoverCommand moveForwardCommand; private RoverCommand moveBackwardsCommand; private RoverCommand turnLeftCommand; @@ -29,10 +31,11 @@ public class MarsRoverTest { var marsMap = new MarsMap(mapHeight, mapWidth, startingCoordinates); rover = new MarsRover(marsMap, SOUTH); - moveForwardCommand = new MoveForwardCommand(rover); - moveBackwardsCommand = new MoveBackwardsCommand(rover); - turnLeftCommand = new TurnLeftCommand(rover); - turnRightCommand = new TurnRightCommand(rover); + var commandFactory = new CommandFactory(rover); + moveForwardCommand = commandFactory.createCommand(MOVE_FORWARD); + moveBackwardsCommand = commandFactory.createCommand(MOVE_BACKWARDS); + turnLeftCommand = commandFactory.createCommand(TURN_LEFT); + turnRightCommand = commandFactory.createCommand(TURN_RIGHT); } @Test diff --git a/rover-commands/src/test/java/cat/hack3/codingtests/marsrover/MarsRoverWithObstaclesTest.java b/rover-commands/src/test/java/cat/hack3/codingtests/marsrover/MarsRoverWithObstaclesTest.java index d0c6e3b..eef547b 100644 --- a/rover-commands/src/test/java/cat/hack3/codingtests/marsrover/MarsRoverWithObstaclesTest.java +++ b/rover-commands/src/test/java/cat/hack3/codingtests/marsrover/MarsRoverWithObstaclesTest.java @@ -8,6 +8,7 @@ import org.testng.annotations.Test; import java.util.List; +import static cat.hack3.codingtests.marsrover.RoverCommand.Type.*; import static cat.hack3.codingtests.marsrover.cartography.Direction.SOUTH; import static org.testng.Assert.assertEquals; import static org.testng.Assert.assertNotEquals; @@ -15,9 +16,10 @@ import static org.testng.Assert.assertNotEquals; public class MarsRoverWithObstaclesTest { private MarsRover rover; - private MoveForwardCommand moveForwardCommand; - private TurnLeftCommand turnLeftCommand; - private TurnRightCommand turnRightCommand; + + private RoverCommand moveForwardCommand; + private RoverCommand turnLeftCommand; + private RoverCommand turnRightCommand; @BeforeMethod public void setUp() { @@ -36,9 +38,10 @@ public class MarsRoverWithObstaclesTest { var marsMap = new MarsMap(mapHeight, mapWidth, startingCoordinates, obstaclesLocalizations); rover = new MarsRover(marsMap, SOUTH); - moveForwardCommand = new MoveForwardCommand(rover); - turnLeftCommand = new TurnLeftCommand(rover); - turnRightCommand = new TurnRightCommand(rover); + var commandFactory = new CommandFactory(rover); + moveForwardCommand = commandFactory.createCommand(MOVE_FORWARD); + turnLeftCommand = commandFactory.createCommand(TURN_LEFT); + turnRightCommand = commandFactory.createCommand(TURN_RIGHT); } @Test diff --git a/user-interface-console/pom.xml b/user-interface-console/pom.xml index 3b0eba7..dbcd0fd 100644 --- a/user-interface-console/pom.xml +++ b/user-interface-console/pom.xml @@ -25,7 +25,7 @@ cat.hack3.codingtests rover-commands - 1.0 + 2.0 diff --git a/user-interface-console/src/main/java/cat/hack3/codingtests/marsrover/ui/console/RoverCommandsPerformer.java b/user-interface-console/src/main/java/cat/hack3/codingtests/marsrover/ui/console/RoverCommandsPerformer.java index 5af1abf..ba40194 100644 --- a/user-interface-console/src/main/java/cat/hack3/codingtests/marsrover/ui/console/RoverCommandsPerformer.java +++ b/user-interface-console/src/main/java/cat/hack3/codingtests/marsrover/ui/console/RoverCommandsPerformer.java @@ -1,14 +1,19 @@ package cat.hack3.codingtests.marsrover.ui.console; -import cat.hack3.codingtests.marsrover.*; +import cat.hack3.codingtests.marsrover.CommandFactory; +import cat.hack3.codingtests.marsrover.RotableRiderRover; +import cat.hack3.codingtests.marsrover.RoverCommand; import java.util.Scanner; +import static cat.hack3.codingtests.marsrover.RoverCommand.Type.*; import static cat.hack3.codingtests.marsrover.ui.console.UICommons.isNotExitSignal; import static cat.hack3.codingtests.marsrover.ui.console.UICommons.output; public class RoverCommandsPerformer { private final Scanner reader; + + CommandFactory commandFactory; private final RoverCommand moveForwardCommand; private final RoverCommand moveBackwardsCommand; private final RoverCommand turnLeftCommand; @@ -16,10 +21,11 @@ public class RoverCommandsPerformer { public RoverCommandsPerformer(Scanner reader, RotableRiderRover rover) { this.reader = reader; - moveForwardCommand = new MoveForwardCommand(rover); - moveBackwardsCommand = new MoveBackwardsCommand(rover); - turnLeftCommand = new TurnLeftCommand(rover); - turnRightCommand = new TurnRightCommand(rover); + commandFactory = new CommandFactory(rover); + moveForwardCommand = commandFactory.createCommand(MOVE_FORWARD); + moveBackwardsCommand = commandFactory.createCommand(MOVE_BACKWARDS); + turnLeftCommand = commandFactory.createCommand(TURN_LEFT); + turnRightCommand = commandFactory.createCommand(TURN_RIGHT); } public void acceptCommandsUntilExitSignal() {