GYUD-TECH

[우테코] 피드백 체크리스트 본문

후기

[우테코] 피드백 체크리스트

GYUD 2023. 11. 24. 14:29

프리코스를 진행하면서 받았던 피드백들과 나만의 규칙들을 기록하기 위한 체크리스트이다.

또한 다른 문제들을 풀어보면서 유용했던 API들을 계속 추가하면서 나만의 자바 코딩 체크리스트를 만들어 나갈 예정이다.

 


기능 명세서 작성법

1. 필요한 기능 목록을 자세하게 작성한다.

2. 필요한 객체를 떠올리고 객체에 책임을 할당한다.

3. 프로그램의 핵심 기능 목록을 생각하고, 핵심 기능 목록 먼저 순서대로 구현한다.

 

기능목록은 수정하면 되니 일단 기능 목록을 작성하고 구현하면서 업데이트 한다.

 

기능 명세서 작성에 너무 많은 시간이 걸리는 문제점이 있다.

최종 코딩테스트 대비를 위해 문제를 풀어보니 시간이 부족했는데 전체 흐름에 초점을 맞추어 흐름대로, 세부적으로 기능명세서를 작성하기 때문에 시간이 부족하다는 것을 알게 되었다.

말 그래돌 기능에만 초점을 맞추어 핵심 기능들을 명세 후 다 구현하고, 이를 연결하는 흐름코드는 추후에 작성하는 방식으로 앞으로 계속 연습할 것이다.

 

피드백 내용 체크리스트

1. 메서드 분리

- 모든 메서드는 한개의 역할만 수행한다.

- 메서드를 10줄 이하로만 허용한다.

- 메서드의 indent를 최대 2까지만 허용한다.

- else를 사용하지 않는다.

 

2. 객체의 분리

- 일급 컬렉션을 사용하여 객체의 역할을 할당한다.

- 객체의 인스턴스 변수의 필드를 최대한 줄인다.

- getter와 setter는 view를 제외하고는 사용하지 않는다.

 

3. 네이밍

- 변수명에 자료형은 사용하지 않는다.

- 변수와 메서드명 명확하게 작성한다.

1. 속성에 접근하는 메서드명의 접두사는 'get', 'set'을 사용한다.
2. 데이터를 조회하는 메서드명의 접두사는 'find'를 사용한다.
3. 데이터를 입력하는 메서드명의 접두사는 'input'을 사용한다.
4. 데이터를 변경하는 메서드명의 접두사는 'modify'를 사용한다.
5. 데이터를 삭제하는 메서드명의 접두사는 'delete'를 사용한다.
6. 데이터를 초기화하는 메서드명의 접두사는 'initialize'를 사용한다.
7. 반환 값의 타입이 boolean인 메서드명의 접두사는 'is'를 사용한다.
8. 데이터가 있는지 확인하는 메서드명의 접두사는 'has'를 사용한다.
9. 새로운 객체를 만든 뒤 해당 객체를 리턴해주는 메서드명의 접두사는 'create'를 사용한다.
10. 데이터를 다른 형태로 변환해주는 메서드명의 접두사는 'to'를 사용한다.
11. B를 기준으로 A를 하겠다는 의미가 강한 메서드명의 전치사는 'By'를 사용한다.

 

4. 상수 처리

- 연관성이 있는 상수는 enum 클래스로 모아서 표현한다.

- 매직 넘버, 매직 리터럴 사용하지 않는다.

- 모든 원시값과 문자열을 포장한다.

 

5. 예외처리

- 같은 예외처리는 한 곳에서 모아서 한다.

 

6. 테스트

- 작은 단위 테스트를 만든다.

- 우선 돌아가는 프로그램을 만들고 나서 테스트는 나중에 구현한다.

 

Java API 활용

여러 문자열 요소들을 하나로 결합해야 할 때: String.join("delimiter", Collection type 객체)

List<String> members = Arrays.asList("pobi", "jason");
String result = String.join(",", members); // "pobi,jason"

 

 

Stream에서 최대값을 구해야 할때: mapToInt().max().orElseThrow()

int farthestLocation = cars.stream()
                .mapToInt(Car::getLocation)
                .max()
                .orElseThrow(() -> new IllegalArgumentException());

stream이 비어있어서 최대값을 구할 수 없을때 orElseThrow로 예외처리

 

 

문자를 숫자로 변환할 때: Character.getNumericValue(char)

    private Integer toInteger(char guessNumber) {
        if (isInvalidRange(guessNumber)) {
            throw new IllegalArgumentException();
        }
        return Character.getNumericValue(guessNumber);
    }

getNumericValue 메서드는 char 매개변수가 정수로 변환이 되면 정수로 변환하고 아니면 -1을 반환한다.

Character.getNumericValue() 메서드는 아라비아 숫자(0~9) 뿐만 아니라 유니코드 숫자 문자(로마 숫자) 등도 모두 숫자로 바꾸어 주기 때문에 아라비아 숫자 0~9만 비교하고 싶다면 '0' ~ '9'로 유니코드로 직접 비교해야한다.

 

 

Map의 활용

private static final Map<Integer, Prize> rankWithPrize = Map.of(
            1, FIRST,
            2, SECOND,
            3, THIRD,
            4, FOURTH,
            5, FIFTH
    );

    public static Prize valueOfRank(int rank) {
        return rankWithPrize.getOrDefault(rank, NONE);
    }

Map을 선언할때 List.of() 처럼 Map.Of 로 해서 초기화와 선언을 동시에 해줄 수 있다.

또한 getOrDefault 메서드로 값을 가져오거나 없으면 default 값을 가져오도록 설정해 줄 수 있다.

 

 

Enum 클래스

for (WinningStatistic winningStatistic : WinningStatistic.values()) {
	System.out.printf(winningStatistic.getTemplate(), totalResults.get(winningStatistic.getIndex()));
}

Enum 클래스에서 .values() 메서드로 모든 상수들을 가져올 수 있다.

 

기능 단위 커밋 메시지 작성

https://gyuwon-tech.tistory.com/5

 

좋은 커밋 메시지 작성법

커밋을 세부 기능단위로 작성해야 하는 이유는 아래 2가지 라고 생각한다. 에러가 발생했을 때 세부 기능단위로 돌아갈 수 있다. 내가 지금 어느 부분을 코딩하고 있는지 명확하게 알 수 있다. 2

gyuwon-tech.tistory.com

 

 


참고자료

https://printf-hellojudyworld.tistory.com/63

 

프로젝트, 패키지, 메소드, 클래스 네이밍 규칙

다들 자바 프로젝트를 하면서 한번 쯤은 혹은 여전히 고민하고 계실 네이밍 규칙 Tip을 공유합니다. 공통 대소문자가 구분되며 길이에 제한이 없다. 예약어를 사용해서는 안 된다. 숫자로 시작해

printf-hellojudyworld.tistory.com