1. 공백 라인을 의미있게 사용해보자.

기능/문맥 단위로 공백을 주어 코드의 가독성을 높히도록 하자

//before case
RacingGameImpl game = new RacingGameImpl();
InputView inputView = InputView.getInstance();
ResultView resultView = ResultView.getInstance();
RacingInfomation racingInfomation = inputView.execute(new CarNameInputStrategy());
game.execute(racingInfomation, MoveStrategy.defaultStrategy(new Random()));
resultView.viewAll(game.getGameHistory(), new PrintMarkStrategy("-"));

//after case
RacingGameImpl game = new RacingGameImpl();
InputView inputView = InputView.getInstance();
ResultView resultView = ResultView.getInstance();

RacingInfomation racingInfomation = inputView.execute(new CarNameInputStrategy());

game.execute(racingInfomation, MoveStrategy.defaultStrategy(new Random()));

resultView.viewAll(game.getGameHistory(), new PrintMarkStrategy("-"));

2. 요구사항으로 인한 객체 수정 팁

요구사항으로 인해 객체의 상태값이 변경되는 일은 빈번하다.

그렇다고 매 번 추가되는 상태값에 따라 새로운 하위클래스를 만들필요는 없다.

추가되는 상태값이 전혀 연관없는 값일 경우에만 클래스를 분리하며 그렇지 않고 객체명에 연관되어 객체의 의미가 훼손되지않는 경우에는 객체를 수정하는편이 좋다.

3. 전략의 주입시점은 전략을 사용하는 시점에서

처음 생성자의 생성시점이나 setter를 통해 전략을 주입하는 것 보다는 해당 전략이 필요한 시점에 전략을 주입하면 조금 더 유연하게 대처할 수 있다.

4. compareTo와 equals의 결과는 같아야 한다.

<aside> 💡 compareTo가 "같다" 라고 판단했다면, equals가 true여야 한다.

</aside>

:Java Comparable.compareTo(T o)문서에서 (x.compareTo(y)==0) == (x.equals(y)) 구현하도록 강하게 권장하고 있다.(필수는 아니지만 가능한 준수하라)

아이템[14] - Comparable을 구현할지 고려하라