Skip to content

Conversation

@hd0rable
Copy link
Member

@hd0rable hd0rable commented Sep 25, 2024

요약 (Summary)

  • 기능 요구사항 2: 사다리 출력 구현
  • 기능 요구사항 3: 사다리 자동 생성 구현
  • 정적 팩토리 메서드 패턴을 활용하여 LadderGame을 생성하도록 리펙토링
  • 객체지향성을 띄도록 전체적인 리펙토링

🔑 변경 사항 (Key Changes)

  • LadderCreator 인터페이스 작성 : LadderAutoCreator, LadderInputCreator 이 해당 클래스를 구현하는 방식으로 의존성을 주입할수 있도록했습니다.

  • package 작성 : 객체지향적 프로그래밍을 하다보니 클래스가 두서없이 되는것같아 패키지를 나눠서 작성했습니다.

  • LadderSize,Ladder 추가 : 사다리 생성방식이 두개로 늘어나면서 사다리 자체 객체를 분리해줬습니다. 또한 사다리를 생성할때 행,열 사이즈를 LadderSize가 한번에 관리할수 있도록 분리해줬습니다.

  • Position 리펙토링 : 기존에 col값(x) 만 가지고있던 포지션이 사다리 출력을 구현하게 되면서 row값 관리가 필요해져서 row,col값을 둘다 가지고 있도록 수정했습니다. 또한 x,y의 값을 가지고 있는게 사다리 행,열 값과 혼동이 될것같아 row,col 값으로 구현했습니다.

  • LadderPrint 추가 : 사다리 출력 기능을 구현하기위해 사다리 출력 클래스를 작성했습니다.

  • moveRow : 포지션의 값이 row,col이 생기면서 사다리가 이동하는 run함수에 row 포지션도 이동하는 moveRow함수를 작성했습니다. 해당함수로 row이 변경되면 그 변경된 포지션을 기준으로 프린트함수가 *을 출력하도록 했습니다

  • LadderGameFactory 작성 :정적 팩토리 메서드 패턴을 활용하여 LadderGame을 생성하도록 구현했습니다.

  • test코드 추가 작성 : 전체적인 리펙토링과, 추가기능에대한 테스트 코드를 추가작성했습니다.

📝 리뷰 요구사항 (To Reviewers)

강의 내용을 기반으로.. 최대한 객체지향성을 살린다고 코드를짜봤는데 너무어려워서.. 이게 맞는지는 잘모르겠네요 ㅜ..ㅜ 계속코드를 짜면서 한메서드의 하나의 기능만 넣으려고 이 기능이 얘가 맡고있는게 맞나?? 를 고민을 엄청하면서 짠거같아요.. 객체지향적으로 관련해서 코드 리뷰 해주시면 감사하겠습니다!!

또 사다리 출력확인, 랜덤사다리라인생성확인 test 코드도 확인해주시면 감사하겠습니다!! 랜덤사다리와 일반사다리의 다른점이 사다리 라인생성부분만 있다고 생각해서 라인생성부분만 테스트코드를 작성했습니다.. 랜덤값이 들어가는거라 테스트를 어떻게 해야할지 감이안와서 고민하다 작성했습니다 ㅠ..ㅠ

@hd0rable hd0rable changed the base branch from main to 1week-completed September 27, 2024 12:37
Copy link
Member

@hamhyeongju hamhyeongju left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

코드 잘 봤습니다!
저번 미션도 그렇고 이번 미션까지 정말 섬세하게 코드를 작성해주셔서 코드 리뷰하는 내내 감탄하면서 봤네요.

하지만 몇 가지 부분에서 너무 틀에 얽매이는 느낌을 받았습니다. 그 때문에 오히려 객체 지향적인 부분을 포기한 느낌이 들어 아쉬웠네요. 모든 결정에는 트레이드오프가 따르는 법이니 적절히 타협하거나 막히는 부분의 문제를 꼭 따라야하는지 생각하시면서 코드 작성하시는 것도 좋을 것 같습니다.

그리고 질문해주신 랜덤에 관한 테스트 부분은 정말 핸들링하기 어렵고 막히는 부분입니다.
그래서 LadderCreator 에서 모든 기능을 담당하는 것이 아니라 LadderInputCreator와 LadderAutoCreator를 분리한 것이고, 조합을 사용해서 LadderCreator 사용 부분을 기능을 다루기를 힌트에서 언급했었습니다. 랜덤에 관한 부분을 분리하되, 랜덤 값을 주입 받는 클래스나 메서드에서 핵심 로직은 물론이고 유효성 검증에 대한 부분도 잘 작성하고 테스트 코드도 탄탄하게 받쳐준다면 랜덤으로 제어되는 부분도 잘 동작할 것이라 믿을 수 있지 않을까요?
물론 랜덤 값을 테스트 하는 방법이 아예 없는 것은 아닙니다. 대역(stub 등)을 사용하거나 Random 값의 seed 를 고정하는 방법, 리플렉션을 이용하는 방법 등 여러 방법이 제시되곤 하지만 모든 방법의 단점이 명확하기 때문에 앞에서 말씀 드린 것 처럼 어느 방법을 사용하건 랜덤(혹은 시간에 관한 부분) 부분을 분리하고, 핵심 로직과 테스트를 탄탄히 작성하는 것이 매우 중요하다는 것을 강조드리고 싶네요.

미션 구현하는데 정말 시간을 많이 들이셨을 것 같은데, 그 노력과 시간이 희진님께 큰 도움이 되었으면 좋겠습니다. 코드 리뷰와 2week-completed 코드 보시면서 본인의 코드와 비교해보는 시간을 가져보시면 좋을 것 같습니다. 수고 많으셨습니다! 3주 차도 파이팅입니다!

@hd0rable
Copy link
Member Author

항상 너무 꼼꼼하게 코드리뷰해주셔서 감사합니다..😭😭 덕분에 정말 많이 도움된것같아요!! 3주차 미션도 더 열심히 해보겠습니다!! 🫡🥰

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants