Search
Duplicate
🧹

책 ‘클린 코드’를 읽고 C언어로 작성한 퀵소트 리팩토링 하기

간단소개
클린 코드를 적용시켜보자!
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
개발지식
태그
Scrap
8 more properties
이전에 배열 주소와 크기를 인자로 받아서 퀵소트 알고리즘으로 정렬하는 코드를 작성했다.
책 '클린 코드'에서 배운 교훈을 적용해서 리팩토링 해보았다.

1. 클린 코드에서 얻은 가르침 3가지

이름_의도를 분명히 밝혀라(명확한 이름)
함수_서술적인 이름을 사용하라!
함수_작게 만들어라!

2. 코드 고치기

고치기 전의 코드

void set_array_quick_sorted(int *array, int size) { int pivot = array[size / 2]; int tmp; int i = 0; int j = size - 1; while (i < j) { while (array[i] < pivot) i++; while (array[j] > pivot) j--; if (i >= j) break ; tmp = array[i]; array[i] = array[j]; array[j] = tmp; } if (size > 2) { int index_pivot = -1; int tmp_size; while (tmp_size--) { if (array[++index_pivot] == pivot) break ; } set_array_quick_sorted(array, index_pivot); set_array_quick_sorted(&(array[index_pivot]), size - index_pivot); } }
C

고친 이후의 코드

static void swap_array_indexes(int *array, int idx_front, int idx_behind) { int tmp; tmp = array[idx_front]; array[idx_front] = array[idx_behind]; array[idx_behind] = tmp; } static void partition_array_by_pivot(int *array, int size, int val_pivot) { int idx_front; int idx_behind; idx_front = 0; idx_behind = size - 1; while (idx_front < idx_behind) { while (array[idx_front] < val_pivot) idx_front++; while (array[idx_behind] > val_pivot) idx_behind--; if (idx_front >= idx_behind) break ; swap_array_indexes(array, idx_front, idx_behind); } } static int get_index_pivot(int *array, int pivot, int size) { int ret_index; ret_index = -1; while (size--) if (array[++ret_index] == pivot) break ; return (ret_index); } void set_array_quick_sorted(int *array, int size) { int value_pivot; int index_pivot; value_pivot = array[size / 2]; partition_array_by_pivot(array, size, value_pivot); if (size > 2) { index_pivot = get_index_pivot(array, value_pivot, size); set_array_quick_sorted(array, index_pivot); set_array_quick_sorted(&(array[index_pivot]), size - index_pivot); } }
C

3. 고려한 사항들

1) 함수를 쪼개고 분리하여 작게 만들었다.
2) 더 작게 쪼개어 추상화된 함수의 이름을 서술적으로 나타냈다.
3) 좀 더 명확한 이름으로 나타내고자 값을 서로 비교하는 인덱스에 각각 front와 behind를 붙였다.
3-1) 인덱스에 front나 behind를 붙여서 길게 만드는게 마음에 걸렸지만 퀵소트는 특수한 경우이므로 명확하게 작성했다.

4. 좀 더 생각해 볼 것들

1) size가 2보다 클 때 실행되는 코드들을 더 작게 추상화해서 나타내야할지 고민이다.
2) get_index_pivot 함수에서 return할 변수 이름을 선언할 때 앞에 ret 을 붙였다. 독자에게 미리 return할 변수를 알려주는 목적으로 넣었는데 어떻게 받아들일지 확실치 않다. 내가 읽어보기에는 ret이 붙은 변수를 더 주의깊게 보게되고 다시 위로 올라가서 변수를 확인하지 않아도 되어서 편했다. 독자들의 피드백을 직접적으로 받아보면서 최적화해야겠다.(맞으면서 배워야지)

※ 참고자료