안녕하세요. Brad입니다. 오늘은 어제 'Lotto' 미션 step1 PR보낸 것에 대한 피드백 관련하여 정리해보려 합니다. 피드백 받은 내용은 아래와 같습니다.
- 메소드 이름에 의도가 잘 드러나지 않음. 메서드 이름이 프로그램의 주목적과 관련있지 않음
- 메소드가 두 가지 일을 하고 있음
두번째 피드백 내용은 알겠으나 첫번째 내용은 어떤 것을 말하려는지 명확하게 와닿지 않았습니다. 결국은 한번더 여쭤보면서 어떤 내용인지 감을 잡을 수 있었습니다.
메소드 이름 관련
- 꼭 집어서 말해주신 부분은
LottoDto
을 만드는 부분이었습니다. 실제 만들어진 로또들을 출력하기 위해선 출력부에 로또 내용이 필요하였기 때문입니다. 이 때 제가 만들었던 메서드명은makeLottoDto()
였습니다. - 분명 메서드 내용에서 DTO를 만들고 있었기 때문에 이렇게 지었지만 전체적인 로또게임이라는 프로그램의 맥락에서는 적절하지 않았던 것입니다.
- 따라서 결국은
generateLottos()
로 바꾸었습니다. 물론 안의 내용은 바뀐 것은 없지만 프로그램의 맥락에서, 인간의 관점에서 이 메서드명이 더 적절하였습니다. 결국 객체 지향은 인간 지향과 동의어라는 점에서 인간의 관점에서 프로그램명도 접근해야 합니다. - 이외 로또 번호가 일치하는 것에 대해
match
라는 단어 대신strike
라는 단어로 바꾸어 의미를 좀 더 명확히 하고, 전체적으로 처음보는 사람이라도 어떤 역할인지 알 수 있게끔 이름을 짓기위해 노력하였습니다.
- 꼭 집어서 말해주신 부분은
메소드의 초과 업무 관련
전에도 이런 피드백을 받은 적이 있었고 그 때도 오늘과 같은 패턴으로 짰었습니다. 제가 짠 코드에서 예를 들면 다음과 같습니다.
public ResultDto makeResultDto(int[] matchPoint, int purchaseAmount) { Map<Integer, Integer> matchResult = new HashMap<>(); int profitSum = 0; for (int i = PRIZE_MATCH_MIN; i <= PRIZE_MATCH_MAX; i++) { matchResult.put(i, matchPoint[i]); profitSum += LottoPrize.getLottoPrize(i) * matchPoint[i]; } return new ResultDto(matchResult, MathHandler.getProfit(profitSum, purchaseAmount)); }
ResultDto
를 만드는 부분인데요. 저는 'for문을 같이 돌릴 수 있을 때 이왕이면 같이 돌리면 따로 두번 돌리는 것보다 좋지 않겠나' 하는 생각이 있었습니다. 하지만 객체 지향적 관점에서 메서드는 한 가지일만 하도록 해야하기 때문에 적절하진 않았던 것이죠.따라서 profitSum을 담당하는
calculateProfitNum()
과 로또 번호 맞친 수 정보를 가지고 있는 Map을 만드는putStrikeNums()
메서드를 나누어서 그 두 개의 메서드에서 받은 반환값으로ResultDto
만들 수 있게 수정하였습니다.결론은 사소한 효율성을 따지기보다는 메서드를 한 의미 단위로 나누어 한 가지 일만 하도록 하는 것이 훨씬 중요하다는 것입니다.
피드백 반영을 하고 다시 commit하였을 때 좀 더 객체지향적으로 짜기 위해 어떻게 개선하는 것이 좋을지 물어보았습니다. 그에 대한 답변은 로또를 담는 List<List>
와 같은 부분에서 안의 List
를 상태값을 갖는 객체로 하는 것이 좋지 않겠냐는 답변을 받았습니다. 이 답변을 받으니 그렇게 설계하면 훨씬 좋겠구나라는 생각이 들었습니다. 다음 단계에서 이를 적용할 수 있도록 해봐야겠습니다!!
'TIL' 카테고리의 다른 글
Today's Dev Notes(2018-10-24) (6) | 2018.10.24 |
---|---|
Today's Dev Notes(2018-10-23) (2) | 2018.10.24 |
Today's Dev Notes(2018-10-18) (0) | 2018.10.19 |
Today's Dev Notes(2018-10-16) (0) | 2018.10.16 |
Today's Dev Notes(2018-10-15) (0) | 2018.10.15 |