Conversation
JHZLO
left a comment
There was a problem hiding this comment.
model 하나 controller 하나 view 클래스 하나 만들고 mvc 깨달았다고 하는거 킹받네요 ㅋㅋ;
| # 1. 차 이름 입력문구 출력 | ||
|
|
||
| # 2. 배열 동적 할당으로 차 입력 받음 | ||
|
|
||
| # 3. 시도할 횟수 입력받기 | ||
|
|
||
| # 4. 실행결과 순차적 출력 | ||
|
|
||
| # 5. 최종 우승자 출력 | ||
|
|
||
| # 6. 예외처리 No newline at end of file |
|
|
||
| InputView inputView = new InputView(); | ||
| OutputView outputView = new OutputView(); | ||
| List<String> carNames = inputView.readCarName(); |
There was a problem hiding this comment.
컨트롤러가 carName이라는 책임을 가진다라.. 뭔가 이상하지 않나여?
| public class RacingGame { | ||
|
|
||
| private final List<Car> cars; | ||
|
|
||
| public RacingGame(List<String> names) { | ||
| this.cars = names.stream() | ||
| .map(Car::new) | ||
| .toList(); | ||
| } | ||
|
|
||
| public void moveAll(){ | ||
| for (Car car : cars) { | ||
| int number = Randoms.pickNumberInRange(0, 9); | ||
| car.move(number); | ||
| } | ||
| } | ||
|
|
||
| public List<Car> getCars(){ | ||
| return cars; | ||
| } | ||
|
|
||
| } |
There was a problem hiding this comment.
답은 없지만 RacingGame을 모델로 설정하는 게 어떤 사이드이펙트를 불러올지는 생각을 해보면 좋을 것 같아요. 저는 개인적으로 모델을 책임을 가질 수 있는가?를 기준으로 판별하거든요
물론 레이싱게임이라는 객체도 게임을 운영하고 레이싱카들을 보유하고 점수를 측정해내야한다는 그런 책임들이 있겠죠. 그래서 레이싱게임을 모델로 가져가는 것도 어떻게 보면 이렇게 요구사항이 적은 문제에서는 가장 빠르게 문제를 풀어야되는 환경에서는 가장 최선의 방법일수도 있죠. 그런데 저는 여기서 중요하다고 생각하는 게 각각의 방식에 대한 트레이드오프를 정확하게 이해하고 적절한 환경에 쓸 수 있는가?에요.
예를들어 레이싱게임이라는 미션에 더 나아가 자동차의 엔진, 레이서의 특징, 점수판의 고도화 등등 레이싱게임의 각 구성요소들에 대한 추가적인 기능요구가 생긴다고 가정해보죠. 그러면 지금 현재 구조에서는 RacingGame이라는 객체가 점점 더 많은 필드들을 가지게 될 것이고 이는 모든 비즈니스 로직의 책임을 떠앉게 되는 GOD OBJECT가 될 것입니다. 그러면 수정사항이 있을 때마다 RacingGame의 거대한 부분을 계속해서 건드려야하고 유지보수성도 어려워지겠죠.
물론 나중에 추가 요구사항이 생길 때, 객체를 분리해야한다는 생각이 들 때 분리하는 것도 매우 좋죠. 이를 YAGNI 법칙이라고 하거든요. 어찌됐건 제가 강조하고싶은건
- 책임의 단위를 어떻게 가져가는 게 좋은 설계인지 고민할 것.
- 내가 선택한 방식이 어떤 트레이드오프를 지니고있는지 정확히 이해할 것,
There was a problem hiding this comment.
저라면 레이싱게임의 구성요소를 쪼개서 중심으로 책임을 설계해볼 것 같네요
레이싱게임에는
- 자동차들이 있고..
- 자동차마다의 특징도 있을거고
- 점수판이 있을거고
이렇게 구성요소들로 객체를 설계하면 굳이 레이싱게임이라는 객체 없이 레이싱게임을 나타낼 수 있지 않을까여?
그리고 추가 요구사항이 생겼을 때도 확장하기 쉬운 구조이기도 하고요
| public class Controller { | ||
|
|
||
| InputView inputView = new InputView(); | ||
| OutputView outputView = new OutputView(); |
| outputView.printAll(game.getCars()); | ||
| } | ||
|
|
||
| outputView.showWinner(game.getCars()); |
No description provided.