Jolly Jumpers

안녕하세요!! 김용준입니다.

Jolly Jumpers를 구하는 프로그램을 만들었습니다.
사용한 언어는 Java이고 IDE는 IntelliJ입니다.

코드 레벨에서의 제약


아샬님과의 고민 상담을 통해 설정된 제 스스로의 ‘훈련 목표’는 다음과 같습니다.

1. 메서드 하나가 8줄이 넘지 않게 하자.

2. else를 쓰지 말자.


개발과정


단위 테스트 코드는 다음과 같이 작성했습니다.

    @Test
    public void IsJolly() {
        assertEquals("Jolly", math.IsJolly("4 1 4 2 3"));
        assertEquals("Jolly", math.IsJolly("1 1"));
        assertEquals("Not jolly", math.IsJolly("2 1 4"));
        assertEquals("Jolly", math.IsJolly("3 -6 -5 -7"));
        assertEquals("Not jolly", math.IsJolly("4 1 1 3 2"));
        assertEquals("Not jolly", math.IsJolly("5 1 4 2 -1 6"));
        assertEquals("Jolly", math.IsJolly("6 11 7 4 2 1 6"));
    }

전체 소스는 여기를 가시면 볼 수 있습니다.

피드백 반영


if 문을 쓰면 최소 3줄이 된다고 생각해야 한다는 피드백을 받았습니다.
이 9줄짜리 메서드를 ‘훈련 목표’에 맞게 수정할 것입니다.

private static int[] setDiff(int[] numbers, int[] diff) {
        int absSub = 0;
        for(int i=0; i < numbers.length - 1; i++) {
            absSub = Math.abs(numbers[i] - numbers[i+1]);
            if(absSub > numbers.length) {
                continue;
            }
            diff[absSub]++;
        }
        return diff;
    }

SRP(단일 책임 원칙)을 생각해 보았을 때 setDiff 메서드는 2가지 책임이 있다고 생각했습니다.

  1. 인접한 수의 절대 차이 값이 Jolly Jumper를 만족하는 유효한 수 인지 확인하는 책임
  2. 인접한 수의 절대 차이 값이 인덱스가 되는 diff배열에 그 수를 담는 책임

1번 책임 + 직접 유효한 수를 반환하는 메서드를 만들었습니다.

    private static int[] setDiff(int[] numbers, int[] diff) {
        for(int i=0; i < numbers.length - 1; i++) {
            diff[getValidNumber(numbers.length, Math.abs(numbers[i] - numbers[i+1]))]++;
        }
        return diff;
    }

    private static int getValidNumber(int numbersLength, int absSub) {
        if(absSub <= numbersLength)
            return absSub;
        return 0;
    }

느낀점


  • 단위 테스트를 사용하여 개발할수록 여러 예외 케이스를 테스트하기 정말 편하다는 생각을 했습니다.
  • 좀 더 편하게 개발하거나 테스트하기 위해서 어떻게 만들어야 할지 고민하는 시간을 가질 수 있어 좋았습니다.
  • 보기 좋은 소스코드를 만드는 게 그만큼 힘들다는 것 또한 느꼈습니다.
  • GIT에 메서드 구현 시마다 commit을 했어야 했는데 못했습니다.
    할 생각조차 못 하고 다 완성하고 나서야 생각났습니다. 반성해야 할 부분입니다.


배운점




앞으로의 계획


  • 피드백을 받는대로 로직을 수정할 계획입니다.

피드백


  • 아샬님 피드백 : 라인을 줄이기 위해 if문을 한 줄로 만드는 건 좋지 않습니다.
    if문을 쓰면 최소 3줄이 된다고 생각하셔야 합니다.
     if (조건) {
         처리;
     }
    
  • 이 상황에서 라인을 줄이려면 근본적으로 다른 전략(이라고 해도 대부분 extract method)이 필요합니다.

참고자료