From 7e31e8d34d146de566ee33c3994aff0a168e0c34 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 02:40:19 +0900 Subject: [PATCH 001/153] chore: add wlgns branch --- src/main/java/.gitkeep | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/.gitkeep b/src/main/java/.gitkeep index e69de29b..945c9b46 100644 --- a/src/main/java/.gitkeep +++ b/src/main/java/.gitkeep @@ -0,0 +1 @@ +. \ No newline at end of file From 64c7d42fc1457f46dfe1f07d470be5e6df810153 Mon Sep 17 00:00:00 2001 From: kangwlgns <71175483+kangwlgns@users.noreply.github.com> Date: Mon, 3 Jun 2024 02:41:51 +0900 Subject: [PATCH 002/153] docs: write README.md --- README.md | 100 +++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 99 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 491aece1..6a11332b 100644 --- a/README.md +++ b/README.md @@ -1 +1,99 @@ -# java-racingcar-precourse \ No newline at end of file +version 1.0 +# java-racingcar-precourse +### interface Observer +* update() : void +--- +### interface Subject +* addObserver(Observer) : void +* removeObserver(Observer) : void +* notifyObservers() : void +--- +### interface CarModelInterface +* getName() : String +* getProgress() : int +* setProgress() : void +--- +### interface RaceModelInterface +* getNumberOfCars() : int +* getNumberOfRounds() : int +* setNumberOfRounds() : void +* getCars() : List +--- +### interface CarServiceInterface +* move() : void +--- +### interface RaceServiceInterface +* getNumberOfCars() : int +* getNumberOfRounds() : int +* setNumberOfRounds() : void +--- +### interface RaceViewInterface +* userCarsInput() : void +* userRoundsInput() : void +* printProgress() : void +* printProcess() : void +* printResult() : void +--- +### interface RaceControllerInterface +* init() : void +* play() : void +* end() : void +* addCar(CarServiceInterface) : void +* setRound(int) : void +--- +### class CarServiceTest +--- +### class RaceServiceTest +--- +### class Car - model +* name : String +* progress : int +* getName() : String +* getProgress() : int +* setProgress() : void +--- +### class Race : Subject, RaceServiceInterface - model +* numberOfCars : int +* numberOfRounds : int +* cars : List +* observers : List +* getNumberOfCars() : int +* getNumberOfRounds() : int +* setNumberOfRounds() : void +* getCars() : List +* addObserver(Observer) : void +* removeObserver(Observer) : void +* notifyObservers() : void +--- +### CarService : CarServiceInterface - service +* car : CarModelInterface +* goForward() : void +* move() : void +* nameValidation() : boolean +--- +### RaceService : RaceServiceInterface - service +* race : RaceModelInterface +* addCar(CarServiceInterface) : void +* setRound(int) : void +* roundValidation() : boolean +* addObserver(Observer) : void +* removeObserver(Observer) : void +* notifyObservers() : void +--- +### class RaceView : Observer, RaceViewInterface - view +* raceServiceInterface : RaceServiceInterface +* raceControllerInterface : RaceControllerInterface +* userCarsInput() : void +* userRoundsInput() : void +* printProgress() : void +* printProcess() : void +* printResult() : void +--- +### RaceController : RaceControllerInterface - controller +* race : RaceServiceInterface +* view : RaceViewInterface +* init() : void +* addCar(CarServiceInterface) : void +* setRound(int) : void +* play() : void +* end() : void From eb6c537f4ff7704e33f651702a2deb3bcc0da517 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 02:47:20 +0900 Subject: [PATCH 003/153] feat(model): add CarModelInterface --- src/main/java/model/CarModelInterface.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/model/CarModelInterface.java diff --git a/src/main/java/model/CarModelInterface.java b/src/main/java/model/CarModelInterface.java new file mode 100644 index 00000000..d8d8dce3 --- /dev/null +++ b/src/main/java/model/CarModelInterface.java @@ -0,0 +1,7 @@ +package model; + +public interface CarModelInterface { + public String getName(); + public int getProgress(); + public void setProgress(); +} From 9b426a143d4788155bde1f0427693b02dcf3ee34 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 02:52:13 +0900 Subject: [PATCH 004/153] feat(service): add CarServiceInterface --- src/main/java/service/CarServiceInterface.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/service/CarServiceInterface.java diff --git a/src/main/java/service/CarServiceInterface.java b/src/main/java/service/CarServiceInterface.java new file mode 100644 index 00000000..f2d0d19b --- /dev/null +++ b/src/main/java/service/CarServiceInterface.java @@ -0,0 +1,5 @@ +package service; + +public interface CarServiceInterface { + public void move(); +} From 13e269aafac67fae629d52b992c8676abb5ae3a2 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 02:52:42 +0900 Subject: [PATCH 005/153] feat(model): add RaceModelInterface --- src/main/java/model/RaceModelInterface.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/model/RaceModelInterface.java diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java new file mode 100644 index 00000000..8afb2e60 --- /dev/null +++ b/src/main/java/model/RaceModelInterface.java @@ -0,0 +1,11 @@ +package model; + +import java.util.ArrayList; +import service.CarServiceInterface; + +public interface RaceModelInterface { + public int getNumberOfCars(); + public int getNumberOfRounds(); + public void setNumberOfRounds(); + public ArrayList getCars(); +} From 94487ba6fe3f69610ccd8e9ca0dd7eb6e0fb9aa2 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 02:53:42 +0900 Subject: [PATCH 006/153] feat(service): add RaceServiceInterface --- src/main/java/service/RaceServiceInterface.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/service/RaceServiceInterface.java diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java new file mode 100644 index 00000000..444172af --- /dev/null +++ b/src/main/java/service/RaceServiceInterface.java @@ -0,0 +1,7 @@ +package service; + +public interface RaceServiceInterface { + public int getNumberOfCars(); + public int getNumberOfRounds(); + public void setNumberOfRounds(); +} From 2741cc51ad6a4a0b8dda82e889df43be9b83c95c Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 02:54:55 +0900 Subject: [PATCH 007/153] feat(view): add RaceViewInterface --- src/main/java/view/RaceViewInterface.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/view/RaceViewInterface.java diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java new file mode 100644 index 00000000..5ad1ca4e --- /dev/null +++ b/src/main/java/view/RaceViewInterface.java @@ -0,0 +1,9 @@ +package view; + +public interface RaceViewInterface { + public void userCarsInput(); + public void userRoundsInput(); + public void printProgress(); + public void printProcess(); + public void printResult(); +} From 8d098e1fe68d0015e324310706aa978686252d2e Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 02:56:23 +0900 Subject: [PATCH 008/153] feat(controller): add RaceControllerInterface --- src/main/java/controller/RaceControllerInterface.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 src/main/java/controller/RaceControllerInterface.java diff --git a/src/main/java/controller/RaceControllerInterface.java b/src/main/java/controller/RaceControllerInterface.java new file mode 100644 index 00000000..28fa405e --- /dev/null +++ b/src/main/java/controller/RaceControllerInterface.java @@ -0,0 +1,11 @@ +package controller; + +import service.CarServiceInterface; + +public interface RaceControllerInterface { + public void init(); + public void play(); + public void end(); + public void addCar(CarServiceInterface carServiceInterface); + public void setRound(int numberOfRound); +} From 5ea57ae5e7c657fd4a3782b220837f095416b726 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:01:43 +0900 Subject: [PATCH 009/153] feat(CarModelInterface): fix a parameter of setProgress --- src/main/java/model/CarModelInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/CarModelInterface.java b/src/main/java/model/CarModelInterface.java index d8d8dce3..dfc8605f 100644 --- a/src/main/java/model/CarModelInterface.java +++ b/src/main/java/model/CarModelInterface.java @@ -3,5 +3,5 @@ public interface CarModelInterface { public String getName(); public int getProgress(); - public void setProgress(); + public void setProgress(int progress); } From 8cf797c141e00908d8f39020ffc76fe7fa35c9e7 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:02:09 +0900 Subject: [PATCH 010/153] feat(model): add Car --- src/main/java/model/Car.java | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 src/main/java/model/Car.java diff --git a/src/main/java/model/Car.java b/src/main/java/model/Car.java new file mode 100644 index 00000000..be4f22d0 --- /dev/null +++ b/src/main/java/model/Car.java @@ -0,0 +1,32 @@ +package model; + +public class Car implements CarModelInterface { + + private final String name; + private int progress; + + public Car() { + name = ""; + progress = 0; + } + + public Car(String name, int progress) { + this.name = name; + this.progress = progress; + } + + @Override + public String getName() { + return name; + } + + @Override + public int getProgress() { + return progress; + } + + @Override + public void setProgress(int progress) { + this.progress = progress; + } +} From 57f1d1cd68e6ae7c1447aba45327330b0e1f3a68 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:16:19 +0900 Subject: [PATCH 011/153] feat(observer): add Observer --- src/main/java/observer/Observer.java | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 src/main/java/observer/Observer.java diff --git a/src/main/java/observer/Observer.java b/src/main/java/observer/Observer.java new file mode 100644 index 00000000..549318a1 --- /dev/null +++ b/src/main/java/observer/Observer.java @@ -0,0 +1,5 @@ +package observer; + +public interface Observer { + public void update(); +} From 86e7f18d71e1df08d6b4100a640909df96d19ade Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:17:12 +0900 Subject: [PATCH 012/153] feat(observer): add Subject --- src/main/java/observer/Subject.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/observer/Subject.java diff --git a/src/main/java/observer/Subject.java b/src/main/java/observer/Subject.java new file mode 100644 index 00000000..4aecea30 --- /dev/null +++ b/src/main/java/observer/Subject.java @@ -0,0 +1,7 @@ +package observer; + +public interface Subject { + public void addObserver(Observer observer); + public void removeObserver(Observer observer); + public void notifyObservers(); +} From 141e6f7350e8d9f51d63e050d880e7415132534a Mon Sep 17 00:00:00 2001 From: kangwlgns <71175483+kangwlgns@users.noreply.github.com> Date: Mon, 3 Jun 2024 03:20:24 +0900 Subject: [PATCH 013/153] docs: update README.md --- README.md | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 6a11332b..d5980798 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -version 1.0 +version 1.1 # java-racingcar-precourse ### interface Observer * update() : void @@ -17,7 +17,7 @@ version 1.0 * getNumberOfCars() : int * getNumberOfRounds() : int * setNumberOfRounds() : void -* getCars() : List +* getCars() : List\ --- ### interface CarServiceInterface * move() : void @@ -42,8 +42,10 @@ version 1.0 * setRound(int) : void --- ### class CarServiceTest +* tests --- ### class RaceServiceTest +* tests --- ### class Car - model * name : String @@ -53,14 +55,13 @@ version 1.0 * setProgress() : void --- ### class Race : Subject, RaceServiceInterface - model -* numberOfCars : int * numberOfRounds : int -* cars : List -* observers : List +* cars : List\ +* observers : List\ * getNumberOfCars() : int * getNumberOfRounds() : int * setNumberOfRounds() : void -* getCars() : List +* getCars() : List\ * addObserver(Observer) : void * removeObserver(Observer) : void * notifyObservers() : void From ac67987245a1084c91538e6013995b1b2b8adac3 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:26:19 +0900 Subject: [PATCH 014/153] feat(RaceModelInterface): remove numberOfRounds setter --- src/main/java/model/RaceModelInterface.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 8afb2e60..5ab52c79 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -6,6 +6,5 @@ public interface RaceModelInterface { public int getNumberOfCars(); public int getNumberOfRounds(); - public void setNumberOfRounds(); public ArrayList getCars(); } From 91cf6c13864ba41cc060d185a24ed967c215c0e6 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:33:51 +0900 Subject: [PATCH 015/153] feat(RaceServiceInterface): add cars getter --- src/main/java/service/RaceServiceInterface.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 444172af..a6ad51b3 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -1,7 +1,10 @@ package service; +import java.util.ArrayList; + public interface RaceServiceInterface { public int getNumberOfCars(); public int getNumberOfRounds(); public void setNumberOfRounds(); + public ArrayList getCars(); } From 3794feb3b9e2bd0c43f029c859355fd042cb28a5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:36:17 +0900 Subject: [PATCH 016/153] feat(RaceServiceInterface): remove numberOfRounds setter --- src/main/java/service/RaceServiceInterface.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index a6ad51b3..5f9aaf1f 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -5,6 +5,5 @@ public interface RaceServiceInterface { public int getNumberOfCars(); public int getNumberOfRounds(); - public void setNumberOfRounds(); public ArrayList getCars(); } From c49b669405b81e2331f7ee4f206b79d8f9749ac7 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:36:55 +0900 Subject: [PATCH 017/153] feat(model): add Race --- src/main/java/model/Race.java | 55 +++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/main/java/model/Race.java diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java new file mode 100644 index 00000000..5bfdc6f6 --- /dev/null +++ b/src/main/java/model/Race.java @@ -0,0 +1,55 @@ +package model; + +import java.util.ArrayList; +import observer.Observer; +import observer.Subject; +import service.CarServiceInterface; +import service.RaceServiceInterface; + +public class Race implements Subject, RaceServiceInterface { + private final int numberOfRounds; + private ArrayList cars; + private ArrayList observers; + + public Race() { + this.numberOfRounds = 0; + cars = null; + observers = null; + } + + public Race(int numberOfRounds) { + this.numberOfRounds = numberOfRounds; + cars = new ArrayList<>(); + observers = new ArrayList<>(); + } + + @Override + public int getNumberOfCars() { + return cars.size(); + } + + @Override + public int getNumberOfRounds() { + return numberOfRounds; + } + + @Override + public ArrayList getCars() { + return cars; + } + + @Override + public void addObserver(Observer observer) { + observers.add(observer); + } + + @Override + public void removeObserver(Observer observer) { + observers.remove(observer); + } + + @Override + public void notifyObservers() { + for (Observer observer : observers) observer.update(); + } +} From 51b745b731bb1a2eca97d08fc787f78b37befae7 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:39:18 +0900 Subject: [PATCH 018/153] feat(service): add CarService --- src/main/java/service/CarService.java | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 src/main/java/service/CarService.java diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java new file mode 100644 index 00000000..c6c30ae9 --- /dev/null +++ b/src/main/java/service/CarService.java @@ -0,0 +1,19 @@ +package service; + +import model.CarModelInterface; + +public class CarService implements CarServiceInterface { + private CarModelInterface car; + + public void goForward() { + + } + + public void move() { + + } + + public boolean nameValidation() { + return true; + } +} From e98793a37fe6751742c3727fa1d50048a15c0606 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:43:29 +0900 Subject: [PATCH 019/153] style(CarService) add Override annotation --- src/main/java/service/CarService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index c6c30ae9..2fffb112 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -9,6 +9,7 @@ public void goForward() { } + @Override public void move() { } From bd7bb61a91ce13c87df5c1f5c916a49387d9efd8 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 03:51:26 +0900 Subject: [PATCH 020/153] fix(Race): fix wrong implementation --- src/main/java/model/Race.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 5bfdc6f6..3e84fb08 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -4,9 +4,8 @@ import observer.Observer; import observer.Subject; import service.CarServiceInterface; -import service.RaceServiceInterface; -public class Race implements Subject, RaceServiceInterface { +public class Race implements Subject, RaceModelInterface { private final int numberOfRounds; private ArrayList cars; private ArrayList observers; From ed4a1230ac2204d38c4ac688affa8206057aeed5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 04:02:51 +0900 Subject: [PATCH 021/153] feat(RaceServiceInterface): add addCar --- src/main/java/service/RaceServiceInterface.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 5f9aaf1f..c4698f68 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -6,4 +6,5 @@ public interface RaceServiceInterface { public int getNumberOfCars(); public int getNumberOfRounds(); public ArrayList getCars(); + public void addCar(CarServiceInterface carServiceInterface); } From 5a84c58d292dde64ca6fecb4c05721070655861e Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 04:03:22 +0900 Subject: [PATCH 022/153] feat(service): add RaceService --- src/main/java/service/RaceService.java | 49 ++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 src/main/java/service/RaceService.java diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java new file mode 100644 index 00000000..61af10be --- /dev/null +++ b/src/main/java/service/RaceService.java @@ -0,0 +1,49 @@ +package service; + +import java.util.ArrayList; +import model.RaceModelInterface; +import observer.Observer; +import observer.Subject; + +public class RaceService implements Subject, RaceServiceInterface { + private RaceModelInterface race; + + @Override + public int getNumberOfCars() { + return 0; + } + + @Override + public int getNumberOfRounds() { + return 0; + } + + @Override + public ArrayList getCars() { + return null; + } + + @Override + public void addCar(CarServiceInterface carServiceInterface) { + + } + + public boolean roundValidation() { + return true; + } + + @Override + public void addObserver(Observer observer) { + + } + + @Override + public void removeObserver(Observer observer) { + + } + + @Override + public void notifyObservers() { + + } +} From 83ff9f13fb4e955c53925cc0f8ae8112d1708af0 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 04:05:04 +0900 Subject: [PATCH 023/153] feat(RaceModelInterface): add addCar --- src/main/java/model/RaceModelInterface.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 5ab52c79..64fb796e 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -7,4 +7,5 @@ public interface RaceModelInterface { public int getNumberOfCars(); public int getNumberOfRounds(); public ArrayList getCars(); + public void addCar(CarServiceInterface carServiceInterface); } From f9311c98ba25026cc94edc8cceb907ffc753817d Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 04:05:27 +0900 Subject: [PATCH 024/153] feat(Race): add addCar --- src/main/java/model/Race.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 3e84fb08..b241d91a 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -32,6 +32,11 @@ public int getNumberOfRounds() { return numberOfRounds; } + @Override + public void addCar(CarServiceInterface carServiceInterface) { + + } + @Override public ArrayList getCars() { return cars; From 27d6ff8dc2257e19da65aeef3f75feb55df72e48 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 04:06:20 +0900 Subject: [PATCH 025/153] feat(test): add tests --- src/test/java/CarServiceTest.java | 3 +++ src/test/java/RaceServiceTest.java | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 src/test/java/CarServiceTest.java create mode 100644 src/test/java/RaceServiceTest.java diff --git a/src/test/java/CarServiceTest.java b/src/test/java/CarServiceTest.java new file mode 100644 index 00000000..31a07901 --- /dev/null +++ b/src/test/java/CarServiceTest.java @@ -0,0 +1,3 @@ +public class CarServiceTest { + +} diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java new file mode 100644 index 00000000..78540e4f --- /dev/null +++ b/src/test/java/RaceServiceTest.java @@ -0,0 +1,3 @@ +public class RaceServiceTest { + +} From cc46845bc5b6ad46dd2150b8542c3b2f0407054b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 04:08:48 +0900 Subject: [PATCH 026/153] feat(view): add RaceView --- src/main/java/view/RaceView.java | 40 ++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/main/java/view/RaceView.java diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java new file mode 100644 index 00000000..71a69cf8 --- /dev/null +++ b/src/main/java/view/RaceView.java @@ -0,0 +1,40 @@ +package view; + +import controller.RaceControllerInterface; +import observer.Observer; +import service.RaceServiceInterface; + +public class RaceView implements Observer, RaceViewInterface { + private RaceServiceInterface raceServiceInterface; + private RaceControllerInterface raceControllerInterface; + + @Override + public void update() { + + } + + @Override + public void userCarsInput() { + + } + + @Override + public void userRoundsInput() { + + } + + @Override + public void printProgress() { + + } + + @Override + public void printProcess() { + + } + + @Override + public void printResult() { + + } +} From f80fb0e961772c4d3c83cd0017fc04439290cae2 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 04:09:55 +0900 Subject: [PATCH 027/153] feat(controller): add RaceController --- src/main/java/controller/RaceController.java | 35 ++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 src/main/java/controller/RaceController.java diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java new file mode 100644 index 00000000..da7faa0f --- /dev/null +++ b/src/main/java/controller/RaceController.java @@ -0,0 +1,35 @@ +package controller; + +import service.CarServiceInterface; +import service.RaceServiceInterface; +import view.RaceViewInterface; + +public class RaceController implements RaceControllerInterface { + private RaceServiceInterface race; + private RaceViewInterface view; + + @Override + public void init() { + + } + + @Override + public void play() { + + } + + @Override + public void end() { + + } + + @Override + public void addCar(CarServiceInterface carServiceInterface) { + + } + + @Override + public void setRound(int numberOfRound) { + + } +} From 6ca30e64d35bf168f640f508ff26ea40e16a3f3d Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 3 Jun 2024 15:33:37 +0900 Subject: [PATCH 028/153] style: rewrite for the convention --- src/main/java/controller/RaceController.java | 1 + src/main/java/controller/RaceControllerInterface.java | 5 +++++ src/main/java/model/CarModelInterface.java | 3 +++ src/main/java/model/Race.java | 7 +++++-- src/main/java/model/RaceModelInterface.java | 4 ++++ src/main/java/observer/Observer.java | 1 + src/main/java/observer/Subject.java | 3 +++ src/main/java/service/CarService.java | 1 + src/main/java/service/CarServiceInterface.java | 1 + src/main/java/service/RaceService.java | 1 + src/main/java/service/RaceServiceInterface.java | 4 ++++ src/main/java/view/RaceView.java | 1 + src/main/java/view/RaceViewInterface.java | 5 +++++ 13 files changed, 35 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index da7faa0f..8e3d0fb8 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -5,6 +5,7 @@ import view.RaceViewInterface; public class RaceController implements RaceControllerInterface { + private RaceServiceInterface race; private RaceViewInterface view; diff --git a/src/main/java/controller/RaceControllerInterface.java b/src/main/java/controller/RaceControllerInterface.java index 28fa405e..69b0a1c6 100644 --- a/src/main/java/controller/RaceControllerInterface.java +++ b/src/main/java/controller/RaceControllerInterface.java @@ -3,9 +3,14 @@ import service.CarServiceInterface; public interface RaceControllerInterface { + public void init(); + public void play(); + public void end(); + public void addCar(CarServiceInterface carServiceInterface); + public void setRound(int numberOfRound); } diff --git a/src/main/java/model/CarModelInterface.java b/src/main/java/model/CarModelInterface.java index dfc8605f..9b3ca692 100644 --- a/src/main/java/model/CarModelInterface.java +++ b/src/main/java/model/CarModelInterface.java @@ -1,7 +1,10 @@ package model; public interface CarModelInterface { + public String getName(); + public int getProgress(); + public void setProgress(int progress); } diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index b241d91a..7dfa5d1c 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -6,6 +6,7 @@ import service.CarServiceInterface; public class Race implements Subject, RaceModelInterface { + private final int numberOfRounds; private ArrayList cars; private ArrayList observers; @@ -23,7 +24,7 @@ public Race(int numberOfRounds) { } @Override - public int getNumberOfCars() { + public int getNumberOfCars() { return cars.size(); } @@ -54,6 +55,8 @@ public void removeObserver(Observer observer) { @Override public void notifyObservers() { - for (Observer observer : observers) observer.update(); + for (Observer observer : observers) { + observer.update(); + } } } diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 64fb796e..80655726 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -4,8 +4,12 @@ import service.CarServiceInterface; public interface RaceModelInterface { + public int getNumberOfCars(); + public int getNumberOfRounds(); + public ArrayList getCars(); + public void addCar(CarServiceInterface carServiceInterface); } diff --git a/src/main/java/observer/Observer.java b/src/main/java/observer/Observer.java index 549318a1..cab0a629 100644 --- a/src/main/java/observer/Observer.java +++ b/src/main/java/observer/Observer.java @@ -1,5 +1,6 @@ package observer; public interface Observer { + public void update(); } diff --git a/src/main/java/observer/Subject.java b/src/main/java/observer/Subject.java index 4aecea30..d4299ddc 100644 --- a/src/main/java/observer/Subject.java +++ b/src/main/java/observer/Subject.java @@ -1,7 +1,10 @@ package observer; public interface Subject { + public void addObserver(Observer observer); + public void removeObserver(Observer observer); + public void notifyObservers(); } diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index 2fffb112..769a5f80 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -3,6 +3,7 @@ import model.CarModelInterface; public class CarService implements CarServiceInterface { + private CarModelInterface car; public void goForward() { diff --git a/src/main/java/service/CarServiceInterface.java b/src/main/java/service/CarServiceInterface.java index f2d0d19b..b8941913 100644 --- a/src/main/java/service/CarServiceInterface.java +++ b/src/main/java/service/CarServiceInterface.java @@ -1,5 +1,6 @@ package service; public interface CarServiceInterface { + public void move(); } diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 61af10be..f0971891 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -6,6 +6,7 @@ import observer.Subject; public class RaceService implements Subject, RaceServiceInterface { + private RaceModelInterface race; @Override diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index c4698f68..af99e03f 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -3,8 +3,12 @@ import java.util.ArrayList; public interface RaceServiceInterface { + public int getNumberOfCars(); + public int getNumberOfRounds(); + public ArrayList getCars(); + public void addCar(CarServiceInterface carServiceInterface); } diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 71a69cf8..bd7cdde3 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -5,6 +5,7 @@ import service.RaceServiceInterface; public class RaceView implements Observer, RaceViewInterface { + private RaceServiceInterface raceServiceInterface; private RaceControllerInterface raceControllerInterface; diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index 5ad1ca4e..635ce6ba 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -1,9 +1,14 @@ package view; public interface RaceViewInterface { + public void userCarsInput(); + public void userRoundsInput(); + public void printProgress(); + public void printProcess(); + public void printResult(); } From 604ce5ead30a5da74fb58d5c3f4f31faa291b660 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 13:28:51 +0900 Subject: [PATCH 029/153] feat(RaceControllerInterface): change a parameter of addCar and name to addCars --- src/main/java/controller/RaceControllerInterface.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/RaceControllerInterface.java b/src/main/java/controller/RaceControllerInterface.java index 69b0a1c6..e5a16115 100644 --- a/src/main/java/controller/RaceControllerInterface.java +++ b/src/main/java/controller/RaceControllerInterface.java @@ -1,6 +1,6 @@ package controller; -import service.CarServiceInterface; +import service.RaceServiceInterface; public interface RaceControllerInterface { @@ -10,7 +10,7 @@ public interface RaceControllerInterface { public void end(); - public void addCar(CarServiceInterface carServiceInterface); + public void addCars(RaceServiceInterface raceServiceInterface); public void setRound(int numberOfRound); } From 60a2913517a0ab24af1b42b8108b664bee17f8d7 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 13:34:37 +0900 Subject: [PATCH 030/153] feat(RaceControllerInterface): change a parameter of addCars --- src/main/java/controller/RaceControllerInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/controller/RaceControllerInterface.java b/src/main/java/controller/RaceControllerInterface.java index e5a16115..838da026 100644 --- a/src/main/java/controller/RaceControllerInterface.java +++ b/src/main/java/controller/RaceControllerInterface.java @@ -10,7 +10,7 @@ public interface RaceControllerInterface { public void end(); - public void addCars(RaceServiceInterface raceServiceInterface); + public void addCars(String[] cars); public void setRound(int numberOfRound); } From add643497599c7974a1d6e7637bc8af069d9baa1 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 13:57:15 +0900 Subject: [PATCH 031/153] feat(RaceView): add userCarsInput method --- src/main/java/view/RaceView.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index bd7cdde3..0d7a0514 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -1,6 +1,8 @@ package view; import controller.RaceControllerInterface; +import java.util.Arrays; +import java.util.Scanner; import observer.Observer; import service.RaceServiceInterface; @@ -14,9 +16,19 @@ public void update() { } + // 자동차 이름을 입력받는 메서드 @Override public void userCarsInput() { + // 안내문 출력 + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분"); + // 유저의 입력을 받고 token으로 쪼개기 + Scanner sc = new Scanner(System.in); + String userInput = sc.nextLine(); + String[] cars = userInput.split(","); + + // Controller에게 유저의 입력을 전달 + raceControllerInterface.addCars(cars); } @Override From b8c4593b371042b7bc234d34ae4c9d11a460bbe0 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 17:23:38 +0900 Subject: [PATCH 032/153] feat(RaceModelInterface): change a parameter of addCar and name to addCars --- src/main/java/model/RaceModelInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 80655726..97b878a4 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -11,5 +11,5 @@ public interface RaceModelInterface { public ArrayList getCars(); - public void addCar(CarServiceInterface carServiceInterface); + public void addCars(String[] cars); } From 9850b7211e48d171c9245832c052942c0144b7ff Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 17:29:05 +0900 Subject: [PATCH 033/153] feat(observer): add SubjectModel class --- src/main/java/observer/SubjectModel.java | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 src/main/java/observer/SubjectModel.java diff --git a/src/main/java/observer/SubjectModel.java b/src/main/java/observer/SubjectModel.java new file mode 100644 index 00000000..1a35ddf0 --- /dev/null +++ b/src/main/java/observer/SubjectModel.java @@ -0,0 +1,7 @@ +package observer; + +import java.util.ArrayList; + +public interface SubjectModel { + public ArrayList getObservers(); +} From 1286d87109dc27a440cdfa913e0368fb6ca424af Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 17:31:12 +0900 Subject: [PATCH 034/153] change implementation from Subject to SubjectModel --- src/main/java/model/Race.java | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 7dfa5d1c..b24a6f74 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -3,9 +3,10 @@ import java.util.ArrayList; import observer.Observer; import observer.Subject; +import observer.SubjectModel; import service.CarServiceInterface; -public class Race implements Subject, RaceModelInterface { +public class Race implements SubjectModel, RaceModelInterface { private final int numberOfRounds; private ArrayList cars; @@ -33,30 +34,13 @@ public int getNumberOfRounds() { return numberOfRounds; } - @Override - public void addCar(CarServiceInterface carServiceInterface) { - - } - @Override public ArrayList getCars() { return cars; } @Override - public void addObserver(Observer observer) { - observers.add(observer); - } - - @Override - public void removeObserver(Observer observer) { - observers.remove(observer); - } - - @Override - public void notifyObservers() { - for (Observer observer : observers) { - observer.update(); - } + public ArrayList getObservers() { + return observers; } } From 19fc2de8fa46708d74a5e50bd5d7556c4d7f5ab8 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 17:32:29 +0900 Subject: [PATCH 035/153] feat(RaceModelInterface): remove addCars method --- src/main/java/model/RaceModelInterface.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 97b878a4..9874838f 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -10,6 +10,4 @@ public interface RaceModelInterface { public int getNumberOfRounds(); public ArrayList getCars(); - - public void addCars(String[] cars); } From 6b07ef97b1fb8bbd466c65894e71c8d1a9e66da6 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 17:58:42 +0900 Subject: [PATCH 036/153] feat(RaceServiceInterface): change a parameter of addCar and name to addCars --- src/main/java/service/RaceServiceInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index af99e03f..5d908137 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -10,5 +10,5 @@ public interface RaceServiceInterface { public ArrayList getCars(); - public void addCar(CarServiceInterface carServiceInterface); + public void addCars(String[] cars); } From f6be86558f07218efafa2339de3bedca32772aad Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 17:59:32 +0900 Subject: [PATCH 037/153] feat(RaceService): change a parameter of addCar and name to addCars --- src/main/java/service/RaceService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index f0971891..11705ddf 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -25,7 +25,7 @@ public ArrayList getCars() { } @Override - public void addCar(CarServiceInterface carServiceInterface) { + public void addCars(String[] cars) { } From a0b5e18ff829b65a1d46d6039816b5aa210330f5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 18:14:00 +0900 Subject: [PATCH 038/153] feat(RaceViewInterface): add two methods which print an error message --- src/main/java/view/RaceViewInterface.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index 635ce6ba..c389c155 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -11,4 +11,8 @@ public interface RaceViewInterface { public void printProcess(); public void printResult(); + + public void printCarsErrorMessage(String msg); + + public void printRoundsErrorMessage(String msg); } From d13ede92a3cc62c8b6866dc930364d16e075249a Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 18:16:13 +0900 Subject: [PATCH 039/153] feat(RaceController): add addCars method --- src/main/java/controller/RaceController.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 8e3d0fb8..7fa1c4f7 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -1,5 +1,7 @@ package controller; +import java.util.Arrays; +import java.util.stream.Collectors; import service.CarServiceInterface; import service.RaceServiceInterface; import view.RaceViewInterface; @@ -25,8 +27,13 @@ public void end() { } @Override - public void addCar(CarServiceInterface carServiceInterface) { - + public void addCars(String[] cars) { + try { + race.addCars(cars); + } catch (IllegalArgumentException e) { + view.printCarsErrorMessage(e.getMessage()); + view.userCarsInput(); + } } @Override From 655c09f88bd975aa856717e1aec272907ccdbf29 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 18:17:07 +0900 Subject: [PATCH 040/153] feat(RaceView): add two implementation methods --- src/main/java/view/RaceView.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 0d7a0514..ef7794b4 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -50,4 +50,14 @@ public void printProcess() { public void printResult() { } + + @Override + public void printCarsErrorMessage(String msg) { + + } + + @Override + public void printRoundsErrorMessage(String msg) { + + } } From 4d5d5c9addb3f303f6c0db0fb4d5dc400cce7df3 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 18:20:38 +0900 Subject: [PATCH 041/153] docs(RaceController): add comments for addCars --- src/main/java/controller/RaceController.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 7fa1c4f7..8bcb2757 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -26,12 +26,16 @@ public void end() { } + // view에서 입력으로 들어온 차를 생성하도록 race에 전달 @Override public void addCars(String[] cars) { try { + // 생성 시도 race.addCars(cars); } catch (IllegalArgumentException e) { + // 5글자를 넘은 경우, error 메시지를 출력하고, view.printCarsErrorMessage(e.getMessage()); + // 다시 view에 입력을 요청 view.userCarsInput(); } } From 1abfc56826a5eb5a5e41cfec02a5391ff4223d9e Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Tue, 4 Jun 2024 18:59:46 +0900 Subject: [PATCH 042/153] feat(Race): remove a constructor which accept one parameter --- src/main/java/model/Race.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index b24a6f74..e4f7bdbb 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -18,12 +18,6 @@ public Race() { observers = null; } - public Race(int numberOfRounds) { - this.numberOfRounds = numberOfRounds; - cars = new ArrayList<>(); - observers = new ArrayList<>(); - } - @Override public int getNumberOfCars() { return cars.size(); From d554e07da5d6c40183ed1db4d117991662d3b09c Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:08:21 +0900 Subject: [PATCH 043/153] feat(RaceModelInterface): add setNumberOfRounds method --- src/main/java/model/RaceModelInterface.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 9874838f..5ba164d2 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -9,5 +9,7 @@ public interface RaceModelInterface { public int getNumberOfRounds(); + public void setNumberOfRounds(int numberOfRounds); + public ArrayList getCars(); } From 90f7a8fe09b80f40d45c977114df74e9e26bfbb8 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:08:40 +0900 Subject: [PATCH 044/153] feat(Race): add setNumberOfRounds method --- src/main/java/model/Race.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index e4f7bdbb..5fd94bf9 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -2,13 +2,12 @@ import java.util.ArrayList; import observer.Observer; -import observer.Subject; import observer.SubjectModel; import service.CarServiceInterface; public class Race implements SubjectModel, RaceModelInterface { - private final int numberOfRounds; + private int numberOfRounds; private ArrayList cars; private ArrayList observers; @@ -33,6 +32,11 @@ public ArrayList getCars() { return cars; } + @Override + public void setNumberOfRounds(int numberOfRounds) { + this.numberOfRounds = numberOfRounds; + } + @Override public ArrayList getObservers() { return observers; From 419933e655ec38b1275c5c5d2e84d61af937045c Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:14:17 +0900 Subject: [PATCH 045/153] feat(RaceServiceInterface): add setNumberOfRounds method --- src/main/java/service/RaceServiceInterface.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 5d908137..ec7d018c 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -11,4 +11,6 @@ public interface RaceServiceInterface { public ArrayList getCars(); public void addCars(String[] cars); + + public void setNumberOfRounds(int numberOfRounds); } From 0084a0664627cf86267613dde368b2b0a95924c2 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:15:24 +0900 Subject: [PATCH 046/153] feat(RaceService): add setNumberOfRounds method --- src/main/java/service/RaceService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 11705ddf..4618462a 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -29,6 +29,11 @@ public void addCars(String[] cars) { } + @Override + public void setNumberOfRounds(int numberOfRounds) { + race.setNumberOfRounds(numberOfRounds); + } + public boolean roundValidation() { return true; } From 2831489340adb7a7879d940f4e61767bd854c4c5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:17:53 +0900 Subject: [PATCH 047/153] feat(RaceController): add setRound method --- src/main/java/controller/RaceController.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 8bcb2757..4f16af76 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -33,15 +33,24 @@ public void addCars(String[] cars) { // 생성 시도 race.addCars(cars); } catch (IllegalArgumentException e) { - // 5글자를 넘은 경우, error 메시지를 출력하고, + // 5글자를 넘은 경우, error 메시지를 출력하고 view.printCarsErrorMessage(e.getMessage()); // 다시 view에 입력을 요청 view.userCarsInput(); } } + // view에서 입력으로 들어온 횟수를 저장하도록 race에 전달 @Override public void setRound(int numberOfRound) { - + // 전달 시도 + try { + race.setNumberOfRounds(numberOfRound); + } catch (IllegalArgumentException e) { + // 숫자가 아니거나 숫자가 너무 큰 경우, error 메시지를 출력하고 + view.printRoundsErrorMessage(e.getMessage()); + // 다시 view에 입력을 요청 + view.userRoundsInput(); + } } } From 481834f5a567a290e95cbaeb8943b312d4adbc43 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:23:18 +0900 Subject: [PATCH 048/153] feat(RaceView): add userRoundsInput method --- src/main/java/view/RaceView.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index ef7794b4..4be1b864 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -33,7 +33,15 @@ public void userCarsInput() { @Override public void userRoundsInput() { + // 안내문 출력 + System.out.println("시도할 횟수는 몇 회인가요?"); + // 유저의 입력을 받기 + Scanner sc = new Scanner(System.in); + String userInput = sc.nextLine(); + + // Controller에게 유저의 입력을 전달 + raceControllerInterface.setRound(userInput); } @Override From f0b5507f41075a61029b38831e43e277182d5dbc Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:24:27 +0900 Subject: [PATCH 049/153] feat(RaceControllerInterface): change a parameter of setRound method --- src/main/java/controller/RaceControllerInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/controller/RaceControllerInterface.java b/src/main/java/controller/RaceControllerInterface.java index 838da026..f2b6e741 100644 --- a/src/main/java/controller/RaceControllerInterface.java +++ b/src/main/java/controller/RaceControllerInterface.java @@ -12,5 +12,5 @@ public interface RaceControllerInterface { public void addCars(String[] cars); - public void setRound(int numberOfRound); + public void setRound(String numberOfRound); } From 268f4969bc2b78883c597e8a79dce89e8811bc8c Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:25:02 +0900 Subject: [PATCH 050/153] feat(RaceController): change a parameter's type of setRound method --- src/main/java/controller/RaceController.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 4f16af76..216f022f 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -42,7 +42,7 @@ public void addCars(String[] cars) { // view에서 입력으로 들어온 횟수를 저장하도록 race에 전달 @Override - public void setRound(int numberOfRound) { + public void setRound(String numberOfRound) { // 전달 시도 try { race.setNumberOfRounds(numberOfRound); From 618b019c095e720372e296f3d60fd4772b8f8801 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:25:58 +0900 Subject: [PATCH 051/153] feat(RaceModelInterface): change a parameter's type of setNumberOfRounds method --- src/main/java/model/RaceModelInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 5ba164d2..bb6a7c94 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -9,7 +9,7 @@ public interface RaceModelInterface { public int getNumberOfRounds(); - public void setNumberOfRounds(int numberOfRounds); + public void setNumberOfRounds(String numberOfRounds); public ArrayList getCars(); } From 8ad8f59c5a596bfcc31e14cb1bdf20252faf4efd Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:27:18 +0900 Subject: [PATCH 052/153] feat(RaceModelInterface): change a parameter's type of setNumberOfRounds method --- src/main/java/model/RaceModelInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index bb6a7c94..5ba164d2 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -9,7 +9,7 @@ public interface RaceModelInterface { public int getNumberOfRounds(); - public void setNumberOfRounds(String numberOfRounds); + public void setNumberOfRounds(int numberOfRounds); public ArrayList getCars(); } From edb3fd29147dba75fd0d88e42f25ae5de06aa04c Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:28:05 +0900 Subject: [PATCH 053/153] feat(RaceServiceInterface): change a parameter's type of setNumberOfRounds method --- src/main/java/service/RaceServiceInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index ec7d018c..f7301c0b 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -12,5 +12,5 @@ public interface RaceServiceInterface { public void addCars(String[] cars); - public void setNumberOfRounds(int numberOfRounds); + public void setNumberOfRounds(String numberOfRounds); } From 685e36c5b81c0148a3b0472e4a67e43a3d25fd07 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:35:15 +0900 Subject: [PATCH 054/153] feat(RaceView): add a condition for the user input --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 4be1b864..70fbc6f2 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -34,7 +34,7 @@ public void userCarsInput() { @Override public void userRoundsInput() { // 안내문 출력 - System.out.println("시도할 횟수는 몇 회인가요?"); + System.out.println("시도할 횟수는 몇 회인가요? (100회 이하만 가능합니다.)"); // 유저의 입력을 받기 Scanner sc = new Scanner(System.in); From 804f5488402e30e21dec4ce1e7e4707c6a2dcfb1 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:48:18 +0900 Subject: [PATCH 055/153] feat(RaceService): add setNumberOfRounds method --- src/main/java/service/RaceService.java | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 4618462a..9bf153d1 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -30,7 +30,15 @@ public void addCars(String[] cars) { } @Override - public void setNumberOfRounds(int numberOfRounds) { + public void setNumberOfRounds(String rounds) throws IllegalArgumentException, NumberFormatException { + // 수가 아닌 경우 + int numberOfRounds = Integer.parseInt(rounds); + + // 100보다 큰 입력이 들어온 경우 + if (numberOfRounds > 100) { + throw new IllegalArgumentException(); + } + race.setNumberOfRounds(numberOfRounds); } From 3979b32878e1f13584cb3f988738b0bdd2804571 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:49:00 +0900 Subject: [PATCH 056/153] feat(RaceServiceInterface): change a parameter's name of setNumberOfRounds method --- src/main/java/service/RaceServiceInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index f7301c0b..d3534312 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -12,5 +12,5 @@ public interface RaceServiceInterface { public void addCars(String[] cars); - public void setNumberOfRounds(String numberOfRounds); + public void setNumberOfRounds(String rounds); } From b8a9722e3fdd637648d7611402b8699dfb6be08e Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:51:02 +0900 Subject: [PATCH 057/153] feat(RaceView): remove a parameter of printRoundsErrorMessage method --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 70fbc6f2..e87bc225 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -65,7 +65,7 @@ public void printCarsErrorMessage(String msg) { } @Override - public void printRoundsErrorMessage(String msg) { + public void printRoundsErrorMessage() { } } From 38df14445d637de91d83c4df6551c8cc5a35a226 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:51:40 +0900 Subject: [PATCH 058/153] feat(RaceViewInterface): remove a parameter of printRoundsErrorMessage method --- src/main/java/view/RaceViewInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index c389c155..afbd3d0e 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -14,5 +14,5 @@ public interface RaceViewInterface { public void printCarsErrorMessage(String msg); - public void printRoundsErrorMessage(String msg); + public void printRoundsErrorMessage(); } From d0da8803ba0797f3a1dce5439c75f0749a9b84eb Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:55:42 +0900 Subject: [PATCH 059/153] feat(RaceViewInterface): divide printRoundsErrorMessage in Argument and Format --- src/main/java/view/RaceViewInterface.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index afbd3d0e..fa5a2d9c 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -14,5 +14,7 @@ public interface RaceViewInterface { public void printCarsErrorMessage(String msg); - public void printRoundsErrorMessage(); + public void printRoundsArgumentErrorMessage(); + + public void printRoundsFormatErrorMessage(); } From abd19d667e38863355a35261eb8031a0fd43913c Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 15:57:05 +0900 Subject: [PATCH 060/153] feat(RaceView): divide printRoundsErrorMessage in Argument and Format --- src/main/java/controller/RaceController.java | 4 +++- src/main/java/view/RaceView.java | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 216f022f..e233a890 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -48,9 +48,11 @@ public void setRound(String numberOfRound) { race.setNumberOfRounds(numberOfRound); } catch (IllegalArgumentException e) { // 숫자가 아니거나 숫자가 너무 큰 경우, error 메시지를 출력하고 - view.printRoundsErrorMessage(e.getMessage()); + view.printRoundsErrorMessage(); // 다시 view에 입력을 요청 view.userRoundsInput(); + } catch (NumberFormatException e) { + view.p } } } diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index e87bc225..57b8fc6f 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -65,7 +65,12 @@ public void printCarsErrorMessage(String msg) { } @Override - public void printRoundsErrorMessage() { + public void printRoundsArgumentErrorMessage() { + + } + + @Override + public void printRoundsFormatErrorMessage() { } } From 2998d4a73d7febef25657b0807b9edee43b60120 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:03:03 +0900 Subject: [PATCH 061/153] feat(RaceController): add setRound method --- src/main/java/controller/RaceController.java | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index e233a890..4c6d1e99 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -46,13 +46,16 @@ public void setRound(String numberOfRound) { // 전달 시도 try { race.setNumberOfRounds(numberOfRound); + } catch (NumberFormatException e) { + // 숫자가 아닌 경우, error 메시지를 출력 + view.printRoundsFormatErrorMessage(); + // 다시 view에 입력을 요청 + view.userRoundsInput(); } catch (IllegalArgumentException e) { - // 숫자가 아니거나 숫자가 너무 큰 경우, error 메시지를 출력하고 - view.printRoundsErrorMessage(); + // 숫자가 너무 큰 경우, error 메시지를 출력 + view.printRoundsArgumentErrorMessage(); // 다시 view에 입력을 요청 view.userRoundsInput(); - } catch (NumberFormatException e) { - view.p } } } From a891207e1d82b303e804ee2f0496d0b39e89ca09 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:04:36 +0900 Subject: [PATCH 062/153] feat(RaceController): add init method --- src/main/java/controller/RaceController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 4c6d1e99..5b72fd3c 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -13,7 +13,8 @@ public class RaceController implements RaceControllerInterface { @Override public void init() { - + view.userCarsInput(); + view.userRoundsInput(); } @Override From e813bbbbe7263db0bab7b2c4e55f31d92b77b2c1 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:19:50 +0900 Subject: [PATCH 063/153] feat(RaceController): add constructor --- src/main/java/controller/RaceController.java | 9 ++++++--- src/main/java/view/RaceView.java | 1 - 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 5b72fd3c..74807a4c 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -1,8 +1,5 @@ package controller; -import java.util.Arrays; -import java.util.stream.Collectors; -import service.CarServiceInterface; import service.RaceServiceInterface; import view.RaceViewInterface; @@ -11,6 +8,12 @@ public class RaceController implements RaceControllerInterface { private RaceServiceInterface race; private RaceViewInterface view; + // 생성자 + public RaceController(RaceServiceInterface race, RaceViewInterface view) { + this.race = race; + this.view = view; + } + @Override public void init() { view.userCarsInput(); diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 57b8fc6f..7642a625 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -1,7 +1,6 @@ package view; import controller.RaceControllerInterface; -import java.util.Arrays; import java.util.Scanner; import observer.Observer; import service.RaceServiceInterface; From 021374f5780e575355ba0feb57f1f57c9ccb10c5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:20:54 +0900 Subject: [PATCH 064/153] feat(RaceView): add constructor --- src/main/java/view/RaceView.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 7642a625..6d611a20 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -10,6 +10,13 @@ public class RaceView implements Observer, RaceViewInterface { private RaceServiceInterface raceServiceInterface; private RaceControllerInterface raceControllerInterface; + // 생성자 + public RaceView(RaceServiceInterface raceServiceInterface, + RaceControllerInterface raceControllerInterface) { + this.raceServiceInterface = raceServiceInterface; + this.raceControllerInterface = raceControllerInterface; + } + @Override public void update() { From b515610c0a60273fedb2f31bce3de25c562c8046 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:23:28 +0900 Subject: [PATCH 065/153] feat(CarService): add constructor --- src/main/java/service/CarService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index 769a5f80..fda564c5 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -1,11 +1,17 @@ package service; +import model.Car; import model.CarModelInterface; public class CarService implements CarServiceInterface { private CarModelInterface car; + // 생성자 + public CarService(String name, int progress) { + car = new Car(name, progress); + } + public void goForward() { } From ae8dd7d86ae3417aea47d4df77897b5673dc9e84 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:25:42 +0900 Subject: [PATCH 066/153] feat(RaceService): add constructor --- src/main/java/service/RaceService.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 9bf153d1..571e9ad8 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -1,6 +1,7 @@ package service; import java.util.ArrayList; +import model.Race; import model.RaceModelInterface; import observer.Observer; import observer.Subject; @@ -9,6 +10,11 @@ public class RaceService implements Subject, RaceServiceInterface { private RaceModelInterface race; + // 생성자 + public RaceService() { + race = new Race(); + } + @Override public int getNumberOfCars() { return 0; From dcc12b471bcc01803c34af4c5b7c12c06fa9e07f Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:30:47 +0900 Subject: [PATCH 067/153] feat(RaceService): getNumberOfCars method --- src/main/java/service/RaceService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 571e9ad8..5cb00545 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -10,14 +10,14 @@ public class RaceService implements Subject, RaceServiceInterface { private RaceModelInterface race; - // 생성자 + // 생성자: public RaceService() { race = new Race(); } @Override public int getNumberOfCars() { - return 0; + return race.getNumberOfCars(); } @Override From 8f38164de9863146b0979764a50352ac9c012c8e Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:31:06 +0900 Subject: [PATCH 068/153] feat(RaceService): getNumberOfRounds method --- src/main/java/service/RaceService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 5cb00545..5ec1f8c9 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -22,7 +22,7 @@ public int getNumberOfCars() { @Override public int getNumberOfRounds() { - return 0; + return race.getNumberOfRounds(); } @Override From f15f13036379e8e0382bcf9ce4c40c60f0c6bc1b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 16:32:14 +0900 Subject: [PATCH 069/153] feat(RaceService): getCars method --- src/main/java/service/RaceService.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 5ec1f8c9..3f4206f7 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -27,7 +27,7 @@ public int getNumberOfRounds() { @Override public ArrayList getCars() { - return null; + return race.getCars(); } @Override @@ -36,7 +36,8 @@ public void addCars(String[] cars) { } @Override - public void setNumberOfRounds(String rounds) throws IllegalArgumentException, NumberFormatException { + public void setNumberOfRounds(String rounds) + throws IllegalArgumentException, NumberFormatException { // 수가 아닌 경우 int numberOfRounds = Integer.parseInt(rounds); From a5408cb903b2beffd0b60c6491de95dd86b2bcb6 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 17:05:39 +0900 Subject: [PATCH 070/153] feat(RaceService): add addCars method --- src/main/java/service/RaceService.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 3f4206f7..89584d78 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -1,6 +1,9 @@ package service; import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; import model.Race; import model.RaceModelInterface; import observer.Observer; @@ -30,9 +33,21 @@ public ArrayList getCars() { return race.getCars(); } + // controller가 넘겨준 차 목록을 추가하는 메서드 @Override - public void addCars(String[] cars) { + public void addCars(String[] cars) throws IllegalArgumentException { + ArrayList carList = race.getCars(); + // cars의 원소 중에 길이가 5 이상인 것이 있다면 예외를 반환 + boolean isWrongArgument = Arrays.stream(cars).anyMatch(car -> car.length() > 5); + if (isWrongArgument) { + throw new IllegalArgumentException(); + } + + // 그렇지 않다면 차 목록을 추가 + List tempList = Arrays.stream(cars).map(car -> new CarService(car, 0)) + .collect(Collectors.toList()); + carList.addAll(tempList); } @Override From 7f26377dab33b47b5cfd4dd354881a5224f03787 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 17:06:54 +0900 Subject: [PATCH 071/153] feat(RaceService): remote roundValidation method --- src/main/java/service/RaceService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 89584d78..b68271a0 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -64,10 +64,6 @@ public void setNumberOfRounds(String rounds) race.setNumberOfRounds(numberOfRounds); } - public boolean roundValidation() { - return true; - } - @Override public void addObserver(Observer observer) { From 47c3121a8b757f10d56066070774e5c2ff5b9272 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 17:07:52 +0900 Subject: [PATCH 072/153] feat(CarService): remove nameValidation method --- src/main/java/service/CarService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index fda564c5..fa555bd0 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -20,8 +20,4 @@ public void goForward() { public void move() { } - - public boolean nameValidation() { - return true; - } } From 33b24e2b36c509ec0bfea84e8be3a3698d3f9a95 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 17:17:18 +0900 Subject: [PATCH 073/153] feat(RaceView): add update method --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 6d611a20..422b929c 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -19,7 +19,7 @@ public RaceView(RaceServiceInterface raceServiceInterface, @Override public void update() { - + printProgress(); } // 자동차 이름을 입력받는 메서드 From 1191fb8431f139907bec122a4abb281957e003c8 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 17:27:13 +0900 Subject: [PATCH 074/153] refactor(RaceService): change a parameter's name of lambda expression --- src/main/java/service/RaceService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index b68271a0..794ecc35 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -39,13 +39,13 @@ public void addCars(String[] cars) throws IllegalArgumentException { ArrayList carList = race.getCars(); // cars의 원소 중에 길이가 5 이상인 것이 있다면 예외를 반환 - boolean isWrongArgument = Arrays.stream(cars).anyMatch(car -> car.length() > 5); + boolean isWrongArgument = Arrays.stream(cars).anyMatch(carName -> carName.length() > 5); if (isWrongArgument) { throw new IllegalArgumentException(); } // 그렇지 않다면 차 목록을 추가 - List tempList = Arrays.stream(cars).map(car -> new CarService(car, 0)) + List tempList = Arrays.stream(cars).map(carName -> new CarService(carName, 0)) .collect(Collectors.toList()); carList.addAll(tempList); } From 361a630dd648d1bb2a38210063d8ba5a24e04cc1 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 17:32:05 +0900 Subject: [PATCH 075/153] feat(CarServiceInterface): add getName method and getProgress method --- src/main/java/service/CarServiceInterface.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/CarServiceInterface.java b/src/main/java/service/CarServiceInterface.java index b8941913..f1138468 100644 --- a/src/main/java/service/CarServiceInterface.java +++ b/src/main/java/service/CarServiceInterface.java @@ -2,5 +2,9 @@ public interface CarServiceInterface { - public void move(); + public String getName(); + + public int getProgress(); + + public void moveOrNot(); } From 5859bd5fdde358a5434fa4cb4045dcb1c1e62542 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 17:35:31 +0900 Subject: [PATCH 076/153] feat(CarService): implement interface's methods --- src/main/java/service/CarService.java | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index fa555bd0..13b93d00 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -17,7 +17,17 @@ public void goForward() { } @Override - public void move() { + public String getName() { + return null; + } + + @Override + public int getProgress() { + return 0; + } + + @Override + public void moveOrNot() { } } From 3a81b850ea9835c3082f31ebbc5826e08ae9ed8b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 18:53:26 +0900 Subject: [PATCH 077/153] feat(RaceView): add printProgress method --- src/main/java/view/RaceView.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 422b929c..67f96678 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -1,8 +1,10 @@ package view; import controller.RaceControllerInterface; +import java.util.ArrayList; import java.util.Scanner; import observer.Observer; +import service.CarServiceInterface; import service.RaceServiceInterface; public class RaceView implements Observer, RaceViewInterface { @@ -50,9 +52,14 @@ public void userRoundsInput() { raceControllerInterface.setRound(userInput); } + // 한 번 진행의 결과를 보여주는 메서드 @Override public void printProgress() { - + // raceService를 통해 차 목록을 받아와서 + RaceServiceInterface raceService = raceServiceInterface; + ArrayList carList = raceService.getCars(); + // stream을 이용하여 양식에 맞게 출력 + carList.stream().forEach(car -> System.out.println(car.getName() + " : " + car.getProgress())); } @Override From ceed4806f36ad9368b6e08b50f58989121402d07 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 18:54:56 +0900 Subject: [PATCH 078/153] feat(RaceView): add println at printProgress method --- src/main/java/view/RaceView.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 67f96678..6dfd29a6 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -60,6 +60,7 @@ public void printProgress() { ArrayList carList = raceService.getCars(); // stream을 이용하여 양식에 맞게 출력 carList.stream().forEach(car -> System.out.println(car.getName() + " : " + car.getProgress())); + System.out.println(); } @Override From a3deb10e2627feaeed19cddb79101ce6eca56483 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 18:57:23 +0900 Subject: [PATCH 079/153] refactor(RaceView): remove a parameter of printCarsErrorMessage method --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 6dfd29a6..433ca605 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -74,7 +74,7 @@ public void printResult() { } @Override - public void printCarsErrorMessage(String msg) { + public void printCarsErrorMessage() { } From a7a52bf1c91fea24d2ff57d3a171319e58f149e9 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 18:57:41 +0900 Subject: [PATCH 080/153] refactor(RaceViewInterface): remove a parameter of printCarsErrorMessage method --- src/main/java/view/RaceViewInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index fa5a2d9c..3537df71 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -12,7 +12,7 @@ public interface RaceViewInterface { public void printResult(); - public void printCarsErrorMessage(String msg); + public void printCarsErrorMessage(); public void printRoundsArgumentErrorMessage(); From 25e032b27ed60111a3572d7d3e3bcad366e01b49 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 19:04:13 +0900 Subject: [PATCH 081/153] docs(RaceView): write some comments --- src/main/java/controller/RaceController.java | 2 +- src/main/java/view/RaceView.java | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 74807a4c..5c840d4c 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -38,7 +38,7 @@ public void addCars(String[] cars) { race.addCars(cars); } catch (IllegalArgumentException e) { // 5글자를 넘은 경우, error 메시지를 출력하고 - view.printCarsErrorMessage(e.getMessage()); + view.printCarsErrorMessage(); // 다시 view에 입력을 요청 view.userCarsInput(); } diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 433ca605..d91bf18e 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -9,6 +9,7 @@ public class RaceView implements Observer, RaceViewInterface { + // View가 참조할 Service와 Controller. 조작은 절대 금지. private RaceServiceInterface raceServiceInterface; private RaceControllerInterface raceControllerInterface; @@ -19,8 +20,10 @@ public RaceView(RaceServiceInterface raceServiceInterface, this.raceControllerInterface = raceControllerInterface; } + // 옵저버 패턴에서 옵저버가 갖는 메서드 @Override public void update() { + // update가 발생했으면 즉시 출력 printProgress(); } @@ -39,6 +42,7 @@ public void userCarsInput() { raceControllerInterface.addCars(cars); } + // 사용자의 횟수를 입력받는 메서드 @Override public void userRoundsInput() { // 안내문 출력 @@ -63,6 +67,7 @@ public void printProgress() { System.out.println(); } + // 전체 과정을 담당하는 메서드 @Override public void printProcess() { From 8e9cbc12e369df6cfa4556057c19bf26c23499c2 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 19:19:29 +0900 Subject: [PATCH 082/153] feat(RaceServiceInterface): add getWinners method --- src/main/java/service/RaceServiceInterface.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index d3534312..9a71536e 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -10,6 +10,8 @@ public interface RaceServiceInterface { public ArrayList getCars(); + public String getWinners(); + public void addCars(String[] cars); public void setNumberOfRounds(String rounds); From 498c8c28c9979312d4358764d1e5ed5ca6bd611b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 19:22:05 +0900 Subject: [PATCH 083/153] feat(RaceService): add getWinners method --- src/main/java/service/RaceService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 794ecc35..35f98c57 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -50,6 +50,11 @@ public void addCars(String[] cars) throws IllegalArgumentException { carList.addAll(tempList); } + @Override + public String getWinners() { + return null; + } + @Override public void setNumberOfRounds(String rounds) throws IllegalArgumentException, NumberFormatException { From 13e9aa20c47fbae30b693a9c0179628ec42b4bd9 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 19:38:35 +0900 Subject: [PATCH 084/153] feat(RaceService): add a condition at addCars --- src/main/java/service/RaceService.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 35f98c57..5af50afc 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import model.Race; @@ -38,6 +39,10 @@ public ArrayList getCars() { public void addCars(String[] cars) throws IllegalArgumentException { ArrayList carList = race.getCars(); + if (cars.length == 0) { + throw new IllegalArgumentException(); + } + // cars의 원소 중에 길이가 5 이상인 것이 있다면 예외를 반환 boolean isWrongArgument = Arrays.stream(cars).anyMatch(carName -> carName.length() > 5); if (isWrongArgument) { From 87ec1ebc74f47e580d431a93b569241b81df5ebb Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 19:39:16 +0900 Subject: [PATCH 085/153] feat(RaceService): add a comment at addCars method --- src/main/java/service/RaceService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 5af50afc..48fa5281 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -39,6 +39,7 @@ public ArrayList getCars() { public void addCars(String[] cars) throws IllegalArgumentException { ArrayList carList = race.getCars(); + // 빈 입력이 들어온 경우도 예외를 반환 if (cars.length == 0) { throw new IllegalArgumentException(); } From 0c65f49dfebf68abc58aa4841a425644b8fc1a30 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Wed, 5 Jun 2024 19:58:07 +0900 Subject: [PATCH 086/153] feat(RaceService): add getWinners method --- src/main/java/service/RaceService.java | 34 +++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 48fa5281..64864159 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -56,9 +56,41 @@ public void addCars(String[] cars) throws IllegalArgumentException { carList.addAll(tempList); } + // 우승자의 진행도를 반환하는 메서드 + private int getWinnersProgress() { + // 차들의 정보를 가져와서 + ArrayList carList = race.getCars(); + + // 진행도의 최댓값을 구한다. + int winnersProgress = 0; + for (CarServiceInterface car : carList) { + winnersProgress = Math.max(winnersProgress, car.getProgress()); + } + + return winnersProgress; + } + + // 우승자의 목록을 문자열로 나열한다. @Override public String getWinners() { - return null; + // 문자열을 빠르게 붙이기 위해 StringBuilder를 사용 + StringBuilder sb = new StringBuilder(); + // 차들의 정보를 가져오고 + ArrayList carList = race.getCars(); + // 우승자의 진행도를 가져온다. + int winnersProgress = getWinnersProgress(); + + // 우승자 목록을 stream으로 가져온다. + List winners = carList.stream().filter(car -> car.getProgress() == winnersProgress).collect(Collectors.toList()); + + // 우승자들의 정보를 String으로 변환한다. + for (int i = 0; i < winners.size()-1; i++) { + CarServiceInterface winner = winners.get(i); + sb.append(winner.getName()).append(',').append(' '); + } + sb.append(winners.get(winners.size()-1)); + + return sb.toString(); } @Override From 4626b0321da6551eec1b09b563910830d3e3dee7 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 16:28:41 +0900 Subject: [PATCH 087/153] docs(RaceService): add comment at setNumberOfRounds method --- src/main/java/service/RaceService.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 64864159..bd32854e 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -81,21 +81,23 @@ public String getWinners() { int winnersProgress = getWinnersProgress(); // 우승자 목록을 stream으로 가져온다. - List winners = carList.stream().filter(car -> car.getProgress() == winnersProgress).collect(Collectors.toList()); + List winners = carList.stream() + .filter(car -> car.getProgress() == winnersProgress).collect(Collectors.toList()); // 우승자들의 정보를 String으로 변환한다. - for (int i = 0; i < winners.size()-1; i++) { + for (int i = 0; i < winners.size() - 1; i++) { CarServiceInterface winner = winners.get(i); sb.append(winner.getName()).append(',').append(' '); } - sb.append(winners.get(winners.size()-1)); + sb.append(winners.get(winners.size() - 1)); return sb.toString(); } + // controller에게 받은 round 정보를 설정하는 메서드 @Override public void setNumberOfRounds(String rounds) - throws IllegalArgumentException, NumberFormatException { + throws IllegalArgumentException { // 수가 아닌 경우 int numberOfRounds = Integer.parseInt(rounds); From 092dd15d1bbedde030e2b995e1694723dc4d85c2 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 16:43:44 +0900 Subject: [PATCH 088/153] feat(RaceService): provide list instead of string for loosely coupling --- src/main/java/service/RaceService.java | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index bd32854e..ef733276 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -70,31 +70,22 @@ private int getWinnersProgress() { return winnersProgress; } - // 우승자의 목록을 문자열로 나열한다. + // 우승자의 목록을 반환한다. @Override - public String getWinners() { - // 문자열을 빠르게 붙이기 위해 StringBuilder를 사용 - StringBuilder sb = new StringBuilder(); + public List getWinners() { // 차들의 정보를 가져오고 ArrayList carList = race.getCars(); // 우승자의 진행도를 가져온다. int winnersProgress = getWinnersProgress(); - // 우승자 목록을 stream으로 가져온다. + // 우승자의 진행도를 바탕으로 우승자 목록을 stream으로 가져온다. List winners = carList.stream() .filter(car -> car.getProgress() == winnersProgress).collect(Collectors.toList()); - // 우승자들의 정보를 String으로 변환한다. - for (int i = 0; i < winners.size() - 1; i++) { - CarServiceInterface winner = winners.get(i); - sb.append(winner.getName()).append(',').append(' '); - } - sb.append(winners.get(winners.size() - 1)); - - return sb.toString(); + return winners; } - // controller에게 받은 round 정보를 설정하는 메서드 + // controller에게 받은 round 정보를 설정하는 메서드 @Override public void setNumberOfRounds(String rounds) throws IllegalArgumentException { From f23afd38607ff8d4b27e39a2297e85eefc52c1f5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 16:44:28 +0900 Subject: [PATCH 089/153] feat(RaceServiceInterface): provide list instead of string for loosely coupling --- src/main/java/service/RaceServiceInterface.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 9a71536e..10d09356 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -1,6 +1,7 @@ package service; import java.util.ArrayList; +import java.util.List; public interface RaceServiceInterface { @@ -10,7 +11,7 @@ public interface RaceServiceInterface { public ArrayList getCars(); - public String getWinners(); + public List getWinners(); public void addCars(String[] cars); From 73cea13146e92dda1832eff6cd36c3dc9bcbc015 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 17:07:14 +0900 Subject: [PATCH 090/153] feat(RaceView): add printResult method --- src/main/java/view/RaceView.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index d91bf18e..5afa4198 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -2,6 +2,7 @@ import controller.RaceControllerInterface; import java.util.ArrayList; +import java.util.List; import java.util.Scanner; import observer.Observer; import service.CarServiceInterface; @@ -73,9 +74,20 @@ public void printProcess() { } + // 결과를 출력하는 메서드 @Override - public void printResult() { - + public void printResult(List winners) { + // 문자열을 빠르게 붙이기 위해 StringBuilder를 사용 + StringBuilder stringBuilder = new StringBuilder(); + + // 우승자들의 정보를 String으로 변환한다. + for (int i = 0; i < winners.size() - 1; i++) { + CarServiceInterface winner = winners.get(i); + stringBuilder.append(winner.getName()).append(',').append(' '); + } + stringBuilder.append(winners.get(winners.size() - 1)); + + System.out.println("최종 우승자 : " + stringBuilder); } @Override From e508a8cb040531a1af115829e54a134d246696d3 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 17:08:15 +0900 Subject: [PATCH 091/153] feat(RaceViewInterface): add a parameter of printResult method --- src/main/java/view/RaceViewInterface.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index 3537df71..84ac65aa 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -1,5 +1,8 @@ package view; +import java.util.List; +import service.CarServiceInterface; + public interface RaceViewInterface { public void userCarsInput(); @@ -10,7 +13,7 @@ public interface RaceViewInterface { public void printProcess(); - public void printResult(); + public void printResult(List winners); public void printCarsErrorMessage(); From 69d3517135a71206fdc659dc352c31851b26b67f Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 20:20:49 +0900 Subject: [PATCH 092/153] feat(RaceView): remove a parameter of printResult method and add a reference of service interface --- src/main/java/view/RaceView.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 5afa4198..af4ba81c 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -76,7 +76,9 @@ public void printProcess() { // 결과를 출력하는 메서드 @Override - public void printResult(List winners) { + public void printResult() { + // view의 인터페이스를 통해 service가 값 참조 + List winners = raceServiceInterface.getWinners(); // 문자열을 빠르게 붙이기 위해 StringBuilder를 사용 StringBuilder stringBuilder = new StringBuilder(); From 92a4f0ebb3a87ca9d1e86892cc762340783e89ac Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 20:24:16 +0900 Subject: [PATCH 093/153] feat(RaceViewInterface): remove a parameter of printResult --- src/main/java/view/RaceViewInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index 84ac65aa..5476bf57 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -13,7 +13,7 @@ public interface RaceViewInterface { public void printProcess(); - public void printResult(List winners); + public void printResult(); public void printCarsErrorMessage(); From f03a6a146b45f59a1f9f9446320b48a4c9427d25 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 20:27:13 +0900 Subject: [PATCH 094/153] feat(RaceController): add end method --- src/main/java/controller/RaceController.java | 5 ++++- src/main/java/view/RaceView.java | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 5c840d4c..9c8161fe 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -1,5 +1,7 @@ package controller; +import java.util.List; +import service.CarServiceInterface; import service.RaceServiceInterface; import view.RaceViewInterface; @@ -25,9 +27,10 @@ public void play() { } + // 마무리 단계에서 호출하는 메서드 @Override public void end() { - + view.printResult(); } // view에서 입력으로 들어온 차를 생성하도록 race에 전달 diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index af4ba81c..694eeeb8 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -77,7 +77,7 @@ public void printProcess() { // 결과를 출력하는 메서드 @Override public void printResult() { - // view의 인터페이스를 통해 service가 값 참조 + // service 인터페이스를 통해 값 참조 List winners = raceServiceInterface.getWinners(); // 문자열을 빠르게 붙이기 위해 StringBuilder를 사용 StringBuilder stringBuilder = new StringBuilder(); From 1cc531ec94158b1ba85adb99a40731b3fd651d90 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 20:41:27 +0900 Subject: [PATCH 095/153] feat(RaceView): add printCarsErrorMessage method --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 694eeeb8..944d2e7a 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -94,7 +94,7 @@ public void printResult() { @Override public void printCarsErrorMessage() { - + System.out.println("[ERROR] 입력한 차의 이름이 올바르지 않습니다. 차의 이름은 5자 이하만 가능합니다."); } @Override From 1039beb8b71457f1697cb1139bac15b9378dd663 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 20:43:12 +0900 Subject: [PATCH 096/153] feat(RaceView): add printRoundsArgumentErrorMessage method --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 944d2e7a..b00bc71b 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -99,7 +99,7 @@ public void printCarsErrorMessage() { @Override public void printRoundsArgumentErrorMessage() { - + System.out.println("[ERROR] 횟수는 100 이하여야 합니다."); } @Override From 9c991de0bf2150dd4d0585ee5632b8692a89528c Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 20:44:25 +0900 Subject: [PATCH 097/153] feat(RaceView): add printRoundsFormatErrorMessage method --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index b00bc71b..744f6df6 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -104,6 +104,6 @@ public void printRoundsArgumentErrorMessage() { @Override public void printRoundsFormatErrorMessage() { - + System.out.println("[ERROR] 횟수는 수로 입력해야 합니다."); } } From ff52e3d09e3f5bc4811a2ce3c81ec40c67cf2ceb Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 20:51:45 +0900 Subject: [PATCH 098/153] feat(RaceView): add printProcess method --- src/main/java/view/RaceView.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 744f6df6..538e4448 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -68,10 +68,10 @@ public void printProgress() { System.out.println(); } - // 전체 과정을 담당하는 메서드 + // 과정을 담당하는 메서드 @Override public void printProcess() { - + System.out.println("실행 결과"); } // 결과를 출력하는 메서드 From 17e8e18ef495c32a35bc83848a1e7d200ad93f2b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:07:31 +0900 Subject: [PATCH 099/153] feat(RaceService): modify the type of getCars method --- src/main/java/service/RaceService.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index ef733276..1e1a309d 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -2,7 +2,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.List; import java.util.stream.Collectors; import model.Race; @@ -30,7 +29,7 @@ public int getNumberOfRounds() { } @Override - public ArrayList getCars() { + public List getCars() { return race.getCars(); } From 31e154c914a191770a73cac4002aa7b172337b5b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:07:56 +0900 Subject: [PATCH 100/153] feat(RaceServiceInterface): modify the type of getCars method --- src/main/java/service/RaceServiceInterface.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 10d09356..d41820cd 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -1,6 +1,5 @@ package service; -import java.util.ArrayList; import java.util.List; public interface RaceServiceInterface { @@ -9,7 +8,7 @@ public interface RaceServiceInterface { public int getNumberOfRounds(); - public ArrayList getCars(); + public List getCars(); public List getWinners(); From 972ed2cee05aa3bf9dff26c08ffff8681dd84a1b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:08:47 +0900 Subject: [PATCH 101/153] feat(RaceView): modify the type of carList var --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 538e4448..b03c6ad0 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -62,7 +62,7 @@ public void userRoundsInput() { public void printProgress() { // raceService를 통해 차 목록을 받아와서 RaceServiceInterface raceService = raceServiceInterface; - ArrayList carList = raceService.getCars(); + List carList = raceService.getCars(); // stream을 이용하여 양식에 맞게 출력 carList.stream().forEach(car -> System.out.println(car.getName() + " : " + car.getProgress())); System.out.println(); From 6394fe260b34e024cc21e9ff5810d7286a64b205 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:12:08 +0900 Subject: [PATCH 102/153] refactor(RaceViewInterface): remove useless imports --- src/main/java/view/RaceViewInterface.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index 5476bf57..3537df71 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -1,8 +1,5 @@ package view; -import java.util.List; -import service.CarServiceInterface; - public interface RaceViewInterface { public void userCarsInput(); From beecb8b877d2fc9b53de129ae8acf4c26e48b95b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:13:14 +0900 Subject: [PATCH 103/153] refactor(RaceModelInterface): modify the type of getCars method --- src/main/java/model/RaceModelInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 5ba164d2..734a74d0 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -11,5 +11,5 @@ public interface RaceModelInterface { public void setNumberOfRounds(int numberOfRounds); - public ArrayList getCars(); + public List getCars(); } From dd95d92d87814b0e2a7487b8c38b8ca9ef2d2814 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:16:14 +0900 Subject: [PATCH 104/153] refactor(Race): modify the type of methods and vars from ArrayList to List --- src/main/java/model/Race.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 5fd94bf9..b829dfee 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -1,6 +1,7 @@ package model; import java.util.ArrayList; +import java.util.List; import observer.Observer; import observer.SubjectModel; import service.CarServiceInterface; @@ -8,8 +9,8 @@ public class Race implements SubjectModel, RaceModelInterface { private int numberOfRounds; - private ArrayList cars; - private ArrayList observers; + private List cars; + private List observers; public Race() { this.numberOfRounds = 0; @@ -28,7 +29,7 @@ public int getNumberOfRounds() { } @Override - public ArrayList getCars() { + public List getCars() { return cars; } @@ -38,7 +39,7 @@ public void setNumberOfRounds(int numberOfRounds) { } @Override - public ArrayList getObservers() { + public List getObservers() { return observers; } } From fa958bb673620f209a9214ee0372493f353ad2a6 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:17:17 +0900 Subject: [PATCH 105/153] fix(Race): fix the constructor --- src/main/java/model/Race.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index b829dfee..ca14af90 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -14,8 +14,8 @@ public class Race implements SubjectModel, RaceModelInterface { public Race() { this.numberOfRounds = 0; - cars = null; - observers = null; + cars = new ArrayList<>(); + observers = new ArrayList<>(); } @Override From 967ed9e1a3ca2e8f64ed6bdc93de3e9ed4b480ae Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:18:08 +0900 Subject: [PATCH 106/153] refactor(RaceService): modify the type of methods and vars from ArrayList to List --- src/main/java/service/RaceService.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 1e1a309d..f9509d5a 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -1,6 +1,5 @@ package service; -import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -36,7 +35,7 @@ public List getCars() { // controller가 넘겨준 차 목록을 추가하는 메서드 @Override public void addCars(String[] cars) throws IllegalArgumentException { - ArrayList carList = race.getCars(); + List carList = race.getCars(); // 빈 입력이 들어온 경우도 예외를 반환 if (cars.length == 0) { @@ -58,7 +57,7 @@ public void addCars(String[] cars) throws IllegalArgumentException { // 우승자의 진행도를 반환하는 메서드 private int getWinnersProgress() { // 차들의 정보를 가져와서 - ArrayList carList = race.getCars(); + List carList = race.getCars(); // 진행도의 최댓값을 구한다. int winnersProgress = 0; @@ -73,7 +72,7 @@ private int getWinnersProgress() { @Override public List getWinners() { // 차들의 정보를 가져오고 - ArrayList carList = race.getCars(); + List carList = race.getCars(); // 우승자의 진행도를 가져온다. int winnersProgress = getWinnersProgress(); From b64f8f9a101adc273430321a9263ac8906af5c76 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:19:09 +0900 Subject: [PATCH 107/153] refactor(SubjectModel): modify the type of method from ArrayList to List --- src/main/java/observer/SubjectModel.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/observer/SubjectModel.java b/src/main/java/observer/SubjectModel.java index 1a35ddf0..947fbe81 100644 --- a/src/main/java/observer/SubjectModel.java +++ b/src/main/java/observer/SubjectModel.java @@ -1,7 +1,7 @@ package observer; -import java.util.ArrayList; +import java.util.List; public interface SubjectModel { - public ArrayList getObservers(); + public List getObservers(); } From e9ab76c0ea31d6cb4094280de4326c0ac01ccd5e Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:19:44 +0900 Subject: [PATCH 108/153] refactor(RaceModelInterface): modify the type of method from ArrayList to List --- src/main/java/model/RaceModelInterface.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 734a74d0..ac2c830d 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -1,6 +1,6 @@ package model; -import java.util.ArrayList; +import java.util.List; import service.CarServiceInterface; public interface RaceModelInterface { From 7743268c3045cfd88c0f6bcb26875cb3a23a0200 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:27:38 +0900 Subject: [PATCH 109/153] fix(Race): remove implementation of SubjectModel --- src/main/java/model/Race.java | 3 +-- src/main/java/observer/SubjectModel.java | 7 ------- 2 files changed, 1 insertion(+), 9 deletions(-) delete mode 100644 src/main/java/observer/SubjectModel.java diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index ca14af90..bdf0ec99 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -3,10 +3,9 @@ import java.util.ArrayList; import java.util.List; import observer.Observer; -import observer.SubjectModel; import service.CarServiceInterface; -public class Race implements SubjectModel, RaceModelInterface { +public class Race implements RaceModelInterface { private int numberOfRounds; private List cars; diff --git a/src/main/java/observer/SubjectModel.java b/src/main/java/observer/SubjectModel.java deleted file mode 100644 index 947fbe81..00000000 --- a/src/main/java/observer/SubjectModel.java +++ /dev/null @@ -1,7 +0,0 @@ -package observer; - -import java.util.List; - -public interface SubjectModel { - public List getObservers(); -} From d54147278e44d354a6dbcd6c7ffaa9e02f2efdb8 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:29:10 +0900 Subject: [PATCH 110/153] feat(RaceModelInterface): add a getObserver method --- src/main/java/model/RaceModelInterface.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index ac2c830d..0f520369 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -1,6 +1,7 @@ package model; import java.util.List; +import observer.Observer; import service.CarServiceInterface; public interface RaceModelInterface { @@ -12,4 +13,6 @@ public interface RaceModelInterface { public void setNumberOfRounds(int numberOfRounds); public List getCars(); + + public List getObservers(); } From 4c3a27043710e48a4e0f807bbb98b972a3f6ebad Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:30:38 +0900 Subject: [PATCH 111/153] feat(RaceService): add a addObserver method --- src/main/java/service/RaceService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index f9509d5a..f65f1e01 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -100,7 +100,8 @@ public void setNumberOfRounds(String rounds) @Override public void addObserver(Observer observer) { - + List observers = race.getObservers(); + observers.add(observer); } @Override From 9fd3eb6a14b2a9d2cc365898e873df5a987b3860 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:31:13 +0900 Subject: [PATCH 112/153] feat(RaceService): add a removeObserver method --- src/main/java/service/RaceService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index f65f1e01..6ecb9707 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -106,7 +106,8 @@ public void addObserver(Observer observer) { @Override public void removeObserver(Observer observer) { - + List observers = race.getObservers(); + observers.remove(observer); } @Override From 84cdfa17b6b342a80f63b9a7a277f2a0180f5788 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:32:10 +0900 Subject: [PATCH 113/153] feat(RaceService): add a notifyObserver method --- src/main/java/service/RaceService.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 6ecb9707..c6b1b71c 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -112,6 +112,7 @@ public void removeObserver(Observer observer) { @Override public void notifyObservers() { - + List observers = race.getObservers(); + observers.stream().forEach(observer -> observer.update()); } } From e7ad07ece2840851733ec5edb901ee6c1ad98ba8 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:33:49 +0900 Subject: [PATCH 114/153] docs(RaceService): add comments for observer methods --- src/main/java/service/RaceService.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index c6b1b71c..fc008bff 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -98,18 +98,21 @@ public void setNumberOfRounds(String rounds) race.setNumberOfRounds(numberOfRounds); } + // observer를 추가하는 메서드 @Override public void addObserver(Observer observer) { List observers = race.getObservers(); observers.add(observer); } + // observer를 삭제하는 메서드 @Override public void removeObserver(Observer observer) { List observers = race.getObservers(); observers.remove(observer); } + // observer들을 update하는 메서드 @Override public void notifyObservers() { List observers = race.getObservers(); From 93653064ae0b4f4fbe805df726a3d3564424ed59 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:41:08 +0900 Subject: [PATCH 115/153] fix(RaceService): remove getNumberOfRounds --- src/main/java/service/RaceService.java | 5 ----- src/main/java/service/RaceServiceInterface.java | 2 -- 2 files changed, 7 deletions(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index fc008bff..e2f57490 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -22,11 +22,6 @@ public int getNumberOfCars() { return race.getNumberOfCars(); } - @Override - public int getNumberOfRounds() { - return race.getNumberOfRounds(); - } - @Override public List getCars() { return race.getCars(); diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index d41820cd..76ef188c 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -6,8 +6,6 @@ public interface RaceServiceInterface { public int getNumberOfCars(); - public int getNumberOfRounds(); - public List getCars(); public List getWinners(); From 9d188b73a58011bac8d942ac7ff56807765a9399 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 21:49:06 +0900 Subject: [PATCH 116/153] feat(RaceServiceInterface): add startRace method --- src/main/java/service/RaceServiceInterface.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 76ef188c..1b63d2be 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -13,4 +13,6 @@ public interface RaceServiceInterface { public void addCars(String[] cars); public void setNumberOfRounds(String rounds); + + public void startRace(); } From 153e87fcb9c6c6e38938a694df4f2e2ea6f303d9 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 22:02:55 +0900 Subject: [PATCH 117/153] feat(RaceService): add carsChanged method --- src/main/java/service/RaceService.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index e2f57490..cf908363 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -93,6 +93,21 @@ public void setNumberOfRounds(String rounds) race.setNumberOfRounds(numberOfRounds); } + private void carsChanged() { + notifyObservers(); + } + + // cars를 하나씩 출발시키는 작업을 n번 반복하는 메서드 + @Override + public void startRace() { + int numberOfRounds = race.getNumberOfRounds(); + + for (int i = 0; i < numberOfRounds; i++) { + + carsChanged(); + } + } + // observer를 추가하는 메서드 @Override public void addObserver(Observer observer) { From 4989b39b367a5db96248b7950fc4112357121da5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 22:15:06 +0900 Subject: [PATCH 118/153] feat(RaceService): add startRace method --- src/main/java/service/RaceService.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index cf908363..efa84ea1 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -93,17 +93,24 @@ public void setNumberOfRounds(String rounds) race.setNumberOfRounds(numberOfRounds); } + // 차들의 정보가 바뀐 후에 실행되는 메서드. 단일 책임 + 확장을 위해 메서드를 분리 private void carsChanged() { + // 옵저버들에게 알림 notifyObservers(); } // cars를 하나씩 출발시키는 작업을 n번 반복하는 메서드 @Override public void startRace() { + // 필요한 변수들 int numberOfRounds = race.getNumberOfRounds(); + List cars = race.getCars(); + // 횟수만큼 반복 for (int i = 0; i < numberOfRounds; i++) { - + // 모든 차들에 대해 경주 시작 + cars.stream().forEach(car -> car.moveOrNot()); + // 차들의 변경이 일어났으므로 이를 처리하는 메서드를 호출 carsChanged(); } } From 60ae98a25e34763da903c8ad6d9174343be1bdeb Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 22:18:14 +0900 Subject: [PATCH 119/153] feat(CarService): add getName method --- src/main/java/service/CarService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index 13b93d00..4377b132 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -18,7 +18,7 @@ public void goForward() { @Override public String getName() { - return null; + return car.getName(); } @Override From 814f0b8fdecbf6bb4c81e06b72c8adb118fb2e0a Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 22:19:36 +0900 Subject: [PATCH 120/153] feat(CarService): add getProgress method --- src/main/java/service/CarService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index 4377b132..8e8b8f12 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -23,7 +23,7 @@ public String getName() { @Override public int getProgress() { - return 0; + return car.getProgress(); } @Override From 9dbda2fe969959f0eed63c9dbed2991c62a99463 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 22:24:50 +0900 Subject: [PATCH 121/153] feat(CarService): add moveOrNot method --- src/main/java/service/CarService.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index 8e8b8f12..8fb505ec 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -12,8 +12,7 @@ public CarService(String name, int progress) { car = new Car(name, progress); } - public void goForward() { - + private void goForward() { } @Override @@ -28,6 +27,13 @@ public int getProgress() { @Override public void moveOrNot() { - + // 랜덤 변수를 생성한 후 + int randomNumber = (int) (Math.random() * 10); + + // 만약 4 이상이라면 + if (randomNumber > 3) { + // 앞으로 전진한다. + goForward(); + } } } From ec61f2f35d26a937df5a6cc7935da6e6b4c262ff Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 22:25:04 +0900 Subject: [PATCH 122/153] feat(CarService): add goForward method --- src/main/java/service/CarService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index 8fb505ec..0002642a 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -13,6 +13,7 @@ public CarService(String name, int progress) { } private void goForward() { + car.setProgress(car.getProgress() + 1); } @Override From db51def5e2ef85925dc1f2a9d51519e267ae77b5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Fri, 7 Jun 2024 23:18:43 +0900 Subject: [PATCH 123/153] feat(RaceController): add play method --- src/main/java/controller/RaceController.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 9c8161fe..551a3c66 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -1,7 +1,5 @@ package controller; -import java.util.List; -import service.CarServiceInterface; import service.RaceServiceInterface; import view.RaceViewInterface; @@ -16,15 +14,18 @@ public RaceController(RaceServiceInterface race, RaceViewInterface view) { this.view = view; } + // 시작 단계에서 호출하는 메서드 @Override public void init() { view.userCarsInput(); view.userRoundsInput(); } + // 중간 단계에서 호출하는 메서드 @Override public void play() { - + view.printProcess(); + race.startRace(); } // 마무리 단계에서 호출하는 메서드 From 3a61dc5b39b8498a22186e27f300aa97dbdd30c6 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sat, 8 Jun 2024 12:34:15 +0900 Subject: [PATCH 124/153] docs: add comments --- .../java/controller/RaceControllerInterface.java | 2 -- src/main/java/model/Car.java | 1 + src/main/java/model/Race.java | 1 + src/main/java/service/CarService.java | 5 +++++ src/main/java/service/RaceService.java | 10 +++++++--- src/main/java/view/RaceView.java | 2 +- src/test/java/RaceServiceTest.java | 13 +++++++++++++ 7 files changed, 28 insertions(+), 6 deletions(-) diff --git a/src/main/java/controller/RaceControllerInterface.java b/src/main/java/controller/RaceControllerInterface.java index f2b6e741..72300538 100644 --- a/src/main/java/controller/RaceControllerInterface.java +++ b/src/main/java/controller/RaceControllerInterface.java @@ -1,7 +1,5 @@ package controller; -import service.RaceServiceInterface; - public interface RaceControllerInterface { public void init(); diff --git a/src/main/java/model/Car.java b/src/main/java/model/Car.java index be4f22d0..1372baf6 100644 --- a/src/main/java/model/Car.java +++ b/src/main/java/model/Car.java @@ -1,5 +1,6 @@ package model; +// model과 service를 분리해서 model은 getter, setter, 변수만 갖도록 함. public class Car implements CarModelInterface { private final String name; diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index bdf0ec99..8d0432f5 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -5,6 +5,7 @@ import observer.Observer; import service.CarServiceInterface; +// model과 service를 분리해서 model은 getter, setter, 변수만 갖도록 함. public class Race implements RaceModelInterface { private int numberOfRounds; diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index 0002642a..cc39ebb5 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -3,6 +3,7 @@ import model.Car; import model.CarModelInterface; +// model과 service를 분리해서 service는 구체적인 로직만 갖도록 함. public class CarService implements CarServiceInterface { private CarModelInterface car; @@ -12,20 +13,24 @@ public CarService(String name, int progress) { car = new Car(name, progress); } + // 한 칸 앞으로 가는 메서드 private void goForward() { car.setProgress(car.getProgress() + 1); } + // model의 getter @Override public String getName() { return car.getName(); } + // model의 getter @Override public int getProgress() { return car.getProgress(); } + // 난수 생성 후 앞으로 갈지 말지 결정하는 메서드 @Override public void moveOrNot() { // 랜덤 변수를 생성한 후 diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index efa84ea1..e21196a8 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -8,20 +8,23 @@ import observer.Observer; import observer.Subject; +// model과 service를 분리해서 service는 구체적인 로직만 갖도록 함. public class RaceService implements Subject, RaceServiceInterface { private RaceModelInterface race; - // 생성자: + // 생성자 public RaceService() { race = new Race(); } + // model의 getter @Override public int getNumberOfCars() { return race.getNumberOfCars(); } + // model의 getter @Override public List getCars() { return race.getCars(); @@ -63,7 +66,7 @@ private int getWinnersProgress() { return winnersProgress; } - // 우승자의 목록을 반환한다. + // 우승자의 목록을 반환하는 메서드 @Override public List getWinners() { // 차들의 정보를 가져오고 @@ -93,9 +96,10 @@ public void setNumberOfRounds(String rounds) race.setNumberOfRounds(numberOfRounds); } - // 차들의 정보가 바뀐 후에 실행되는 메서드. 단일 책임 + 확장을 위해 메서드를 분리 + // 차들의 정보가 바뀐 후에 실행되는 메서드. private void carsChanged() { // 옵저버들에게 알림 + // 지금은 하나의 역할만 수행하지만, 단일 책임 + 확장을 위해 메서드를 분리 notifyObservers(); } diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index b03c6ad0..d100704b 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -1,7 +1,6 @@ package view; import controller.RaceControllerInterface; -import java.util.ArrayList; import java.util.List; import java.util.Scanner; import observer.Observer; @@ -92,6 +91,7 @@ public void printResult() { System.out.println("최종 우승자 : " + stringBuilder); } + // 에러 메시지 출력 메서드들 @Override public void printCarsErrorMessage() { System.out.println("[ERROR] 입력한 차의 이름이 올바르지 않습니다. 차의 이름은 5자 이하만 가능합니다."); diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 78540e4f..b34e4bd4 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -1,3 +1,16 @@ +import org.junit.jupiter.api.Test; +import org.assertj.core.api.Assertions; +import service.RaceService; +import service.RaceServiceInterface; + public class RaceServiceTest { + @Test + void addCarsTest() { + RaceServiceInterface raceService = new RaceService(); + String[] cars = {"jih", "hyu", "abc", "xyz"}; + raceService.addCars(cars); + int numberOfCars = raceService.getNumberOfCars(); + Assertions.assertThat(numberOfCars).isEqualTo(4); + } } From 5f87a41cb04d24638322a3accfe00a72edc170d6 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sat, 8 Jun 2024 21:28:54 +0900 Subject: [PATCH 125/153] test(RaceServiceTest): add a addCarsNumberTest test --- src/test/java/RaceServiceTest.java | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index b34e4bd4..517e822e 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -1,16 +1,31 @@ +import java.util.stream.IntStream; import org.junit.jupiter.api.Test; import org.assertj.core.api.Assertions; import service.RaceService; import service.RaceServiceInterface; +// 구체적 로직을 갖는 RaceService에 대한 테스트. +// 단순한 getter, setter에 대한 테스트는 생략하였습니다. public class RaceServiceTest { + // addCars를 통해 삽입이 잘 됐는지 확인 @Test - void addCarsTest() { + void addCarsNumberTest() { + // 객체와 삽입할 배열을 준비 RaceServiceInterface raceService = new RaceService(); - String[] cars = {"jih", "hyu", "abc", "xyz"}; - raceService.addCars(cars); + String[] carsName = {"jih", "hyu", "abc", "xyz"}; + + // 삽입 과정 + raceService.addCars(carsName); + // 개수 구하고 int numberOfCars = raceService.getNumberOfCars(); - Assertions.assertThat(numberOfCars).isEqualTo(4); + // 삽입한 배열과 리스트의 원소가 동일하면 true를 반환하도록 함. + boolean isEqual = IntStream.range(0, numberOfCars) + .allMatch(i -> carsName[i].equals(raceService.getCars().get(i).getName())); + + // 삽입 배열과 리스트의 개수가 맞는지 확인 + Assertions.assertThat(numberOfCars).isEqualTo(carsName.length); + // 삽입한 배열이 리스트에 잘 들어갔는지 확인 + Assertions.assertThat(isEqual).isTrue(); } } From b049ad0382f6adcb7fc51d3d4926ee51862f18e0 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sat, 8 Jun 2024 21:29:36 +0900 Subject: [PATCH 126/153] test(RaceServiceTest): add a addCarsNameErrorTest test --- src/test/java/RaceServiceTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 517e822e..579f30bb 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -28,4 +28,16 @@ void addCarsNumberTest() { // 삽입한 배열이 리스트에 잘 들어갔는지 확인 Assertions.assertThat(isEqual).isTrue(); } + + // addCars를 통해 5자 초과의 차 이름을 넣었을 때 예외 처리가 되는지 확인 + @Test + void addCarsNameErrorTest() { + // 객체와 삽입할 배열을 준비 + RaceServiceInterface raceService = new RaceService(); + String[] carsErrorName = {"abcdef", "abcd"}; + + // 잘못된 경우에 대한 테스트 (5자 이상) + Assertions.assertThatThrownBy(() -> raceService.addCars(carsErrorName)) + .isInstanceOf(IllegalArgumentException.class); + } } From 09548241539f9adef49206d8742748772c5f8027 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sat, 8 Jun 2024 21:30:20 +0900 Subject: [PATCH 127/153] test(RaceServiceTest): add a addCarsEmptyErrorTest test --- src/test/java/RaceServiceTest.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 579f30bb..cd651205 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -40,4 +40,16 @@ void addCarsNameErrorTest() { Assertions.assertThatThrownBy(() -> raceService.addCars(carsErrorName)) .isInstanceOf(IllegalArgumentException.class); } + + // addCars를 통해 아무 입력도 넣지 않았을 때 예외 처리가 되는지 확인 + @Test + void addCarsEmptyErrorTest() { + // 객체와 삽입할 배열을 준비 + RaceServiceInterface raceService = new RaceService(); + String[] empty = {}; + + // 잘못된 경우에 대한 테스트 (빈 입력) + Assertions.assertThatThrownBy(() -> raceService.addCars(empty)) + .isInstanceOf(IllegalArgumentException.class); + } } From 25bf1079eab258f6fb896dc16edb330faf49ee9b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sat, 8 Jun 2024 21:31:02 +0900 Subject: [PATCH 128/153] refactor(RaceServiceTest): rename addCarsNumberTest to addCarsTest --- src/test/java/RaceServiceTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index cd651205..2bebd25b 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -10,7 +10,7 @@ public class RaceServiceTest { // addCars를 통해 삽입이 잘 됐는지 확인 @Test - void addCarsNumberTest() { + void addCarsTest() { // 객체와 삽입할 배열을 준비 RaceServiceInterface raceService = new RaceService(); String[] carsName = {"jih", "hyu", "abc", "xyz"}; From df4e85ef3e3dc6ccf85edc184e583c8043c8d3ed Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 14:24:32 +0900 Subject: [PATCH 129/153] test(RaceServiceTest): add getWinnersTest --- src/test/java/RaceServiceTest.java | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 2bebd25b..df360b30 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -1,6 +1,8 @@ +import java.util.List; import java.util.stream.IntStream; import org.junit.jupiter.api.Test; import org.assertj.core.api.Assertions; +import service.CarServiceInterface; import service.RaceService; import service.RaceServiceInterface; @@ -52,4 +54,31 @@ void addCarsEmptyErrorTest() { Assertions.assertThatThrownBy(() -> raceService.addCars(empty)) .isInstanceOf(IllegalArgumentException.class); } + + @Test + void getWinnersTest() { + // 객체와 삽입할 배열을 준비 + RaceServiceInterface raceService = new RaceService(); + String[] carsName = {"jih", "hyu", "abc", "xyz"}; + + // 삽입 + raceService.addCars(carsName); + // round 설정 (= 3) + raceService.setNumberOfRounds("3"); + // 경주 시작 + raceService.startRace(); + // 승자 목록 받아옴. getWinners 테스트 + List winners = raceService.getWinners(); + // 승자 중 한명의 진행도를 받아옴. + int winnerProgress = winners.get(0).getProgress(); + // 우선 승자들끼리 진행도가 모두 같은지 확인하는 변수 생성 + boolean isWinnersProgressAllEqual = winners.stream().allMatch(car -> car.getProgress() == winnerProgress); + // getWinners로 받아온 승자의 진행도가 실제로 가장 높은지 확인하는 변수 생성 + boolean isWinnerProgressTheHighest = raceService.getCars().stream().allMatch(car -> car.getProgress() <= winnerProgress); + + // 승자들끼리의 진행도를 확인 + Assertions.assertThat(isWinnersProgressAllEqual).isTrue(); + // getWinners로 받아온 승자가 진짜 승자인지 확인 + Assertions.assertThat(isWinnerProgressTheHighest).isTrue(); + } } From 975e268962a35fd38484d691aa85ca082791189e Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 14:30:51 +0900 Subject: [PATCH 130/153] refactor(Race): add addCars and verifyNumberRounds for SRP --- src/main/java/model/Race.java | 32 ++++++++++++++++++++- src/main/java/model/RaceModelInterface.java | 12 ++++---- src/main/java/service/RaceService.java | 20 ++----------- 3 files changed, 40 insertions(+), 24 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 8d0432f5..499a1dd8 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -1,11 +1,14 @@ package model; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import observer.Observer; +import service.CarService; import service.CarServiceInterface; -// model과 service를 분리해서 model은 getter, setter, 변수만 갖도록 함. +// model과 service를 분리. public class Race implements RaceModelInterface { private int numberOfRounds; @@ -42,4 +45,31 @@ public void setNumberOfRounds(int numberOfRounds) { public List getObservers() { return observers; } + + // 제대로 된 입력이 들어왔는지 확인하는 메서드 + private void verifyNumberOfRounds(String[] carsName) throws IllegalArgumentException { + // 빈 입력이 들어온 경우도 예외를 반환 + if (carsName.length == 0) { + throw new IllegalArgumentException(); + } + + // cars의 원소 중에 길이가 5 이상인 것이 있다면 예외를 반환 + boolean isWrongArgument = Arrays.stream(carsName).anyMatch(car -> car.length() > 5); + if (isWrongArgument) { + throw new IllegalArgumentException(); + } + } + + @Override + // 차를 추가하는 메서드 + public void addCars(String[] carsName) throws IllegalArgumentException { + // 유효성 검사부터 + verifyNumberOfRounds(carsName); + // 검사가 끝났으면 객체 리스트를 생성 + List cars = Arrays.stream(carsName).map(carName -> new CarService(carName, 0)) + .collect(Collectors.toList()); + // 추가 + this.cars.addAll(cars); + } + } diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 0f520369..3a82f048 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -6,13 +6,15 @@ public interface RaceModelInterface { - public int getNumberOfCars(); + int getNumberOfCars(); - public int getNumberOfRounds(); + int getNumberOfRounds(); - public void setNumberOfRounds(int numberOfRounds); + void setNumberOfRounds(int numberOfRounds); - public List getCars(); + List getCars(); - public List getObservers(); + List getObservers(); + + void addCars(String[] carsName); } diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index e21196a8..b83dd132 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -32,24 +32,8 @@ public List getCars() { // controller가 넘겨준 차 목록을 추가하는 메서드 @Override - public void addCars(String[] cars) throws IllegalArgumentException { - List carList = race.getCars(); - - // 빈 입력이 들어온 경우도 예외를 반환 - if (cars.length == 0) { - throw new IllegalArgumentException(); - } - - // cars의 원소 중에 길이가 5 이상인 것이 있다면 예외를 반환 - boolean isWrongArgument = Arrays.stream(cars).anyMatch(carName -> carName.length() > 5); - if (isWrongArgument) { - throw new IllegalArgumentException(); - } - - // 그렇지 않다면 차 목록을 추가 - List tempList = Arrays.stream(cars).map(carName -> new CarService(carName, 0)) - .collect(Collectors.toList()); - carList.addAll(tempList); + public void addCars(String[] carsName) throws IllegalArgumentException { + race.addCars(carsName); } // 우승자의 진행도를 반환하는 메서드 From 6dcaf5e615dd2bb92897af487ffc2dc4d1a08a7e Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 14:57:14 +0900 Subject: [PATCH 131/153] refactor(Race): add prepareRace and verifyNumberOfRounds for SRP --- src/main/java/controller/RaceController.java | 2 +- src/main/java/model/Race.java | 31 ++++++++++++++----- src/main/java/model/RaceModelInterface.java | 2 +- src/main/java/service/RaceService.java | 13 ++------ .../java/service/RaceServiceInterface.java | 2 +- src/test/java/RaceServiceTest.java | 2 +- 6 files changed, 31 insertions(+), 21 deletions(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index 551a3c66..c95fbe78 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -53,7 +53,7 @@ public void addCars(String[] cars) { public void setRound(String numberOfRound) { // 전달 시도 try { - race.setNumberOfRounds(numberOfRound); + race.prepareRace(numberOfRound); } catch (NumberFormatException e) { // 숫자가 아닌 경우, error 메시지를 출력 view.printRoundsFormatErrorMessage(); diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 499a1dd8..dffbae0c 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -36,18 +36,17 @@ public List getCars() { return cars; } - @Override - public void setNumberOfRounds(int numberOfRounds) { - this.numberOfRounds = numberOfRounds; - } - @Override public List getObservers() { return observers; } + private void setNumberOfRounds(int numberOfRounds) { + this.numberOfRounds = numberOfRounds; + } + // 제대로 된 입력이 들어왔는지 확인하는 메서드 - private void verifyNumberOfRounds(String[] carsName) throws IllegalArgumentException { + private void verifyNumberOfCars(String[] carsName) throws IllegalArgumentException { // 빈 입력이 들어온 경우도 예외를 반환 if (carsName.length == 0) { throw new IllegalArgumentException(); @@ -64,7 +63,7 @@ private void verifyNumberOfRounds(String[] carsName) throws IllegalArgumentExcep // 차를 추가하는 메서드 public void addCars(String[] carsName) throws IllegalArgumentException { // 유효성 검사부터 - verifyNumberOfRounds(carsName); + verifyNumberOfCars(carsName); // 검사가 끝났으면 객체 리스트를 생성 List cars = Arrays.stream(carsName).map(carName -> new CarService(carName, 0)) .collect(Collectors.toList()); @@ -72,4 +71,22 @@ public void addCars(String[] carsName) throws IllegalArgumentException { this.cars.addAll(cars); } + // 경주 시작 전 round 설정하는 메서드 + @Override + public void prepareRace(String rounds) throws IllegalArgumentException { + // 수로 변환. + int numberOfRounds = Integer.parseInt(rounds); + // 유효성 검사 + verifyNumberOfRounds(numberOfRounds); + // setter를 통해 값 설정 + setNumberOfRounds(numberOfRounds); + } + + private void verifyNumberOfRounds(int numberOfRounds) throws IllegalArgumentException { + // 100보다 큰 입력이 들어온 경우 + if (numberOfRounds > 100) { + throw new IllegalArgumentException(); + } + } + } diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 3a82f048..d1e2c4ab 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -10,7 +10,7 @@ public interface RaceModelInterface { int getNumberOfRounds(); - void setNumberOfRounds(int numberOfRounds); + void prepareRace(String rounds); List getCars(); diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index b83dd132..104fba40 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -67,17 +67,10 @@ public List getWinners() { // controller에게 받은 round 정보를 설정하는 메서드 @Override - public void setNumberOfRounds(String rounds) + public void prepareRace(String rounds) throws IllegalArgumentException { - // 수가 아닌 경우 - int numberOfRounds = Integer.parseInt(rounds); - - // 100보다 큰 입력이 들어온 경우 - if (numberOfRounds > 100) { - throw new IllegalArgumentException(); - } - - race.setNumberOfRounds(numberOfRounds); + // rounds를 전달. + race.prepareRace(rounds); } // 차들의 정보가 바뀐 후에 실행되는 메서드. diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 1b63d2be..ca24bb59 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -12,7 +12,7 @@ public interface RaceServiceInterface { public void addCars(String[] cars); - public void setNumberOfRounds(String rounds); + public void prepareRace(String rounds); public void startRace(); } diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index df360b30..8648be94 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -64,7 +64,7 @@ void getWinnersTest() { // 삽입 raceService.addCars(carsName); // round 설정 (= 3) - raceService.setNumberOfRounds("3"); + raceService.prepareRace("3"); // 경주 시작 raceService.startRace(); // 승자 목록 받아옴. getWinners 테스트 From 1b54137feb28a27140ee4a5d4b83cad64efc144f Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 16:02:28 +0900 Subject: [PATCH 132/153] refactor(Race): move logics of subject to Race for SRP --- src/main/java/model/Race.java | 27 +++++++++++++++------ src/main/java/model/RaceModelInterface.java | 2 -- src/main/java/service/RaceService.java | 19 ++++++--------- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index dffbae0c..89844a4f 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -5,11 +5,12 @@ import java.util.List; import java.util.stream.Collectors; import observer.Observer; +import observer.Subject; import service.CarService; import service.CarServiceInterface; -// model과 service를 분리. -public class Race implements RaceModelInterface { +// model과 service를 분리해서 model에 관련된 로직만 갖도록 함. +public class Race implements Subject, RaceModelInterface { private int numberOfRounds; private List cars; @@ -36,11 +37,6 @@ public List getCars() { return cars; } - @Override - public List getObservers() { - return observers; - } - private void setNumberOfRounds(int numberOfRounds) { this.numberOfRounds = numberOfRounds; } @@ -89,4 +85,21 @@ private void verifyNumberOfRounds(int numberOfRounds) throws IllegalArgumentExce } } + // observer를 추가하는 메서드 + @Override + public void addObserver(Observer observer) { + observers.add(observer); + } + + // observer를 삭제하는 메서드 + @Override + public void removeObserver(Observer observer) { + observers.remove(observer); + } + + // observer들을 update하는 메서드 + @Override + public void notifyObservers() { + observers.stream().forEach(observer -> observer.update()); + } } diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index d1e2c4ab..c147872d 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -14,7 +14,5 @@ public interface RaceModelInterface { List getCars(); - List getObservers(); - void addCars(String[] carsName); } diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 104fba40..a66c90a2 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -1,21 +1,21 @@ package service; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -import model.Race; import model.RaceModelInterface; import observer.Observer; import observer.Subject; -// model과 service를 분리해서 service는 구체적인 로직만 갖도록 함. +// model과 service를 분리해서 service는 비즈니스 로직만 갖도록 함. public class RaceService implements Subject, RaceServiceInterface { private RaceModelInterface race; + private Subject subject; // 생성자 - public RaceService() { - race = new Race(); + public RaceService(RaceModelInterface race, Subject subject) { + this.race = race; + this.subject = subject; } // model의 getter @@ -99,21 +99,18 @@ public void startRace() { // observer를 추가하는 메서드 @Override public void addObserver(Observer observer) { - List observers = race.getObservers(); - observers.add(observer); + subject.addObserver(observer); } // observer를 삭제하는 메서드 @Override public void removeObserver(Observer observer) { - List observers = race.getObservers(); - observers.remove(observer); + subject.removeObserver(observer); } // observer들을 update하는 메서드 @Override public void notifyObservers() { - List observers = race.getObservers(); - observers.stream().forEach(observer -> observer.update()); + subject.notifyObservers(); } } From abb9a9b398e88dd3f0823e03cff7a3e3b947c540 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 16:37:42 +0900 Subject: [PATCH 133/153] refactor(Race): move logics of subject to Race for SRP --- src/main/java/model/Race.java | 24 ++++++++++++++++----- src/main/java/model/RaceModelInterface.java | 4 ++-- src/main/java/service/RaceService.java | 21 ++---------------- src/test/java/RaceServiceTest.java | 13 +++++++---- 4 files changed, 32 insertions(+), 30 deletions(-) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 89844a4f..f511a6e5 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -27,11 +27,6 @@ public int getNumberOfCars() { return cars.size(); } - @Override - public int getNumberOfRounds() { - return numberOfRounds; - } - @Override public List getCars() { return cars; @@ -85,6 +80,25 @@ private void verifyNumberOfRounds(int numberOfRounds) throws IllegalArgumentExce } } + // 차들의 정보가 바뀐 후에 실행되는 메서드. + private void carsChanged() { + // 옵저버들에게 알림 + // 지금은 하나의 역할만 수행하지만, 단일 책임 + 확장을 위해 메서드를 분리 + notifyObservers(); + } + + // cars를 하나씩 출발시키는 작업을 n번 반복하는 메서드 + @Override + public void startRace() { + // 횟수만큼 반복 + for (int i = 0; i < numberOfRounds; i++) { + // 모든 차들에 대해 경주 시작 + cars.stream().forEach(car -> car.moveOrNot()); + // 차들의 변경이 일어났으므로 이를 처리하는 메서드를 호출 + carsChanged(); + } + } + // observer를 추가하는 메서드 @Override public void addObserver(Observer observer) { diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index c147872d..871f85e0 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -8,11 +8,11 @@ public interface RaceModelInterface { int getNumberOfCars(); - int getNumberOfRounds(); - void prepareRace(String rounds); List getCars(); void addCars(String[] carsName); + + void startRace(); } diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index a66c90a2..2703f808 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -50,7 +50,7 @@ private int getWinnersProgress() { return winnersProgress; } - // 우승자의 목록을 반환하는 메서드 + // 비즈니스 로직: 우승자의 목록이 필요하다. @Override public List getWinners() { // 차들의 정보를 가져오고 @@ -73,27 +73,10 @@ public void prepareRace(String rounds) race.prepareRace(rounds); } - // 차들의 정보가 바뀐 후에 실행되는 메서드. - private void carsChanged() { - // 옵저버들에게 알림 - // 지금은 하나의 역할만 수행하지만, 단일 책임 + 확장을 위해 메서드를 분리 - notifyObservers(); - } - // cars를 하나씩 출발시키는 작업을 n번 반복하는 메서드 @Override public void startRace() { - // 필요한 변수들 - int numberOfRounds = race.getNumberOfRounds(); - List cars = race.getCars(); - - // 횟수만큼 반복 - for (int i = 0; i < numberOfRounds; i++) { - // 모든 차들에 대해 경주 시작 - cars.stream().forEach(car -> car.moveOrNot()); - // 차들의 변경이 일어났으므로 이를 처리하는 메서드를 호출 - carsChanged(); - } + race.startRace(); } // observer를 추가하는 메서드 diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 8648be94..642035e3 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -1,5 +1,6 @@ import java.util.List; import java.util.stream.IntStream; +import model.Race; import org.junit.jupiter.api.Test; import org.assertj.core.api.Assertions; import service.CarServiceInterface; @@ -14,7 +15,8 @@ public class RaceServiceTest { @Test void addCarsTest() { // 객체와 삽입할 배열을 준비 - RaceServiceInterface raceService = new RaceService(); + Race race = new Race(); + RaceServiceInterface raceService = new RaceService(race, race); String[] carsName = {"jih", "hyu", "abc", "xyz"}; // 삽입 과정 @@ -35,7 +37,8 @@ void addCarsTest() { @Test void addCarsNameErrorTest() { // 객체와 삽입할 배열을 준비 - RaceServiceInterface raceService = new RaceService(); + Race race = new Race(); + RaceServiceInterface raceService = new RaceService(race, race); String[] carsErrorName = {"abcdef", "abcd"}; // 잘못된 경우에 대한 테스트 (5자 이상) @@ -47,7 +50,8 @@ void addCarsNameErrorTest() { @Test void addCarsEmptyErrorTest() { // 객체와 삽입할 배열을 준비 - RaceServiceInterface raceService = new RaceService(); + Race race = new Race(); + RaceServiceInterface raceService = new RaceService(race, race); String[] empty = {}; // 잘못된 경우에 대한 테스트 (빈 입력) @@ -58,7 +62,8 @@ void addCarsEmptyErrorTest() { @Test void getWinnersTest() { // 객체와 삽입할 배열을 준비 - RaceServiceInterface raceService = new RaceService(); + Race race = new Race(); + RaceServiceInterface raceService = new RaceService(race, race); String[] carsName = {"jih", "hyu", "abc", "xyz"}; // 삽입 From ad47023c174104e7c89a49673c009852069d7157 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 17:05:09 +0900 Subject: [PATCH 134/153] refactor(Car): move logics of subject to Car for SRP --- src/main/java/model/Car.java | 17 +++++++++++------ src/main/java/model/CarModelInterface.java | 2 +- src/main/java/service/CarService.java | 15 +++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/src/main/java/model/Car.java b/src/main/java/model/Car.java index 1372baf6..12659e3b 100644 --- a/src/main/java/model/Car.java +++ b/src/main/java/model/Car.java @@ -1,6 +1,6 @@ package model; -// model과 service를 분리해서 model은 getter, setter, 변수만 갖도록 함. +// model과 service를 분리해서 도메인 관련 작업만 처리 public class Car implements CarModelInterface { private final String name; @@ -16,6 +16,16 @@ public Car(String name, int progress) { this.progress = progress; } + private void setProgress(int progress) { + this.progress = progress; + } + + // 한 칸 앞으로 가는 메서드 + @Override + public void goForward() { + setProgress(getProgress() + 1); + } + @Override public String getName() { return name; @@ -25,9 +35,4 @@ public String getName() { public int getProgress() { return progress; } - - @Override - public void setProgress(int progress) { - this.progress = progress; - } } diff --git a/src/main/java/model/CarModelInterface.java b/src/main/java/model/CarModelInterface.java index 9b3ca692..921689f4 100644 --- a/src/main/java/model/CarModelInterface.java +++ b/src/main/java/model/CarModelInterface.java @@ -6,5 +6,5 @@ public interface CarModelInterface { public int getProgress(); - public void setProgress(int progress); + public void goForward(); } diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java index cc39ebb5..66220798 100644 --- a/src/main/java/service/CarService.java +++ b/src/main/java/service/CarService.java @@ -3,7 +3,7 @@ import model.Car; import model.CarModelInterface; -// model과 service를 분리해서 service는 구체적인 로직만 갖도록 함. +// model과 service를 분리해서 service는 비즈니스 로직만 갖도록 함. public class CarService implements CarServiceInterface { private CarModelInterface car; @@ -13,24 +13,19 @@ public CarService(String name, int progress) { car = new Car(name, progress); } - // 한 칸 앞으로 가는 메서드 - private void goForward() { - car.setProgress(car.getProgress() + 1); - } - - // model의 getter + // getter @Override public String getName() { return car.getName(); } - // model의 getter + // getter @Override public int getProgress() { return car.getProgress(); } - // 난수 생성 후 앞으로 갈지 말지 결정하는 메서드 + // 비즈니스 로직: 경주하는 차들을 앞으로 보내자. @Override public void moveOrNot() { // 랜덤 변수를 생성한 후 @@ -39,7 +34,7 @@ public void moveOrNot() { // 만약 4 이상이라면 if (randomNumber > 3) { // 앞으로 전진한다. - goForward(); + car.goForward(); } } } From 9872fb44107781ae4f30ae13c5404b35d28e585b Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 17:55:40 +0900 Subject: [PATCH 135/153] refactor: remove CarService class --- src/main/java/model/Car.java | 12 ++++++ src/main/java/model/CarModelInterface.java | 2 + src/main/java/model/Race.java | 8 ++-- src/main/java/model/RaceModelInterface.java | 4 +- src/main/java/service/CarService.java | 40 ------------------- .../java/service/CarServiceInterface.java | 10 ----- src/main/java/service/RaceService.java | 17 ++++---- .../java/service/RaceServiceInterface.java | 5 ++- src/main/java/view/RaceView.java | 8 ++-- src/test/java/RaceServiceTest.java | 4 +- 10 files changed, 36 insertions(+), 74 deletions(-) delete mode 100644 src/main/java/service/CarService.java delete mode 100644 src/main/java/service/CarServiceInterface.java diff --git a/src/main/java/model/Car.java b/src/main/java/model/Car.java index 12659e3b..d5717c22 100644 --- a/src/main/java/model/Car.java +++ b/src/main/java/model/Car.java @@ -35,4 +35,16 @@ public String getName() { public int getProgress() { return progress; } + + @Override + public void moveOrNot() { + // 랜덤 변수를 생성한 후 + int randomNumber = (int) (Math.random() * 10); + + // 만약 4 이상이라면 + if (randomNumber > 3) { + // 앞으로 전진한다. + goForward(); + } + } } diff --git a/src/main/java/model/CarModelInterface.java b/src/main/java/model/CarModelInterface.java index 921689f4..dcda45d4 100644 --- a/src/main/java/model/CarModelInterface.java +++ b/src/main/java/model/CarModelInterface.java @@ -7,4 +7,6 @@ public interface CarModelInterface { public int getProgress(); public void goForward(); + + void moveOrNot(); } diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index f511a6e5..82399de5 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -6,14 +6,12 @@ import java.util.stream.Collectors; import observer.Observer; import observer.Subject; -import service.CarService; -import service.CarServiceInterface; // model과 service를 분리해서 model에 관련된 로직만 갖도록 함. public class Race implements Subject, RaceModelInterface { private int numberOfRounds; - private List cars; + private List cars; private List observers; public Race() { @@ -28,7 +26,7 @@ public int getNumberOfCars() { } @Override - public List getCars() { + public List getCars() { return cars; } @@ -56,7 +54,7 @@ public void addCars(String[] carsName) throws IllegalArgumentException { // 유효성 검사부터 verifyNumberOfCars(carsName); // 검사가 끝났으면 객체 리스트를 생성 - List cars = Arrays.stream(carsName).map(carName -> new CarService(carName, 0)) + List cars = Arrays.stream(carsName).map(carName -> new Car(carName, 0)) .collect(Collectors.toList()); // 추가 this.cars.addAll(cars); diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index 871f85e0..b3a351a5 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -1,8 +1,6 @@ package model; import java.util.List; -import observer.Observer; -import service.CarServiceInterface; public interface RaceModelInterface { @@ -10,7 +8,7 @@ public interface RaceModelInterface { void prepareRace(String rounds); - List getCars(); + List getCars(); void addCars(String[] carsName); diff --git a/src/main/java/service/CarService.java b/src/main/java/service/CarService.java deleted file mode 100644 index 66220798..00000000 --- a/src/main/java/service/CarService.java +++ /dev/null @@ -1,40 +0,0 @@ -package service; - -import model.Car; -import model.CarModelInterface; - -// model과 service를 분리해서 service는 비즈니스 로직만 갖도록 함. -public class CarService implements CarServiceInterface { - - private CarModelInterface car; - - // 생성자 - public CarService(String name, int progress) { - car = new Car(name, progress); - } - - // getter - @Override - public String getName() { - return car.getName(); - } - - // getter - @Override - public int getProgress() { - return car.getProgress(); - } - - // 비즈니스 로직: 경주하는 차들을 앞으로 보내자. - @Override - public void moveOrNot() { - // 랜덤 변수를 생성한 후 - int randomNumber = (int) (Math.random() * 10); - - // 만약 4 이상이라면 - if (randomNumber > 3) { - // 앞으로 전진한다. - car.goForward(); - } - } -} diff --git a/src/main/java/service/CarServiceInterface.java b/src/main/java/service/CarServiceInterface.java deleted file mode 100644 index f1138468..00000000 --- a/src/main/java/service/CarServiceInterface.java +++ /dev/null @@ -1,10 +0,0 @@ -package service; - -public interface CarServiceInterface { - - public String getName(); - - public int getProgress(); - - public void moveOrNot(); -} diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index 2703f808..d23333ec 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -2,6 +2,7 @@ import java.util.List; import java.util.stream.Collectors; +import model.CarModelInterface; import model.RaceModelInterface; import observer.Observer; import observer.Subject; @@ -18,15 +19,15 @@ public RaceService(RaceModelInterface race, Subject subject) { this.subject = subject; } - // model의 getter + // getter @Override public int getNumberOfCars() { return race.getNumberOfCars(); } - // model의 getter + // getter @Override - public List getCars() { + public List getCars() { return race.getCars(); } @@ -39,11 +40,11 @@ public void addCars(String[] carsName) throws IllegalArgumentException { // 우승자의 진행도를 반환하는 메서드 private int getWinnersProgress() { // 차들의 정보를 가져와서 - List carList = race.getCars(); + List carList = race.getCars(); // 진행도의 최댓값을 구한다. int winnersProgress = 0; - for (CarServiceInterface car : carList) { + for (CarModelInterface car : carList) { winnersProgress = Math.max(winnersProgress, car.getProgress()); } @@ -52,14 +53,14 @@ private int getWinnersProgress() { // 비즈니스 로직: 우승자의 목록이 필요하다. @Override - public List getWinners() { + public List getWinners() { // 차들의 정보를 가져오고 - List carList = race.getCars(); + List carList = race.getCars(); // 우승자의 진행도를 가져온다. int winnersProgress = getWinnersProgress(); // 우승자의 진행도를 바탕으로 우승자 목록을 stream으로 가져온다. - List winners = carList.stream() + List winners = carList.stream() .filter(car -> car.getProgress() == winnersProgress).collect(Collectors.toList()); return winners; diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index ca24bb59..62d70917 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -1,14 +1,15 @@ package service; import java.util.List; +import model.CarModelInterface; public interface RaceServiceInterface { public int getNumberOfCars(); - public List getCars(); + public List getCars(); - public List getWinners(); + public List getWinners(); public void addCars(String[] cars); diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index d100704b..ead0b867 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -3,8 +3,8 @@ import controller.RaceControllerInterface; import java.util.List; import java.util.Scanner; +import model.CarModelInterface; import observer.Observer; -import service.CarServiceInterface; import service.RaceServiceInterface; public class RaceView implements Observer, RaceViewInterface { @@ -61,7 +61,7 @@ public void userRoundsInput() { public void printProgress() { // raceService를 통해 차 목록을 받아와서 RaceServiceInterface raceService = raceServiceInterface; - List carList = raceService.getCars(); + List carList = raceService.getCars(); // stream을 이용하여 양식에 맞게 출력 carList.stream().forEach(car -> System.out.println(car.getName() + " : " + car.getProgress())); System.out.println(); @@ -77,13 +77,13 @@ public void printProcess() { @Override public void printResult() { // service 인터페이스를 통해 값 참조 - List winners = raceServiceInterface.getWinners(); + List winners = raceServiceInterface.getWinners(); // 문자열을 빠르게 붙이기 위해 StringBuilder를 사용 StringBuilder stringBuilder = new StringBuilder(); // 우승자들의 정보를 String으로 변환한다. for (int i = 0; i < winners.size() - 1; i++) { - CarServiceInterface winner = winners.get(i); + CarModelInterface winner = winners.get(i); stringBuilder.append(winner.getName()).append(',').append(' '); } stringBuilder.append(winners.get(winners.size() - 1)); diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 642035e3..6b6e3e07 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -1,9 +1,9 @@ import java.util.List; import java.util.stream.IntStream; +import model.CarModelInterface; import model.Race; import org.junit.jupiter.api.Test; import org.assertj.core.api.Assertions; -import service.CarServiceInterface; import service.RaceService; import service.RaceServiceInterface; @@ -73,7 +73,7 @@ void getWinnersTest() { // 경주 시작 raceService.startRace(); // 승자 목록 받아옴. getWinners 테스트 - List winners = raceService.getWinners(); + List winners = raceService.getWinners(); // 승자 중 한명의 진행도를 받아옴. int winnerProgress = winners.get(0).getProgress(); // 우선 승자들끼리 진행도가 모두 같은지 확인하는 변수 생성 From 73c477960b4bee6566e297342bb26ca434ca8ca0 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 18:04:34 +0900 Subject: [PATCH 136/153] refactor: remove public keyword of methods of all interfaces --- src/main/java/model/Car.java | 3 +++ src/main/java/model/CarModelInterface.java | 6 +++--- src/main/java/observer/Observer.java | 2 +- src/main/java/observer/Subject.java | 6 +++--- src/main/java/service/RaceServiceInterface.java | 12 ++++++------ src/main/java/view/RaceViewInterface.java | 16 ++++++++-------- 6 files changed, 24 insertions(+), 21 deletions(-) diff --git a/src/main/java/model/Car.java b/src/main/java/model/Car.java index d5717c22..6bbe4ec1 100644 --- a/src/main/java/model/Car.java +++ b/src/main/java/model/Car.java @@ -26,16 +26,19 @@ public void goForward() { setProgress(getProgress() + 1); } + // getter @Override public String getName() { return name; } + // getter @Override public int getProgress() { return progress; } + // 난수에 따라 한 칸 전진할지 결정하는 메서드 @Override public void moveOrNot() { // 랜덤 변수를 생성한 후 diff --git a/src/main/java/model/CarModelInterface.java b/src/main/java/model/CarModelInterface.java index dcda45d4..e8a3e8f1 100644 --- a/src/main/java/model/CarModelInterface.java +++ b/src/main/java/model/CarModelInterface.java @@ -2,11 +2,11 @@ public interface CarModelInterface { - public String getName(); + String getName(); - public int getProgress(); + int getProgress(); - public void goForward(); + void goForward(); void moveOrNot(); } diff --git a/src/main/java/observer/Observer.java b/src/main/java/observer/Observer.java index cab0a629..81a1b7be 100644 --- a/src/main/java/observer/Observer.java +++ b/src/main/java/observer/Observer.java @@ -2,5 +2,5 @@ public interface Observer { - public void update(); + void update(); } diff --git a/src/main/java/observer/Subject.java b/src/main/java/observer/Subject.java index d4299ddc..057091c6 100644 --- a/src/main/java/observer/Subject.java +++ b/src/main/java/observer/Subject.java @@ -2,9 +2,9 @@ public interface Subject { - public void addObserver(Observer observer); + void addObserver(Observer observer); - public void removeObserver(Observer observer); + void removeObserver(Observer observer); - public void notifyObservers(); + void notifyObservers(); } diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 62d70917..30223ad0 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -5,15 +5,15 @@ public interface RaceServiceInterface { - public int getNumberOfCars(); + int getNumberOfCars(); - public List getCars(); + List getCars(); - public List getWinners(); + List getWinners(); - public void addCars(String[] cars); + void addCars(String[] cars); - public void prepareRace(String rounds); + void prepareRace(String rounds); - public void startRace(); + void startRace(); } diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index 3537df71..1494e950 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -2,19 +2,19 @@ public interface RaceViewInterface { - public void userCarsInput(); + void userCarsInput(); - public void userRoundsInput(); + void userRoundsInput(); - public void printProgress(); + void printProgress(); - public void printProcess(); + void printProcess(); - public void printResult(); + void printResult(); - public void printCarsErrorMessage(); + void printCarsErrorMessage(); - public void printRoundsArgumentErrorMessage(); + void printRoundsArgumentErrorMessage(); - public void printRoundsFormatErrorMessage(); + void printRoundsFormatErrorMessage(); } From 000c2e4a5e7ded8e5412265ed53b7db74565c561 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 18:07:38 +0900 Subject: [PATCH 137/153] refactor: change goForward method from public to private --- src/main/java/model/Car.java | 11 +++++------ src/main/java/model/CarModelInterface.java | 2 -- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/src/main/java/model/Car.java b/src/main/java/model/Car.java index 6bbe4ec1..4db9b448 100644 --- a/src/main/java/model/Car.java +++ b/src/main/java/model/Car.java @@ -20,12 +20,6 @@ private void setProgress(int progress) { this.progress = progress; } - // 한 칸 앞으로 가는 메서드 - @Override - public void goForward() { - setProgress(getProgress() + 1); - } - // getter @Override public String getName() { @@ -38,6 +32,11 @@ public int getProgress() { return progress; } + // 한 칸 앞으로 가는 메서드 + private void goForward() { + setProgress(getProgress() + 1); + } + // 난수에 따라 한 칸 전진할지 결정하는 메서드 @Override public void moveOrNot() { diff --git a/src/main/java/model/CarModelInterface.java b/src/main/java/model/CarModelInterface.java index e8a3e8f1..8218c1b1 100644 --- a/src/main/java/model/CarModelInterface.java +++ b/src/main/java/model/CarModelInterface.java @@ -6,7 +6,5 @@ public interface CarModelInterface { int getProgress(); - void goForward(); - void moveOrNot(); } From a35002b46dfd12aad4e858ac0320af482d9a1361 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 18:16:31 +0900 Subject: [PATCH 138/153] docs: add comments --- src/main/java/model/Car.java | 2 +- src/main/java/model/Race.java | 3 +++ src/main/java/view/RaceView.java | 3 ++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/model/Car.java b/src/main/java/model/Car.java index 4db9b448..e15ccbce 100644 --- a/src/main/java/model/Car.java +++ b/src/main/java/model/Car.java @@ -1,6 +1,6 @@ package model; -// model과 service를 분리해서 도메인 관련 작업만 처리 +// model과 service를 분리할 필요가 없다고 생각하여 model만 사용 public class Car implements CarModelInterface { private final String name; diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 82399de5..4dd81cae 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -20,16 +20,19 @@ public Race() { observers = new ArrayList<>(); } + // getter @Override public int getNumberOfCars() { return cars.size(); } + // getter @Override public List getCars() { return cars; } + // setter private void setNumberOfRounds(int numberOfRounds) { this.numberOfRounds = numberOfRounds; } diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index ead0b867..5a6a1fee 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -63,7 +63,8 @@ public void printProgress() { RaceServiceInterface raceService = raceServiceInterface; List carList = raceService.getCars(); // stream을 이용하여 양식에 맞게 출력 - carList.stream().forEach(car -> System.out.println(car.getName() + " : " + car.getProgress())); + carList.stream() + .forEach(car -> System.out.println(car.getName() + " : " + car.getProgress())); System.out.println(); } From 9d001424f66d20718725be0c6a1805a06b51ab7d Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 19:24:55 +0900 Subject: [PATCH 139/153] feat(Race): add getter of rounds --- src/main/java/model/Race.java | 5 +++++ src/main/java/model/RaceModelInterface.java | 2 ++ src/test/java/{CarServiceTest.java => CarTest.java} | 0 3 files changed, 7 insertions(+) rename src/test/java/{CarServiceTest.java => CarTest.java} (100%) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 4dd81cae..311482dd 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -32,6 +32,11 @@ public List getCars() { return cars; } + @Override + public int getNumberOfRounds() { + return numberOfRounds; + } + // setter private void setNumberOfRounds(int numberOfRounds) { this.numberOfRounds = numberOfRounds; diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index b3a351a5..fe1de951 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -6,6 +6,8 @@ public interface RaceModelInterface { int getNumberOfCars(); + int getNumberOfRounds(); + void prepareRace(String rounds); List getCars(); diff --git a/src/test/java/CarServiceTest.java b/src/test/java/CarTest.java similarity index 100% rename from src/test/java/CarServiceTest.java rename to src/test/java/CarTest.java From e3acf70522bf2b94f1da0d70fa01dd0529235fcf Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 19:33:01 +0900 Subject: [PATCH 140/153] feat(RaceService): add getter of rounds --- src/main/java/service/RaceService.java | 6 ++++++ src/main/java/service/RaceServiceInterface.java | 2 ++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/service/RaceService.java b/src/main/java/service/RaceService.java index d23333ec..c1286fa6 100644 --- a/src/main/java/service/RaceService.java +++ b/src/main/java/service/RaceService.java @@ -25,6 +25,12 @@ public int getNumberOfCars() { return race.getNumberOfCars(); } + // getter + @Override + public int getNumberOfRounds() { + return race.getNumberOfRounds(); + } + // getter @Override public List getCars() { diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 30223ad0..52f953d0 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -7,6 +7,8 @@ public interface RaceServiceInterface { int getNumberOfCars(); + int getNumberOfRounds(); + List getCars(); List getWinners(); From bc5eb94e00f81a7b75fffb84983fd0945353f16d Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 19:43:46 +0900 Subject: [PATCH 141/153] test(RaceServiceTest): add prepareRaceTest --- README.md | 2 +- src/test/java/CarTest.java | 2 +- src/test/java/RaceServiceTest.java | 19 +++++++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d5980798..3b41a87a 100644 --- a/README.md +++ b/README.md @@ -41,7 +41,7 @@ version 1.1 * addCar(CarServiceInterface) : void * setRound(int) : void --- -### class CarServiceTest +### class CarTest * tests --- ### class RaceServiceTest diff --git a/src/test/java/CarTest.java b/src/test/java/CarTest.java index 31a07901..1eabfd00 100644 --- a/src/test/java/CarTest.java +++ b/src/test/java/CarTest.java @@ -1,3 +1,3 @@ -public class CarServiceTest { +public class CarTest { } diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 6b6e3e07..7bab9b75 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -59,6 +59,23 @@ void addCarsEmptyErrorTest() { .isInstanceOf(IllegalArgumentException.class); } + @Test + void prepareRaceTest() { + // 객체와 삽입할 배열을 준비 + Race race = new Race(); + RaceServiceInterface raceService = new RaceService(race, race); + String round = "5"; + + // race 준비(round 정보 설정) + raceService.prepareRace(round); + int numberOfRounds = raceService.getNumberOfRounds(); + + // round가 잘 들어갔는지 테스트 + Assertions.assertThat(numberOfRounds).isEqualTo(Integer.parseInt(round)); + } + + + @Test void getWinnersTest() { // 객체와 삽입할 배열을 준비 @@ -86,4 +103,6 @@ void getWinnersTest() { // getWinners로 받아온 승자가 진짜 승자인지 확인 Assertions.assertThat(isWinnerProgressTheHighest).isTrue(); } + + } From 0ae34c303aca3943d746a05e4e3a79138103e54d Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 19:47:35 +0900 Subject: [PATCH 142/153] test(RaceServiceTest): add prepareRaceParseErrorTest --- src/test/java/RaceServiceTest.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 7bab9b75..b01e674f 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -74,7 +74,16 @@ void prepareRaceTest() { Assertions.assertThat(numberOfRounds).isEqualTo(Integer.parseInt(round)); } + @Test + void prepareRaceParseErrorTest() { + // 객체와 삽입할 배열을 준비 + Race race = new Race(); + RaceServiceInterface raceService = new RaceService(race, race); + String round = "a"; + // 잘못된 경우에 대해 테스트 (parse 문제) + Assertions.assertThatCode(() -> raceService.prepareRace(round)).isInstanceOf(IllegalArgumentException.class); + } @Test void getWinnersTest() { From d28af62c11401f9bc6bce908bb28490b8d6f8e80 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 19:52:18 +0900 Subject: [PATCH 143/153] test(RaceServiceTest): add prepareRaceRangeErrorTest --- src/test/java/RaceServiceTest.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index b01e674f..b73d41c1 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -85,6 +85,17 @@ void prepareRaceParseErrorTest() { Assertions.assertThatCode(() -> raceService.prepareRace(round)).isInstanceOf(IllegalArgumentException.class); } + @Test + void prepareRaceRangeErrorTest() { + // 객체와 삽입할 배열을 준비 + Race race = new Race(); + RaceServiceInterface raceService = new RaceService(race, race); + String round = "101"; + + // 잘못된 경우에 대해 테스트 (범위 문제) + Assertions.assertThatCode(() -> raceService.prepareRace(round)).isInstanceOf(IllegalArgumentException.class); + } + @Test void getWinnersTest() { // 객체와 삽입할 배열을 준비 From bfa42bb504b6a0d82fbf2b48f081c23abb33969d Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 22:37:06 +0900 Subject: [PATCH 144/153] test(RaceServiceTest): add getWinnersTest --- src/test/java/RaceServiceTest.java | 36 +++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index b73d41c1..4e54bdbf 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -9,6 +9,8 @@ // 구체적 로직을 갖는 RaceService에 대한 테스트. // 단순한 getter, setter에 대한 테스트는 생략하였습니다. +// service와 model을 분리하였으므로 model에 대한 테스트 없이 service에 대한 테스트만 진행합니다. +// 또한 RaceService의 로직에서 car model의 모든 기능을 사용하므로 car model에 대한 테스트도 생략합니다. public class RaceServiceTest { // addCars를 통해 삽입이 잘 됐는지 확인 @@ -82,7 +84,8 @@ void prepareRaceParseErrorTest() { String round = "a"; // 잘못된 경우에 대해 테스트 (parse 문제) - Assertions.assertThatCode(() -> raceService.prepareRace(round)).isInstanceOf(IllegalArgumentException.class); + Assertions.assertThatCode(() -> raceService.prepareRace(round)) + .isInstanceOf(IllegalArgumentException.class); } @Test @@ -93,7 +96,28 @@ void prepareRaceRangeErrorTest() { String round = "101"; // 잘못된 경우에 대해 테스트 (범위 문제) - Assertions.assertThatCode(() -> raceService.prepareRace(round)).isInstanceOf(IllegalArgumentException.class); + Assertions.assertThatCode(() -> raceService.prepareRace(round)) + .isInstanceOf(IllegalArgumentException.class); + } + + @Test + void startRaceTest() { + // 객체와 삽입할 배열을 준비 + Race race = new Race(); + RaceServiceInterface raceService = new RaceService(race, race); + String[] carsName = {"jih", "hyu", "abc", "xyz", "aaa", "bbb", "ccc", "ddd", "eee", "fff", + "ggg", "hhh"}; + + // race 준비 및 시작 + raceService.addCars(carsName); + // 충분히 많은 시행에서 모두의 진행도가 동일하다면 어딘가 로직이 잘못된 것 + raceService.prepareRace("100"); + raceService.startRace(); + + // 모두의 진행도가 동일한지 확인 + boolean isAllEqual = raceService.getCars().stream() + .allMatch(car -> raceService.getCars().get(0).getProgress() == car.getProgress()); + Assertions.assertThat(isAllEqual).isFalse(); } @Test @@ -114,15 +138,15 @@ void getWinnersTest() { // 승자 중 한명의 진행도를 받아옴. int winnerProgress = winners.get(0).getProgress(); // 우선 승자들끼리 진행도가 모두 같은지 확인하는 변수 생성 - boolean isWinnersProgressAllEqual = winners.stream().allMatch(car -> car.getProgress() == winnerProgress); + boolean isWinnersProgressAllEqual = winners.stream() + .allMatch(car -> car.getProgress() == winnerProgress); // getWinners로 받아온 승자의 진행도가 실제로 가장 높은지 확인하는 변수 생성 - boolean isWinnerProgressTheHighest = raceService.getCars().stream().allMatch(car -> car.getProgress() <= winnerProgress); + boolean isWinnerProgressTheHighest = raceService.getCars().stream() + .allMatch(car -> car.getProgress() <= winnerProgress); // 승자들끼리의 진행도를 확인 Assertions.assertThat(isWinnersProgressAllEqual).isTrue(); // getWinners로 받아온 승자가 진짜 승자인지 확인 Assertions.assertThat(isWinnerProgressTheHighest).isTrue(); } - - } From b2feae0851741be35df299a02ae4c5720ac84ac5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Sun, 9 Jun 2024 22:37:32 +0900 Subject: [PATCH 145/153] test(RaceServiceTest): add getWinnersTest --- src/test/java/RaceServiceTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 4e54bdbf..3bdddb29 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -113,10 +113,10 @@ void startRaceTest() { // 충분히 많은 시행에서 모두의 진행도가 동일하다면 어딘가 로직이 잘못된 것 raceService.prepareRace("100"); raceService.startRace(); - - // 모두의 진행도가 동일한지 확인 boolean isAllEqual = raceService.getCars().stream() .allMatch(car -> raceService.getCars().get(0).getProgress() == car.getProgress()); + + // 모두의 진행도가 동일한지 확인 Assertions.assertThat(isAllEqual).isFalse(); } From d3850f57ab3e849a6823dad0e2194a3a2483ffa1 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 10 Jun 2024 00:15:05 +0900 Subject: [PATCH 146/153] feat(RaceViewInterface): add RaceViewInterface method --- src/main/java/view/RaceView.java | 9 ++++++--- src/main/java/view/RaceViewInterface.java | 4 ++++ src/test/java/CarTest.java | 3 --- src/test/java/RaceServiceTest.java | 11 +++++++---- 4 files changed, 17 insertions(+), 10 deletions(-) delete mode 100644 src/test/java/CarTest.java diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 5a6a1fee..ed62a326 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -11,12 +11,15 @@ public class RaceView implements Observer, RaceViewInterface { // View가 참조할 Service와 Controller. 조작은 절대 금지. private RaceServiceInterface raceServiceInterface; - private RaceControllerInterface raceControllerInterface; + private RaceControllerInterface raceControllerInterface = null; // 생성자 - public RaceView(RaceServiceInterface raceServiceInterface, - RaceControllerInterface raceControllerInterface) { + public RaceView(RaceServiceInterface raceServiceInterface) { this.raceServiceInterface = raceServiceInterface; + } + + // setter + public void setRaceControllerInterface(RaceControllerInterface raceControllerInterface) { this.raceControllerInterface = raceControllerInterface; } diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index 1494e950..02489d3c 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -1,11 +1,15 @@ package view; +import controller.RaceControllerInterface; + public interface RaceViewInterface { void userCarsInput(); void userRoundsInput(); + void setRaceControllerInterface(RaceControllerInterface raceControllerInterface); + void printProgress(); void printProcess(); diff --git a/src/test/java/CarTest.java b/src/test/java/CarTest.java deleted file mode 100644 index 1eabfd00..00000000 --- a/src/test/java/CarTest.java +++ /dev/null @@ -1,3 +0,0 @@ -public class CarTest { - -} diff --git a/src/test/java/RaceServiceTest.java b/src/test/java/RaceServiceTest.java index 3bdddb29..af977aa1 100644 --- a/src/test/java/RaceServiceTest.java +++ b/src/test/java/RaceServiceTest.java @@ -7,10 +7,13 @@ import service.RaceService; import service.RaceServiceInterface; -// 구체적 로직을 갖는 RaceService에 대한 테스트. -// 단순한 getter, setter에 대한 테스트는 생략하였습니다. -// service와 model을 분리하였으므로 model에 대한 테스트 없이 service에 대한 테스트만 진행합니다. -// 또한 RaceService의 로직에서 car model의 모든 기능을 사용하므로 car model에 대한 테스트도 생략합니다. +/* +구체적 로직을 갖는 RaceService에 대한 테스트. +단순한 getter, setter에 대한 테스트는 생략하였습니다. +service와 model을 분리하였으므로 model에 대한 테스트 없이 service에 대한 테스트만 진행합니다. +또한 RaceService의 로직에서 car model의 모든 기능을 사용하므로 car model에 대한 테스트도 생략합니다. +*/ + public class RaceServiceTest { // addCars를 통해 삽입이 잘 됐는지 확인 From 6f2d6fd1eb1c203e143d599db114aa5994109a62 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 10 Jun 2024 01:58:22 +0900 Subject: [PATCH 147/153] fix(RaceView): fix the information for losing paren --- src/main/java/view/RaceView.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index ed62a326..77408a1d 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -3,6 +3,7 @@ import controller.RaceControllerInterface; import java.util.List; import java.util.Scanner; +import java.util.stream.IntStream; import model.CarModelInterface; import observer.Observer; import service.RaceServiceInterface; @@ -34,7 +35,7 @@ public void update() { @Override public void userCarsInput() { // 안내문 출력 - System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분"); + System.out.println("경주할 자동차 이름을 입력하세요.(이름은 쉼표(,) 기준으로 구분)"); // 유저의 입력을 받고 token으로 쪼개기 Scanner sc = new Scanner(System.in); @@ -59,6 +60,15 @@ public void userRoundsInput() { raceControllerInterface.setRound(userInput); } + // progress를 받으면 막대기로 돌려주는 메서드 + private String getProgressBar(int progress) { + // 빠른 처리를 위한 Stringbuilder + StringBuilder stringBuilder = new StringBuilder(); + IntStream.range(0, progress).forEach(i -> stringBuilder.append('-')); + + return stringBuilder.toString(); + } + // 한 번 진행의 결과를 보여주는 메서드 @Override public void printProgress() { @@ -67,7 +77,7 @@ public void printProgress() { List carList = raceService.getCars(); // stream을 이용하여 양식에 맞게 출력 carList.stream() - .forEach(car -> System.out.println(car.getName() + " : " + car.getProgress())); + .forEach(car -> System.out.println(car.getName() + " : " + getProgressBar(car.getProgress()))); System.out.println(); } From bddf34fd96b92c2f2f9ed521b7527d03c8c530fd Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 10 Jun 2024 02:09:01 +0900 Subject: [PATCH 148/153] docs(Application): add comments at Application --- src/main/java/Application.java | 43 ++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/Application.java diff --git a/src/main/java/Application.java b/src/main/java/Application.java new file mode 100644 index 00000000..b3aa8279 --- /dev/null +++ b/src/main/java/Application.java @@ -0,0 +1,43 @@ +import controller.RaceController; +import controller.RaceControllerInterface; +import model.Race; +import observer.Observer; +import observer.Subject; +import service.RaceService; +import service.RaceServiceInterface; +import view.RaceView; +import view.RaceViewInterface; + +public class Application { + + public static void main(String[] args) { + // Race 객체 생성 + Race race = new Race(); + + // RaceService 객체 생성 + RaceService raceService = new RaceService(race, race); + // RaceServivce 인스턴스를 각 인터페이스에 맞게 변수 생성. 느슨한 결합을 위함 + RaceServiceInterface raceServiceInterface = raceService; + Subject subject = raceService; + + // RaceView 객체 생성 + RaceView raceView = new RaceView(raceServiceInterface); + // RaceView 인스턴스를 각 인터페이스에 맞게 변수 생성. 느슨한 결합을 위함. + RaceViewInterface raceViewInterface = raceView; + Observer observer = raceView; + + // subject(RaceService)에 observer(raceview) 등록. + // controller의 부담을 덜기 위함. + subject.addObserver(observer); + + // RaceController 객체 생성 및 인터페이스 변수 생성 + RaceControllerInterface raceController = new RaceController(raceService, raceViewInterface); + // RaceView와 RaceController가 상호 참조하므로 setter를 사용함. + raceViewInterface.setRaceControllerInterface(raceController); + + // 컨트롤러를 사용한 서비스 시작 + raceController.init(); + raceController.play(); + raceController.end(); + } +} From b90075d74ba32343b6eee575f9dd36d439144553 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 10 Jun 2024 02:20:14 +0900 Subject: [PATCH 149/153] fix(RaceView): fix the printResult method because it print class instead of name --- src/main/java/Application.java | 4 ++-- src/main/java/view/RaceView.java | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/main/java/Application.java b/src/main/java/Application.java index b3aa8279..e43369f9 100644 --- a/src/main/java/Application.java +++ b/src/main/java/Application.java @@ -30,9 +30,9 @@ public static void main(String[] args) { // controller의 부담을 덜기 위함. subject.addObserver(observer); - // RaceController 객체 생성 및 인터페이스 변수 생성 + // RaceController 생성 및 인터페이스 변수 생성 RaceControllerInterface raceController = new RaceController(raceService, raceViewInterface); - // RaceView와 RaceController가 상호 참조하므로 setter를 사용함. + // RaceView와 RaceController가 상호 참조하므로 seatter를 사용함. raceViewInterface.setRaceControllerInterface(raceController); // 컨트롤러를 사용한 서비스 시작 diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 77408a1d..48d016ca 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -93,14 +93,12 @@ public void printResult() { // service 인터페이스를 통해 값 참조 List winners = raceServiceInterface.getWinners(); // 문자열을 빠르게 붙이기 위해 StringBuilder를 사용 + String winnersString = ""; StringBuilder stringBuilder = new StringBuilder(); // 우승자들의 정보를 String으로 변환한다. - for (int i = 0; i < winners.size() - 1; i++) { - CarModelInterface winner = winners.get(i); - stringBuilder.append(winner.getName()).append(',').append(' '); - } - stringBuilder.append(winners.get(winners.size() - 1)); + IntStream.range(0, winners.size() - 1).forEach(i -> stringBuilder.append(winners.get(i).getName()).append(", ")); + stringBuilder.append(winners.get(winners.size() - 1).getName()); System.out.println("최종 우승자 : " + stringBuilder); } From b59711e44de61221a967de9693b22dcf4b20b9b7 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 10 Jun 2024 02:21:35 +0900 Subject: [PATCH 150/153] refactor(RaceView): remove unused var --- src/main/java/view/RaceView.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index 48d016ca..c5d08e74 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -93,7 +93,6 @@ public void printResult() { // service 인터페이스를 통해 값 참조 List winners = raceServiceInterface.getWinners(); // 문자열을 빠르게 붙이기 위해 StringBuilder를 사용 - String winnersString = ""; StringBuilder stringBuilder = new StringBuilder(); // 우승자들의 정보를 String으로 변환한다. From 9fe2c6ea1aff05ebfaddfd53d11ace8bfb49e045 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 10 Jun 2024 10:03:52 +0900 Subject: [PATCH 151/153] docs: add comments --- src/main/java/controller/RaceController.java | 1 + .../java/controller/RaceControllerInterface.java | 6 ++++++ src/main/java/model/CarModelInterface.java | 4 ++++ src/main/java/model/RaceModelInterface.java | 12 ++++++++++++ src/main/java/observer/Observer.java | 2 ++ src/main/java/observer/Subject.java | 4 ++++ src/main/java/service/RaceServiceInterface.java | 12 +++++++++++- src/main/java/view/RaceViewInterface.java | 11 +++++++++++ 8 files changed, 51 insertions(+), 1 deletion(-) diff --git a/src/main/java/controller/RaceController.java b/src/main/java/controller/RaceController.java index c95fbe78..5c4332a1 100644 --- a/src/main/java/controller/RaceController.java +++ b/src/main/java/controller/RaceController.java @@ -3,6 +3,7 @@ import service.RaceServiceInterface; import view.RaceViewInterface; +// 실제 사용자가 조작할 컨트롤러. 이 클래스만으로 모든 로직을 수행할 수 있어야 한다. public class RaceController implements RaceControllerInterface { private RaceServiceInterface race; diff --git a/src/main/java/controller/RaceControllerInterface.java b/src/main/java/controller/RaceControllerInterface.java index 72300538..ee53f4be 100644 --- a/src/main/java/controller/RaceControllerInterface.java +++ b/src/main/java/controller/RaceControllerInterface.java @@ -1,14 +1,20 @@ package controller; +// 실제 사용자가 조작할 컨트롤러 public interface RaceControllerInterface { + // 사용자가 조작하는 프로그램의 첫 부분 public void init(); + // 사용자가 조작하는 프로그램의 중간 부분 public void play(); + // 사용자가 조작하는 프로그램의 마지막 부분 public void end(); + // view로부터 입력을 받아서 service로 차들의 이름을 전송하는 메서드 public void addCars(String[] cars); + // view로부터 입력을 받아서 service로 round의 횟수를 전송하는 메서드 public void setRound(String numberOfRound); } diff --git a/src/main/java/model/CarModelInterface.java b/src/main/java/model/CarModelInterface.java index 8218c1b1..8f0455e8 100644 --- a/src/main/java/model/CarModelInterface.java +++ b/src/main/java/model/CarModelInterface.java @@ -1,10 +1,14 @@ package model; +// 차 하나하나에 대한 model public interface CarModelInterface { + // car가 갖는 이름을 반환하는 메서드 String getName(); + // car의 진행도를 반환하는 메서드 int getProgress(); + // 차에 전진 혹은 정지를 명령하는 메서드 void moveOrNot(); } diff --git a/src/main/java/model/RaceModelInterface.java b/src/main/java/model/RaceModelInterface.java index fe1de951..07a30cbd 100644 --- a/src/main/java/model/RaceModelInterface.java +++ b/src/main/java/model/RaceModelInterface.java @@ -2,17 +2,29 @@ import java.util.List; +// 여러 대의 차가 배치된 경기에 대한 model public interface RaceModelInterface { + // 차의 총 개수를 반환하는 메서드 int getNumberOfCars(); + // 라운드 횟수를 반환하는 메서드 int getNumberOfRounds(); + // race 시작 전, controller를 통해 받은 round의 횟수를 저장하는 메서드 + // 조건 검사가 들어 있고, setter를 지양하기 위해 + // 해당 메서드에서는 조건 검사를 마치고 private으로 선언된 setter를 이용해 round를 설정한다. void prepareRace(String rounds); + // car 목록을 반환하는 메서드 List getCars(); + // car 목록을 추가하는 메서드 + // 마찬가지로 조건 검사 및 setter 지양 목적 void addCars(String[] carsName); + // race를 시작하는 메서드 + // service와 model 중 어디에 배치할지 고민했지만, + // model의 변수(cars)에 값의 변경을 요구하기 때문에 책임을 분리하고자 model에 배치했다. void startRace(); } diff --git a/src/main/java/observer/Observer.java b/src/main/java/observer/Observer.java index 81a1b7be..682eb72f 100644 --- a/src/main/java/observer/Observer.java +++ b/src/main/java/observer/Observer.java @@ -1,6 +1,8 @@ package observer; +// Observer pattern을 위한 observer public interface Observer { + // 내부의 변수를 참조해서 update하면, 바로 view에 변화를 출력한다. void update(); } diff --git a/src/main/java/observer/Subject.java b/src/main/java/observer/Subject.java index 057091c6..abb54041 100644 --- a/src/main/java/observer/Subject.java +++ b/src/main/java/observer/Subject.java @@ -1,10 +1,14 @@ package observer; +// Observer pattern의 subject public interface Subject { + // 관찰 대상인 클래스에서, 관찰하는 클래스를 addObserver하면 자동으로 변화를 감지 void addObserver(Observer observer); + // 사용하지는 않았지만, Observer를 제거하는 메서드도 존재 void removeObserver(Observer observer); + // Observer의 update를 직접 호출해서 값의 변화가 일어났음을 알리는 메서드 void notifyObservers(); } diff --git a/src/main/java/service/RaceServiceInterface.java b/src/main/java/service/RaceServiceInterface.java index 52f953d0..51a0afbf 100644 --- a/src/main/java/service/RaceServiceInterface.java +++ b/src/main/java/service/RaceServiceInterface.java @@ -3,19 +3,29 @@ import java.util.List; import model.CarModelInterface; +// 여러 대의 차가 배치된 경기에 대한 비즈니스 로직을 담은 service public interface RaceServiceInterface { + // model로부터 car의 총 개수를 받아서 다시 반환하는 메서드 int getNumberOfCars(); + // model로부터 round의 총 횟수를 받아서 다시 반환하는 메서드 int getNumberOfRounds(); + // model로부터 car의 정보를 받아서 다시 반환하는 메서드 List getCars(); + // 비즈니스 로직: model로부터 여러 정보를 받아 winner를 뽑아내는 메서드. + // 이 부분은 model의 내부 구조에 대해 자세히 알 필요도 없고 + // setter를 사용해서 값을 변경하지도 않으므로, service에 배치했다. List getWinners(); - void addCars(String[] cars); + // model에게 차의 이름 목록을 넘겨주어 차를 추가하는 메서드 + void addCars(String[] carsName); + // model에게 round의 횟수를 넘겨주어 경기를 준비하는 메서드 void prepareRace(String rounds); + // model에게 요청하여 실제로 경기를 시작하게 하는 메서드 void startRace(); } diff --git a/src/main/java/view/RaceViewInterface.java b/src/main/java/view/RaceViewInterface.java index 02489d3c..d2df22b7 100644 --- a/src/main/java/view/RaceViewInterface.java +++ b/src/main/java/view/RaceViewInterface.java @@ -2,23 +2,34 @@ import controller.RaceControllerInterface; +// 경기에 대해 사용자의 입력, 사용자에게 보여줄 출력을 담당하는 view public interface RaceViewInterface { + // user로부터 차의 이름들을 받는 메서드 void userCarsInput(); + // user로부터 round 횟수를 받는 메서드 void userRoundsInput(); + // view <-> controller 상호 참조를 위해 setter로 뒤늦게 추가 + // 좋은 방법은 아닌 것 같다 void setRaceControllerInterface(RaceControllerInterface raceControllerInterface); + // 한 횟수에서 차들의 진행도를 출력. observer의 update가 호출하는 메서드 void printProgress(); + // 중간 안내문을 출력하는 메서드 void printProcess(); + // 결과를 출력하는 메서드 void printResult(); + // 사용자가 입력한 차의 정보가 잘못된 경우 경고를 출력하는 메서드 (5자 초과, 빈 입력) void printCarsErrorMessage(); + // 사용자가 입력한 round가 잘못된 경우 경고를 출력하는 메서드 (100 초과) void printRoundsArgumentErrorMessage(); + // 사용자가 입력한 round가 잘못된 경우 경고를 출력하는 메서드 (parse 불가) void printRoundsFormatErrorMessage(); } From 80a7b38171d9cc3785aed2b1a73f2bd1270d23a5 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 10 Jun 2024 10:06:05 +0900 Subject: [PATCH 152/153] fix(RaceView): fix the print statement --- src/main/java/view/RaceView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/view/RaceView.java b/src/main/java/view/RaceView.java index c5d08e74..24706f96 100644 --- a/src/main/java/view/RaceView.java +++ b/src/main/java/view/RaceView.java @@ -84,7 +84,7 @@ public void printProgress() { // 과정을 담당하는 메서드 @Override public void printProcess() { - System.out.println("실행 결과"); + System.out.println("\n실행 결과"); } // 결과를 출력하는 메서드 From 842f848af524e8be2ca22d4f0da4181c60e2e9f7 Mon Sep 17 00:00:00 2001 From: kangwlgns Date: Mon, 10 Jun 2024 10:12:53 +0900 Subject: [PATCH 153/153] docs(Race): add comments --- src/main/java/model/Race.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/model/Race.java b/src/main/java/model/Race.java index 311482dd..9a4c1038 100644 --- a/src/main/java/model/Race.java +++ b/src/main/java/model/Race.java @@ -32,6 +32,7 @@ public List getCars() { return cars; } + // getter @Override public int getNumberOfRounds() { return numberOfRounds; @@ -79,6 +80,7 @@ public void prepareRace(String rounds) throws IllegalArgumentException { setNumberOfRounds(numberOfRounds); } + // round 횟수에 대한 유효성 검사 private void verifyNumberOfRounds(int numberOfRounds) throws IllegalArgumentException { // 100보다 큰 입력이 들어온 경우 if (numberOfRounds > 100) {