Conversation
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: cwangg897 <dhkdrb897@gmail.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
Signed-off-by: dev-wooyeon <une@kakao.com>
| - [ ] Domain / Application / UI 분리 | ||
| - [ ] Port / Adapter 도입 | ||
| - [ ] 책임 재배치 및 네이밍 정리 |
There was a problem hiding this comment.
체크 표기가 누락되었네요,, 채크 표기 수정해두겠습니다.
확인 감사합니다!
| | 시도 | 사용자가 단어를 한 번 입력하는 행위 | | ||
| | 타일 | 문자 하나에 대한 판정 결과 | | ||
| | 보드 | 전체 시도 결과를 누적한 출력 영역(행) | No newline at end of file |
| import domain.service.AnswerSelector; | ||
| import domain.service.Game; | ||
| import infrastructure.adapter.in.ConsoleOutputAdapter; | ||
| import infrastructure.adapter.out.FileWordRepository; |
| System.out.println(outputPort.getInputInfoMessage()); | ||
| String userInput = scanner.next(); | ||
| Word word = new Word(new Input(userInput, result), answer, wordRepository, outputPort); | ||
|
|
||
| Client client = new Client(word, game, result, outputPort); | ||
| String gameResult = client.run(); | ||
|
|
||
| System.out.println(gameResult); |
There was a problem hiding this comment.
매 라운드마다, client 랑 word 가 여러번 생성되는것같네요
There was a problem hiding this comment.
그렇네요,, client, word는 1번만 생성하고 입력만 여러번 생성되도록 리팩토링하는 방향으로 해보겠습니다.
src/main/java/domain/model/Word.java
Outdated
| if (!validWord(input.getValue())) return false; | ||
|
|
||
| if (!validNull(input.getValue())) return false; |
|
|
||
| String getNotAlphabetMessage(); | ||
|
|
||
| String getTryCountExceededMessage(); |
There was a problem hiding this comment.
혹시 어떤 의도로 말씀해주신건지 구체적으로 말씀해주실 수 있을까요?
작성해주신 내용만 봐서는 어떤 점을 말씀해주신건지 제가 잘 이해를 못했습니다 🥲
|
|
||
| // 기본 생성자는 apple로 생성한다. | ||
| public Answer(){ | ||
| this.value = "apple"; | ||
| } |
There was a problem hiding this comment.
초기 개발시에 답안지 생성을 빠르게 하기 위해서 작성해두었습니다!
기본 생성자만 사용하는 경우에는 항상 apple을 반환하도록 했고
답안지를 설정하려고 하면 String value으로 설정될 수 있도록 오버로딩을 적용해둔 상태입니다!
| public Answer(String value){ | ||
| this.value = value; |
There was a problem hiding this comment.
FileWordRepository::loadWords 에서 답안지 생성할 때 사용되는 데이터 자체를 필터했습니다!
null, blank 케이스에 대해서 항상 검증된 데이터가 들어옵니다.
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
String word = line.trim().toLowerCase();
if (!word.isEmpty()) {
wordSet.add(word);
wordList.add(word);
}
}
}| return String.valueOf(ResultValues.그린.getValue()) | ||
| .repeat(Math.max(0, WordCondition.입력_제한_길이.getValue())); |
There was a problem hiding this comment.
WordCondition.입력_제한_길이.getValue()) 이값은 항상 5인것같은데요?
There was a problem hiding this comment.
그렇네요. 비효율적인 코드 피드백 감사합니다!
수정해서 효율적으로 관리해보겠습니다 ㅎㅎ.
| public static String inCorrect() { | ||
| return String.valueOf(ResultValues.그레이.getValue()) | ||
| .repeat(Math.max(0, WordCondition.입력_제한_길이.getValue())); | ||
| } |
| public void 종료_조건_정답_실패_시_종료안됨() { | ||
| // given | ||
| Result result = new Result(); | ||
| StringBuilder board = new StringBuilder(ResultValues.inCorrect()); |
There was a problem hiding this comment.
단어하나까지 세심하게 확인해주셔서 감사합니다 사이몬님!
| public void 종료_조건_테스트_6턴_초과_불가() { | ||
| // given | ||
| Result result = new Result(); | ||
| result.setCurrentBoardsIndex(6); | ||
| Game game = new Game(result, outputPort); | ||
| // when | ||
| boolean resultChecked = game.checkedTryCount(); | ||
| // then | ||
| Assertions.assertFalse(resultChecked); | ||
| } |
There was a problem hiding this comment.
허헛.. 제가 궁금한 점은 message 들은 검증이 안되있는것같아요
굳이 안고치셔도 됩니다!
There was a problem hiding this comment.
출력 메세지 검증하는 것도 추가해보겠습니다!
주어진 요구조건 만족하는데 급급했던터라 시야가 좁았던것 같네요,,
dev-wooyeon
left a comment
There was a problem hiding this comment.
코드 꼼꼼히 살펴봐주시고 피드백 주셔서 감사합니다. 사이몬님!
피드백 주신 내용 반영해보도록 하겠습니다.
| System.out.println(outputPort.getInputInfoMessage()); | ||
| String userInput = scanner.next(); | ||
| Word word = new Word(new Input(userInput, result), answer, wordRepository, outputPort); | ||
|
|
||
| Client client = new Client(word, game, result, outputPort); | ||
| String gameResult = client.run(); | ||
|
|
||
| System.out.println(gameResult); |
There was a problem hiding this comment.
그렇네요,, client, word는 1번만 생성하고 입력만 여러번 생성되도록 리팩토링하는 방향으로 해보겠습니다.
| public void 종료_조건_테스트_6턴_초과_불가() { | ||
| // given | ||
| Result result = new Result(); | ||
| result.setCurrentBoardsIndex(6); | ||
| Game game = new Game(result, outputPort); | ||
| // when | ||
| boolean resultChecked = game.checkedTryCount(); | ||
| // then | ||
| Assertions.assertFalse(resultChecked); | ||
| } |
There was a problem hiding this comment.
출력 메세지 검증하는 것도 추가해보겠습니다!
주어진 요구조건 만족하는데 급급했던터라 시야가 좁았던것 같네요,,
| public void 종료_조건_정답_실패_시_종료안됨() { | ||
| // given | ||
| Result result = new Result(); | ||
| StringBuilder board = new StringBuilder(ResultValues.inCorrect()); |
There was a problem hiding this comment.
단어하나까지 세심하게 확인해주셔서 감사합니다 사이몬님!
- ValidationStatus 도입을 통한 입력 검증 로직 체계화 - Result 클래스의 boardList 캡슐화 및 읽기 전용 뷰 제공 - 자료형 기반의 일관된 변수 명명(Type Suffix) 및 직관적인 영문 네이밍 적용 - 한글로 작성된 Enum 상수, 메서드명, 주석을 영문으로 통일 - 패키지 전체 경로 사용 제거 및 Import 문 정리 Signed-off-by: dev-wooyeon <une@kakao.com>
dev-wooyeon
left a comment
There was a problem hiding this comment.
@youth-simon 님! 리뷰 감사합니다.
개인 일정으로 회신이 많이 늦어졌네요,,,
남겨주신 부분 답변 남겨두었고, 서로 Sync가 잘 맞을 수 있도록 해보겠습니다 ㅎㅎ.
잘 부탁드립니다!
|
|
||
| String getNotAlphabetMessage(); | ||
|
|
||
| String getTryCountExceededMessage(); |
There was a problem hiding this comment.
혹시 어떤 의도로 말씀해주신건지 구체적으로 말씀해주실 수 있을까요?
작성해주신 내용만 봐서는 어떤 점을 말씀해주신건지 제가 잘 이해를 못했습니다 🥲
|
|
||
| // 기본 생성자는 apple로 생성한다. | ||
| public Answer(){ | ||
| this.value = "apple"; | ||
| } |
There was a problem hiding this comment.
초기 개발시에 답안지 생성을 빠르게 하기 위해서 작성해두었습니다!
기본 생성자만 사용하는 경우에는 항상 apple을 반환하도록 했고
답안지를 설정하려고 하면 String value으로 설정될 수 있도록 오버로딩을 적용해둔 상태입니다!
| public Answer(String value){ | ||
| this.value = value; |
There was a problem hiding this comment.
FileWordRepository::loadWords 에서 답안지 생성할 때 사용되는 데이터 자체를 필터했습니다!
null, blank 케이스에 대해서 항상 검증된 데이터가 들어옵니다.
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(inputStream, StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
String word = line.trim().toLowerCase();
if (!word.isEmpty()) {
wordSet.add(word);
wordList.add(word);
}
}
}| return String.valueOf(ResultValues.그린.getValue()) | ||
| .repeat(Math.max(0, WordCondition.입력_제한_길이.getValue())); |
There was a problem hiding this comment.
그렇네요. 비효율적인 코드 피드백 감사합니다!
수정해서 효율적으로 관리해보겠습니다 ㅎㅎ.
- 클래스들을 도메인 주도 패키지 구조(word, game, matching)로 이동 - 명확성을 위해 클래스명 변경 (Input -> GameInput, Result -> GameResult) - 쉬운 영어 단어(check, match, make)로 메소드명 개선 - 새로운 구조와 네이밍에 맞춰 테스트 업데이트
- GameResult에서 Sequenced Collections (getLast) 활용 - Records 및 Enums와의 일관성을 위해 getter 이름을 value()로 통일 - 모든 호출부 및 테스트 업데이트
|
리뷰 답변드리면서, 본김에 보기 불편한거 한번 리팩토링 했어요! 주요 변경 내용입니다.
코드를 짧고 간결하면서도 직관적이게 보일 수 있게 변경했어요. 늘 감사해요. 사이몬님 😉 |
|
넵 수고하셨습니다! |
페어 : 초이
방식 : 작업 명세서 기반 커밋 단위로 교체, 50분마다 10분 휴식
진행 : 총 10시간 진행
배운점과 잘한점
페어프로그래밍의 본질을 배웠습니다. 잘하고 싶고 욕심도 많이나서 관련된 자료도 많이 찾아보며 초이님과 공유시간도 가졌었습니다. 상호간에 Sync가 잘맞추는데 시간이 좀 걸리도 했었습니다. 하지만 서로 같은 목표를 바라보고 적극적으로 의견들 내며 커밋이 늘어갈 때마다 초이님과 함께 한다면 더 어려운 미션도 도전해볼 수 있겠다는 생각이 들정도로 좋은 페어였다고 생각합니다.
왜 둘이 할 때 더 시너지가 생기는지 알게된 계기가 되었습니다.
2회차 시작할 때 서로 이 페어프로그래밍을 통해 뭘 가져가고 싶은지 이야기를 나누기도 했었습니다.
우연 : 페어프로그래밍의 본질자체를 체득하고 싶었다.
초이 : 주어진 미션은 물론 코드 레벨에서 구조를 잡아가는 것을 배우고 싶다.
적극적으로 임한 결과로 둘다 원하는 목표를 달성할 수 있었습니다 ㅎㅎ.
초이님 짱짱 최고 👍🏻
아쉬운점
페어프로그래밍의 숙련도가 낮아서 초반에 시간을 많이 소요한 것 같습니다.
저희팀은 먼저 구현을 하고 리팩토링하는 방향으로 작업을 진행했는데요. 일단 서로의 머릿속에만 있는 것들을 끄집어내놓고 정리하고 설계하는 시간을 더 가졌더라면….
주어진 시간에 더 좋은 아웃풋을 낼 수 있을 것 같다는 생각이 들어서 아쉽습니다 🥲
많은 시간을 투자한 부분
요구사항 분석에 가장 많은 시간을 소요한 것 같습니다. 용어 파악하고 맥락을 이해하고 서로 같은 목표를 바라보기 위해 먼저 이해한 사람이 상세하게 설명해줄 때 시간을 많이 쓴 것 같습니다.
특히 같은 알파벳 2개를 처리해야할때, 같은단어 중 한 알파벳이 초록 타일 이라면 이건 어떻게 처리해야할까요? 하며 논의했던 사례도 생각납니다.
페어에게 하고 싶은 말
저랑 함께 같은 목표를 바라봐주시고 적극적으로 임해주셔서 감사하다는 먼저 드리고 싶습니다.
특히 테스트코드 작성할 때는 그동안 쌓아오신 경험들이 묻어나는 코드들이 자연스럽게 나오는거 보니 눈에 보이지 않는 그 훈련들의 시간들을 엿볼 수 있었어서 눈도 즐거웠고 배우는 재미가 있었습니다.
이번 페어프로그래밍을 통해 초이님을 더욱 잘 알아갈 수 있는 기회였고, 다음에 또 한번 하고 싶다는 생각이 들 정도로 좋은 페어였습니다.
지금까지 해오신 경험들을 비춰본 결과, 초이님이 원하시는 목표에 도달하실 수 있을 것 같다는 생각도 강하게 듭니다. 늘 자신있게 파이팅!