오늘은 3.5<구현 결정 설명하기> 를 진행한다.
구현을 할 때 코딩에서 어려운 결정을 내려야 할 때가 있다.
객관적으로 옮거나 그른 것이 없는 상황, 장점과 단점이 모두 있는 상황이다.
바로 이럴 때 주석이 필요하다.
예제 코드를 보자면,
class Inventory {
private List<Supply> list = new ArrayList<>();
void add(Supply supply) {
list.add(supply);
Collection.sort(list);
}
boolean isInStock(String name) {
// 빠른 구현
return Collection.binarySearch(list, new Supply(name)) != -1;
}
}
=> (나는 딱 이 코드를 봤을 때 이진검색 알고리즘을 구현해봤음에도 불구하고 바로 깨닫지 못했다.)
프로그래머가 왜 이진검색을 쓰기로 결정했는지 '빠른 구현' 이라는 주석이 있긴하지만
이 방법에 '네' 라고 대답했다는 것은 다른 대답에는 '아니오' 라고 대답한 것이라고 한다.
그렇다면!
주석이 이 타당함을 잘 설명해주고 있나?
이 코드는 왜 빠른가?
이러한 질문들에 대하여 주석이 잘 설명해주고 있나?
아니다.
그러면 어떻게 향상시킬 수 있을까?
class Inventory {
// 리스트를 정렬된 채로 유지한다. isInStock()을 참고한다.
private List<Supply> list = new ArrayList<>();
void add(Supply supply) {
list.add(supply);
Collection.sort(list);
}
boolean isInStock(String name) {
/*
* 재고가 남았는지 재고명으로 확인해야 한다면,
* 재고가 천 개 이상일 때 심각한 성능 이슈에 직면한다.
* 1초 안에 항목을 추출하기 위해
* 비록 재고를 정렬된 채로 유지해야 하지만
* 이진 검색 알고리즘을 쓰기로 결정한다.
*/
return Collection.binarySearch(list, new Supply(name)) != -1;
}
}
보통 이런 주석 관례는 팀 마다의 컨벤션에 따라 다르다.
이러한 컨벤션을 사용해 주석을 기술하면 주요 측면에 빠지는 경우가 거의 없다고 한다.
미리 정의된 구조를 따르기 때문에 동료 개발자가 주석을 이해하기도 쉽다.
오늘의 코멘트: 마침 오늘도 예전에 팀원분께서 구현해주신 코드를 보는데 이전과 많이 달라져있어 다시 여쭤봤다.
주석이 있었다면 좋았겠다고 생각했다. 내가 넣어야지~~