Search
Duplicate

3. [클린 코드 with Java] 3단계 - 사다리(게임 실행)

링크
점수
⭐️⭐️⭐️⭐️
완료일
2023/05/25
상태
완료
유형
인강

기능 요구사항

사다리 실행 결과를 출력해야 한다.
개인별 이름을 입력하면 개인별 결과를 출력하고, "all"을 입력하면 전체 참여자의 실행 결과를 출력한다.

프로그래밍 요구사항

자바 8의 스트림과 람다를 적용해 프로그래밍한다.
규칙 6: 모든 엔티티를 작게 유지한다.
규칙 7: 3개 이상의 인스턴스 변수를 가진 클래스를 쓰지 않는다.

실행 결과

위 요구사항에 따라 4명의 사람을 위한 5개 높이 사다리를 만들 경우, 프로그램을 실행한 결과는 다음과 같다.
참여할 사람 이름을 입력하세요. (이름은 쉼표(,)로 구분하세요) pobi,honux,crong,jk 실행 결과를 입력하세요. (결과는 쉼표(,)로 구분하세요) 꽝,5000,꽝,3000 최대 사다리 높이는 몇 개인가요? 5 사다리 결과 pobi honux crong jk |-----| |-----| | |-----| | |-----| | | | |-----| | |-----| |-----| 꽝 5000 꽝 3000 결과를 보고 싶은 사람은? pobi 실행 결과 꽝 결과를 보고 싶은 사람은? all 실행 결과 pobi : 꽝 honux : 3000 crong : 꽝 jk : 5000
Plain Text
복사

리뷰

리뷰어: 어떠한 역할의 Utils인지 명시해주면 좋을 것 같아요이름이 모호해서 실제 많은 역할의 메소드가 추가될 것 같아요!
public class Utils { private static final int MAX_NAME_SIZE = 5;
Java
복사
생각정리 Utils로 크게 묵는 것보다, 차라리 클래스에서 사용되는 Uitls을 따로 분리하는게 좋을 것 같다.
public class NameUtils { private static final int MAX_NAME_SIZE = 5;
Java
복사
리뷰어 : 메서드 역할만 보면 해당 메서드가 names 에 대해 논리적으로 의존할 필요가 있을까요?  논리적으로 의존이 필요하다면 PlayerName에 대해 직접적으로 의존된다는 의미같아서요 혹시 이 부분에 대해 어떻게 생각하시나요?? 
public static List<String> fillOrRightAlign(List<String> playersNames) { return playersNames.stream() .map(name -> name.length() < MAX_NAME_SIZE ? String.format("%5s", name) : name) .collect(Collectors.toList()); }
Java
복사
생각정리 : 이부분은 List 의 값을 -> 5글자로 만들어주는 기능인데,
전달 주신 글을 읽을때
HourlyReporter 가 알 필요가 없는 PAGE_SIZE 변수를 클래스에 선언하여 HourlyReportFormatter 클래스의 값과 비교 이는HourlyReportFormatter과 HourlyReporter가 논리적으로 연결되었다. --> 때문에 HourlyReportFormatter 가 페이지 크기를 모른다면 문제가 발생한다. 라고 이해하였습니다.
해결방법
이를 해결 하기 위해 HourlyReportFormatter 에 getMaxSize를 만들고 호출하여 사용함으로 PAGE_SIZE 변수를 물리적으로 (HourlyReportFormatter.getMaxSize()) 로 나눈 다고 이해하였습니다.
근데 제가 작성한 코드는, Util 클래스 에서 MAX_NAME_SIZE를 선언하고 그안에서 도출되어지는 값을 전달 하는 방식인데, 보내주신 예제를 이해하면서 작성하려고 하면, 논리적으로 연결되는 부분이 맞는가 계속 고민이 되고 있어서요 ㅠ.ㅠ 
리뷰어 : 외부에서 메서드를 호출할 때는 번호만 가져올 것이라 예상 되는데 내부에서는 상태를 변경하고 있어서 오해가 생길 것 같아요  명령과 조회의 책임을 분리하면 좋을 것 같은데 혹시 이 부분에 대해 어떻게 생각하시나요??
public Player getConnectNumber(Player player, CheckConnectStrategy checkConnectStrategy) { int result = player.getResult(); if (isResultPullRight(result)) { player.move(result + checkConnectStrategy.getLeftConnectResult(player, points)); return player; } if (isResultPullLeft(result)) { player.move(result + checkConnectStrategy.getRightConnectResult(player, points)); return player; } player.move(result + checkConnectStrategy.getConnectResult(player, points)); return player; }
Java
복사
생각정리 : 하나의 함수에 여러가지 기능을 넣어서 if 로 처리를 했다고 생각됨, 이부분은 함수에 맞게 수정이 필요. 함수는 단하나의 기능을 잘 하면 된다!!.
public boolean isPointFullRight(int result) { return result >= points.getPoints().size(); } public boolean isPointFullLeft(int result) { return result <= 0; } public boolean isRightConnect(int point) { return getLine().get(point); } public boolean isLeftConnect(int point) { return getLine().get(point - 1); }
Java
복사
리뷰어: 뷰에서 어떤 값을 입력하냐에 따라 보여지는 결과가 달라지는 것 같아요  그런데 이 enum 은 모델의 역할을 하는 것이 아닌 뷰의 입력값을 구분하기 위해 사용되는 것 같은데요. 그렇기 때문에 패키지 위치가 어색한 것 같아요 혹시 이 부분에 대해 어떻게 생각하시나요??
public enum SearchType { ALL("ALL"); private final String searchType; SearchType(String searchType) { this.searchType = searchType; }
Java
복사
생각정리 : 기존에는 모델패키지 아래 모델클래스와 함께 작성하였다. 어디서 작동하는 enum인지에 따라 구분하고 해당하는 패키지 밑에 구성하는 것을 생각하자.
동일한 역할의 메서드가!으로 나눠지는 것 같은데 한쪽의 메소드에서 다른 메소드를 호출하여 응집도를 조금 더 높여보는 방향은 어떻게 생각하시나요??
public boolean equals(String searchType) { return this.searchType.equals(searchType); } public boolean notEquals(String searchType) { return !this.searchType.equals(searchType); }
Java
복사
생각정리 : 함수로 어떤기능인지 좀 더 명확하게 작성하고 싶었다. 하지만 관리하는 측면에서는 변경된다면 두개다 변경해야 되서 좋지 않을 것으로 보여진다. 응집도를 높이기위해 하나의 함수에서 동작되게 변경
if (SearchType.ALL.equalsSearchType(playerNameParam.getPlayerName())) { OutPutView.outPutWinResults(players, winResults); } if (!SearchType.ALL.equalsSearchType(playerNameParam.getPlayerName())) { Player player = playerService.searchPlayerResult(players, playerNameParam); OutPutView.outPutWinResult(player, winResults); }
Java
복사
깃허브 링크 :
1812
pull
출처