사실 이 영상을 보고 조금 더 메서드를 세분화 시켜야겠다는 생각이 들었다. 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을 사용해서 보진 못했지만 로그를 통해서 문제가 무엇인지 파악하면서 과정을 넘어갈 수 있다는게 마음에 들었다.
( 별의 커비를 한단계씩 깨는 기분이랄까..)
조금 더 깔끔한 코드, 조금 더 명확하게 가시적인 코드를 만드는 것을 목표로 더 생각해봐야겠다.
'장's 개발생각' 카테고리의 다른 글
[개발생각] 우아한테크코스 5기 4주차 다리게임 회고 (0) | 2022.11.23 |
---|---|
[개발생각] 우아한테크코스 5기 3주차 로또 후기 (0) | 2022.11.18 |
[개발생각] 우아한테크코스 5기 2주차 숫자야구 후기 (0) | 2022.11.10 |
[개발생각] 우아한 테크코스 5기 1주차 온보딩 후기 (0) | 2022.11.03 |
[개발생각] (2022.10) 설명회를 다녀와서 (0) | 2022.10.13 |