장's 개발생각

[개발생각] 클린 코드, TDD를 위한 공부

장아장 2022. 10. 20. 23:30

사실 이 영상을 보고 조금 더 메서드를 세분화 시켜야겠다는 생각이 들었다. https://www.youtube.com/watch?v=bIeqAlmNRrA 

 

수많은 스프링 로드맵에서 항상 TDD가 언급되어 있다. 

테스트를 기반으로 코딩을 이어나간다라는 간단한 개념은 이해가 되었다.

 

궁금해서 더 찾아보니 JUnit을 사용해 유닛단위의 테스트를 하고, 이를 위해 유닛 단위로 코드를 더욱 세분화 시켜야 할 필요가 있음을 느꼈다. 여태까지 알고리즘은 물론, 스프링을 공부할 때에도 하드코딩을 더욱 했던 것 같다. 

오히려 하나의 로직은 하나의 메서드로 구현한다고 생각했다. 

 

제일 큰 문제는, 에러가 날 때 어디가 에러인지 모르고, 중간에 수정을 해야할 때, 어디를 건드려야 할지 모른다는 것이다. 

안다 하더라도, 똑같은 부분이 상당히 많아 그 부분들을 전부 수정해주는 문제가 있었다. 

 

이를 통해 최근엔 원래 있던 코드의 메소드도 유닛단위로 쪼개는 연습을 하고있다. 

(유닛단위로 쪼개지 않은 예시 - 백준의 벽 부수고 이동하기 문제)

public static void bfs(){
    Queue<Location> queue = new LinkedList<>();
    queue.add(new Location(1, 1, 1, false));
    visited[1][1][0] = true;
    while(!queue.isEmpty()){
        Location now = queue.poll();
        if(now.x == N && now.y == M) {
            System.out.println(now.count);
            return;
        }
        for(int i=0; i<4; i++){
            int newX = x_case[i] + now.x;
            int newY = y_case[i] + now.y;
            if(newX == 0 || newY == 0 || newX > N || newY > M)continue;
            int newCount = now.count+1;
            if(arr[newX][newY] == 0){
                if(!now.wall_broken && !visited[newX][newY][0]){
                    queue.add(new Location(newX, newY, newCount, false));
                    visited[newX][newY][0] = true;
                }
                else if(now.wall_broken && !visited[newX][newY][1]){
                    queue.add(new Location(newX, newY, newCount, true));
                    visited[newX][newY][1] = true;
                }
            }
            else if(arr[newX][newY] == 1 && !visited[newX][newY][1]){
                if(!now.wall_broken){
                    queue.add(new Location(newX, newY, newCount, true));
                    visited[newX][newY][1] = true;
                }
            }
        }
    }
    System.out.println("-1");
}

사실, 이걸 보면 더 막막하다. 심지어 이런 걸 블로그에 올리고 있었는데, 이런 것이 오히려 보는 사람들 입장에선 어렵게 느껴지지 않을까 라는 생각도 들었다. 

 

블로그를 통해 사람들과 더 나은 코드 만드는 법을 이야기해보고 싶었는데... 코드부터 보기 싫다!

 

그래서 유닛 단위로 코딩하는 연습을 시작했다. (프로그래머스 문제, 현재 진행형)

public int getMaximumPeople(int[] zeros, int[] left){
    int max = 0;
    for(int i=0; i<zeros.length; i++){
        max = Math.max(max, countTotal(getCases(i, left)));
    }
    return max;
}

public int countTotal(int[] thisCase){
    int count = 0;
    for(int x : thisCase){
        if(x>0) count++;
    }
    return count;
}

public int[] getCases(int i, int[] left){
    int[] thisCase = new int[left.length];
    for(int j=0; j<left.length; j++){
        thisCase[j] = checkCase(i, j);
    }
    return thisCase;
}

public int checkCase(int x, int y){
    if(y-1 == x || y + 1 == x){
        return 1;
    }
    return 0;
}

일단 내 코드를 내가 봐도 뭐가 뭔지 딱 알 수 있어서 만족스럽다. 

 

그리고, 중간중간 무엇이 문제인지 아직 JUnit을 사용해서 보진 못했지만 로그를 통해서 문제가 무엇인지 파악하면서 과정을 넘어갈 수 있다는게 마음에 들었다. 

( 별의 커비를 한단계씩 깨는 기분이랄까..)

 

조금 더 깔끔한 코드, 조금 더 명확하게 가시적인 코드를 만드는 것을 목표로 더 생각해봐야겠다.