Search
Duplicate

5. [클린 코드 with Java] 4단계 - 자동차 경주 우승자

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

기능 요구사항

각 자동차에 이름을 부여할 수 있다. 자동차 이름은 5자를 초과할 수 없다.
전진하는 자동차를 출력할 때 자동차 이름을 같이 출력한다.
자동차 이름은 쉼표(,)를 기준으로 구분한다.
자동차 경주 게임을 완료한 후 누가 우승했는지를 알려준다. 우승자는 한명 이상일 수 있다.

실행 결과

위 요구사항에 따라 3대의 자동차가 5번 움직였을 경우 프로그램을 실행한 결과는 다음과 같다.
실행결과

피드백

리뷰어 : 클래스 파일 작성 시, 다음 링크에서 제안하는 순서대로 작성해보시면 좋을 것 같습니다.
생각정리 : 클래스 파일 변수를 작성하는 순서는 회사와 맞게 하려고 했지, 순서가 있는지 처음 알았다. 인지하고 작성하도록 하자.
private int position = 0; private static final Random random = new Random(); private static final int STARTING_CONDITION = 4; private static final int RANDOM_RANGE = 10; private static final int NAME_MAX_LENGTH = 5; private int attemptCount = 0; private String name;
Java
복사
다음과 같이 변경
private static final Random RANDOM = new Random(); private static final int STARTING_CONDITION = 4; private static final int RANDOM_RANGE = 10; private static final int NAME_MAX_LENGTH = 5; private int position = 0; private int attemptCount = 0; private String name;
Java
복사
리뷰어 : 자동차 이름인 문자열 name을 클래스로 포장해보는 건 어떨까요?
생각정리 : 모든 값을 원시값으로 포장하는것이 많은 클래스들이 생길 텐데, 클래스를 관리하게 된다면 더 힘들지 않을까? 라는 생각도 한편으로 들지만, 그래도 확실시 로직을 구분하는 것은 분석하는데 도움이 많이 될 것 같다.
package study.step4; public class Name { private static final intNAME_MAX_LENGTH= 5; String name; public Name(String name) { checkName(name); this.name = name; } private void checkName(String name) { if (name.length() >NAME_MAX_LENGTH) { throw new IllegalArgumentException("이름이 다섯자 이상입니다."); } } public String getName() { return name; } }
Java
복사
리뷰어 : String.format()을 활용하면 어떤 문자열이 생성될지 대략적으로 알 수 있어서 가독성을 높여볼 수 있습니다.
public class ResultView { private ResultView() { // 생성자 내부 호출 -> 명시적 Exception throw new AssertionError(); } public static void outPut(Track track) { StringBuilder stringBuilder = new StringBuilder(); List<Car> cars = track.getCars(); for (Car car : cars) { addCarName(stringBuilder, car); changeCarMoveToString(stringBuilder, car); stringBuilder.append("\n"); } }
Java
복사
다음과 같이 변경
public static void outPut(Track track) { StringBuilder stringBuilder = new StringBuilder(); List<Car> cars = track.getCars(); for (Car car : cars) { stringBuilder.append(String.format("%s : %s%n", car.getCarName(), POSITION_CHARTER.repeat(car.getPosition()))); } }
Java
복사
리뷰어 : 우승자 입력 함수 stream 으로 처리
public static void outPut(Track track) { StringBuilder stringBuilder = new StringBuilder(); List<Car> cars = track.getCars(); for (Car car : cars) { addCarName(stringBuilder, car); changeCarMoveToString(stringBuilder, car); stringBuilder.append("\n"); } System.out.println(stringBuilder); }
Java
복사
다음과 같이 변경
public static void outPutWinner(Track track) { StringBuilder stringBuilder = new StringBuilder(); List<Car> winners = track.getWinnerCars(); String victoryMessage = winners.stream().map(n -> String.valueOf(n.getName())) .collect(Collectors.joining(", ")); stringBuilder.append(victoryMessage).append("가 최종 우승했습니다."); System.out.println(stringBuilder); }
Java
복사

코드 구성

작성코드

후기

오늘은 자동차 경주 우승자 4단계를 실행하게 되었다. 일급컬렉션, 원시값 포장에 대해 알 수 있었고, 사용하게 되면 테스트 코트를 구현하기도 좋고, 관리하는 측면에서도 도움이 많이 될 것 이라고 생각하였다. 인지하고, 잘 활용할 수 있도록 노력해야 겠다.
깃허브 링크
4467
pull
출처