* 일반
G21. 알고리즘을 이해하라
- 대다수 괴상한 코드는 사람들이 알고리즘을 충분히 이해하지 않은 채 코드를 구현한 탓이다
잠시 멈추고 실제 알고리즘을 고민하는 대신 여기저기 if문과 플래그를 넣어보며 코드를 돌리는 탓이다
프로그래밍은 흔히 탐험이다 알고리즘을 안다고 생각하지만 실제는 코드가 '돌아갈' 때까지 이리저리 찔러보고 굴려본다.
'돌아간다'는 사실은 어떻게 아느냐고? 생각할 수 있는 테스트 케이스를 모두 통과하니까
이 방식이 틀렸다는 말이 아니다 사실상 대다수 상황에서는 원하는 대로 함수를 돌리는 유일한 방법이다
하지만 '돌아간다'고 말하기는 뭔가 부족하다
구현이 끝났다고 선언하기 전에 함수가 돌아가는 방식을 확실히 이해하는지 확인하라
테스트 케이스를 모두 통과한다는 사실만으로 부족하다 작성자가 알고리즘이 올바르다는 사실을 알아야 한다
알고리즘이 올바르다는 사실을 확인하고 이해하려면 기능이 뻔히 보일 정도로 함수를 깔끔하고 명확하게 재구성하는 방법이 최고다
G22. 논리적 의존성은 물리적으로 드러내라
- 한 모듈이 다른 모듈에 의존한다면 물리적인 의존성도 있어야 한다 논리적인 의존성만으로는 부족하다
의존하는 모듈이 상대 모듈에 대해 뭔가를 가정하면 안된다
의존하는 모든 정보를 명시적으로 요청하는 편이 좋다
예를 들어, 근무 시간 보고서를 가공되지 않은 상태로 출력하는 함수를 구현한다고 가정하자
HourlyReporter 라는 클래스는 모든 정보를 모아 HourlyReportFormatter에 적당한 형태로 넘긴다
HourlyreportFormatter는 넘어온 정보를 출력한다
public class HourlyReporter {
private HourlyReportFormatter formatter;
private List<LineItem> page;
private final int PAGE_SIZE = 55;
public HourlyReporter(HourlyReportFormatter formatter) {
this.formatter = formatter;
page = new ArrayList<LineItem>();
}
public void generateReport(List<HourlyEmployee> employees) {
for (HourlyEmployee e : employees) {
addLineItemToPage(e);
if (page.size() == PAGE_SIZE)
printAndClearItemList();
}
if(page.size() > 0)
printAndClearItemList();
}
public void printAndClearItemList() {
formatter.format(page);
page.clear();
}
private void addLineItemToPage(HourlyEmployee e) {
LineItem item = new LineItem();
item.name = e.getName();
item.hours = e.getTenthsWorked() / 10;
item.tenths = e.getTenthsWorked() % 10;
page.add(item);
}
public class LineItem {
public String name;
public int hours;
public int tenths;
}
}
위 코드는 논리적인 의존성이 존재한다 무엇인지 알겠는가? 바로 PAGE_SIZE 라는 상수다
어째서 HourlyReporter 클래스가 페이지 크기를 알아야 하는가?
페이지 크기는 HourlyReportFormatter 가 책임질 정보다
PAGE_SIZE 를 HourlyReport 클래스에 선언한 실수는 잘못 지운 책임에 해당한다
HourlyReporter 클래스는 HourlyReportFormatter가 페이지 크기를 알 거라고 가정한다
바로 이 가정이 논리적 의존성이다
HourlyReporter 클래스는 HourlyReportFormatter 클래스가 페이지 크기 55를 처리할 줄 안다는 사실에 의존한다
만약 HourlyReportFormatter 구현 중 하나가 페이지 크기를 55를 제대로 처리하지 못한다면 오류가 생긴다
HourlyReportFormatter 에 getMaxPagesize() 라는 메서드를 추가하면 논리적인 의존성이 물리적인 의존성으로 변한다
HourlyReporter 클래스는 PAGE_SIZE 상수를 사용하는 대신 getMaxPageSize() 함수를 호출하면 된다
댓글