깃허브 링크
https://github.com/ethrad/NumPlay
Lv4 완료 후의 클래스 다이어그램
문제
1. 게임 기록을 볼 때 Main에서 BaseballGameDisplay의 함수를 직접 호출하는 것이 아닌 BaseballGame을 통해서 호출해도 되는가?
BaseballGame에서 힌트 출력 시에 BaseballGameDisplay 객체를 만들어서 사용하기 때문에
비슷한 방식으로 BaseballGame에 viewRecords라는 메소드를 만들었다.
BaseballGameDisplay에 몇 번째 게임, 몇 번째 시도인지 저장해두고 출력하는 방식이 더 좋을지 고민했다.
데이터 저장을 어디다 할 지 고민하기 시작하면 이제 MVC 패턴 같은 걸로 넘어가는 건가..?
A. 맞아요. 데이터를 저장하고, 제어하고, 뷰 모델을 고민해야할 때 가장 대중적으로 접할 수 있는 패턴이 MVC에요.
"게임 기록을 볼 때 Main에서 BaseballGameDisplay의 함수를 직접 호출하는 것이 아닌 BaseballGame을 통해서 호출해도 되는가?"
위에 대해서 고민이 된다는것은 현재 식별하고 정의하신 클래스에 대한 목적이 명확하지않아서 그렇습니다.
설계를 할 때 객체를 식별했다면 해당 객체의 역할에 대해 정말 명확하게 정리해야해요. 그렇지않으면, 추 후 확장이 될 때마다 긴가민가 + 애매한 부분이 정말 많아집니다.
예를들어, 명확하게 Display는 뷰를 위해 정의한것이라면 모든 게임을 제어하는 BaseballGame를 통해서 호출하면 안되는것이죠. 그래서 초반에는 식별한 객체에 대해 문장으로 정리해보시면 좋습니다.
2. 예외가 명확한 경우에도 exception을 사용해야 하는가?
입력이 올바른지 판단하는 함수를 만들어서 옳은 경우, 올바르지 않은 경우를 모두 커버할 수 있는데 exception을 사용해야 하는지 고민했다. (BaseballGame의 validateInput 메소드)
A. 이것은 답은 없고, 요구사항에 따라 달라요. 마치 어떤 게시판을 조회했는데 데이터가 없으면 잘못되었다 판단하여 예외를 반환할 수 있고, 또는 그냥 빈 배열을 반환해줄 수 도있어요.
이것은 제품의 비지니스 규칙과 동일한 맥락으로 보시면됩니다.
3. 생성자는 어떻게 작성하는 것이 좋은가?
BaseballGame에 있는 private 변수들을 선언하면서 같이 초기화 했는데 생성자 안에서 초기화하는 것이 좋은가?
A. 지금의 구조는 하나의 클래스에서 실행되는거다보니, 생성자를 통해 하는것은 크게 의미없어보입니다.
이미 변수들을 가변(mutable)으로 관리를 하고있어서 전역변수에서 선언하는게 오히려 깔끔하다고 생각됩니다.
일반적으로는 모두 새로운 인스턴스를 생성해서 사용하기때문에 생성자에서 초기화를 시키는게 맞긴합니다.
4. 기능을 조금씩 만드는 게 아니라 한 번에 다 만들고 기존 코드도 수정했는데 이런 경우에는 커밋을 어떻게 하면 좋은가?
기능 추가, 구조 변경, 버그 수정 부분을 따로 만들고 커밋도 따로 해야하나?
아니면 그냥 다 했다고 커밋을 하고 자세히 설명을 하는게 좋은가?
A. 한번에 다 만들고 커밋을 쌓는것부터 바뀌어야합니다.
구현에 대한 테스크를 우선 한번 정리해보세요.
예를 들어,
1. Ball Display 객체 구현
2. BaseBallGame 객체 구현
A. 볼 카운터 구현
B. 검증 논리 구현
위와 같이 테스크들을 정리하면 각 테스크가 하나의 커밋이 되어야합니다.
이거 역시 답은 없고, 구현에 대한 어려움, 양이 크지않아 BaseBallGame 구현을 하나의 테스크로 볼 수도 있기때문에 이것은 상황에 따라 다르지만 테스크를 분리해서 설계하는 습관을 들이면 작은 단위의 작업을 통해 커밋을 쌓아올릴 수 있습니다.
5. 커밋, 머지 컨벤션 작성을 처음 해봐서 헷갈렸다.
노션이나 메모장에 컨벤션 양식을 미리 적어놓고 복사해서 사용해야겠다.
그 외 구현 & TIL & Git 등에 대한 피드백
1. LinkedHashSet 사용 목적
왜 LinkedHashSet를 사용하셨을까요? Set 자료구조는 중복을 제거하기때문에
// 중복되는 숫자가 있는지
for (char c : input.toCharArray()) {
if (!inputSet.add(Character.getNumericValue(c))) {
return false;
}
}
위 코드에 대한 검증이 불필요해집니다. add 메서드의 반환타입을 사용하고싶은 목적이였다면 다른 구현 방식도 충분히 가능할것같은데, 왜 LinkedHashSet 자료구조를 택했는지 궁금합니다.
잘못되어서 코멘트를 한다기보단 명확한 자료구조에 대한 이해를 통해 구현이 되었으면 하는 바램에 남겨봅니다.
'프로그래밍 > Java' 카테고리의 다른 글
[부트캠프 과제] 심화 주차 개인 과제 - 일정 관리 앱 개선 (0) | 2024.10.31 |
---|---|
[부트캠프 과제] 일정 관리 앱 Develop (1) | 2024.10.17 |
[부트캠프 과제] 일정 관리 앱 만들기 (0) | 2024.10.04 |
[Java/IntelliJ] build.gradle, settings.gradle 오류 났을 때 (1) | 2024.09.25 |