반갑습니다!!
체스 규칙이 복잡해 구현이 어려웠던 미션이었습니다. :sweat_smile:
Pawn의 규칙이 가장 까다로웠습니다.
구조가 복잡해지다 보니, 각 객체들의 책임에 대해 고민을 많이 했어요.
체스 보드 세팅 정보를 외부에서 주입하도록 해, 매우 직관적이고 테스트에 용이한 코드를 작성했습니다.
로직들이 복잡하다 보니, 메서드들이 많아져 고민을 많이 했어요.
체스 보드 칸 위치와 기물들을 캐싱했습니다.
Direction 에서 방향을 판단하고, 각 기물의 이동 가능 방향들을 일일이 반환해 주다 보니, 클래스에 함수가 많아졌네요. :sob:
어려운 만큼 많이 성장하고 있는게 느껴져요!! :muscle:
제이의 피드백을 통해 더 성장하고 싶습니다. :smile:
감사합니다!! :bow:
Controller와 View의 의존성을 분리하기 위해 DTO를 사용했다.
View에 필요한 데이터들을 알맞게 담아 넘겨줄 수 있었다.
체스 보드 세팅을 외부에서 주입하도록 했다.
테스트 코드에서 Custom한 기물 배치를 할 수 있도록 해, 테스트에 용이한 구조를 만들었다.
Enum 클래스로 상수들을 종류별로 묶어서 관리했다.
상수들을 종류별로 편리하게 관리하고 사용할 수 있었다.
한 Enum 클래스에서 다른 Enum 클래스의 상수들을 묶어 활용하는 것을 경험할 수 있었다.
컬렉션을 클래스로 포장해 일급 컬렉션으로 만들었다.
함수를 통해 컬렉션 활용을 다양하게 할 수 있었다.
캡슐화를 하여 컬렉션의 남용을 방지했다.
체스 보드 칸의 위치들과 기물들을 캐싱했다.
객체를 새로 생성하지 않고 재사용해, 메모리를 절약할 수 있었다.
static 메서드를 사용해 객체를 편리하게 가져올 수 있었다.
동일한 맥락의 테스트 코드들을 Nested 어노테이션을 사용해 묶었다.
Nested 어노테이션을 사용하지 않을 때는 연관된 테스트들끼리 구별하기가 어려웠는데, 이를 사용하니 훨씬 편해졌다.
Inner 클래스의 장점들을 활용할 수 있었다.
처음에는 테스트 코드를 체스 보드의 위치값 문자열로만 테스트해, 작성하기도 어렵고 이해하기도 어려웠다.
테스트하기 쉬운 코드로 리팩토링 하고 나니, 테스트 코드가 직관적이 되어, 이해하기도 작성하기도 쉬워졌다.
Stream 을 적극 활용하여, 컬렉션을 자유롭게 활용했다.
함수의 개수와 인덴트를 효과적으로 줄일 수 있었다.