이 글의 개념 및 코드들은 책을 읽으며 정리한 내용을 바탕으로 작성하였습니다.
신문 기사를 떠올려보자.
독자는 위에서 아래로 기사를 읽는다.
최상단에 기사를 몇 마디로 요약하는 표제가 나온다.
독자는 표제를 보고서 기사를 읽을지 말지 정한다.
첫 문단은 전체 기사 내용을 요약한다.
세세한 사실은 숨기고 커다란 그림을 보여준다.
쭉 읽으며 내려가면 세세한 사실이 조금씩 나온다.
2019에 내가 추천서를 가장 많이 인입했던 사람으로 상을 받았다.
(= 2019 Received Referral AWARDS in LINE Corparation )
놀랍고도 신기하고 신선하고 재미난 소식이다.
이 글의 개념 및 코드들은 책을 읽으며 정리한 내용을 바탕으로 작성하였습니다.
함수의 의도나
인수의 순서와 의도를 제대로 표현하려면
함수 이름을 좋게 Naming할 필요가 있다.
이 글의 개념 및 코드들은 책을 읽으며 정리한 내용을 바탕으로 작성하였습니다.
명령 함수에서 오류 코드를 반환하는 방식은
명령 / 조회 분리 규칙을
미묘하게 위반한다.
if (deletePage(page) == OK)
위 코드는 여러 단계로 중첩되는 코드를 야기한다.
오류 코드를 반환하면
호출자는 오류 코드를 곧바로 처리해야한다는 문제에 부딪힌다.
if (deletePage(page) == OK) {
if (registry.deleteReference(page.name) == OK) {
if (configKeys.deleteKey(page.name.makeKey()) == OK) {
logger.log("page deleted");
} else {
logger.log("configKey nott deleted");
}
} else {
logger.log("deleteReference from registry failed");
}
} else {
logger.log("delete failed");
return E_ERROR;
}
오류 코드 대신
예외를 사용하면
오류 처리 코드가
원래 코드에서 분리되어 코드가 깔끔해진다.
try {
deletePage(page);
registry.deleteReference(page.name);
configKyes.deleteKey(page.name.makeKey());
} catch (Exception e) {
logger.log(e.getMessage());
}
이 글의 개념 및 코드들은 책을 읽으며 정리한 내용을 바탕으로 작성하였습니다.
함수는 뭔가를 수행하거나
뭔가에 답하거나
둘 중에 하나만 해야한다.
public boolean set(String attribute, String value);
이 함수는 이름이 attribute인 속성을 찾아
값을 value로 설정한 후
성공하면 true를 반환
실패하면 flase를 반환한다.
if (set("userName", "goodGid"))
userName이 goodGid으로 설정되어 있는지 확인하는 코드인가?
userName을 goodGid로 설정하는 코드인가?
이 글의 개념 및 코드들은 책을 읽으며 정리한 내용을 바탕으로 작성하였습니다.
Try/Catch 블록을
별도 함수로 뽑아내면
코드가 깔끔해진다.
Before
public void delete(Page page) {
try {
deletePage(page);
registry.deleteReference(page.name);
configKyes.deleteKey(page.name.makeKey());
} catch (Exception e) {
logger.log(e.getMessage());
}
}
After
public void delete(Page page) {
try {
deletePageAndAllReferences(page);
} catch (Exception e) {
logError(e);
}
}
private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page);
registry.deleteReference(page.name);
configKyes.deleteKey(page.name.makeKey());
}
private void logError(Exception e) {
logger.log(e.getMessage());
}
실제로 페이지를 제거하는 함수는 deletePageAndAllReferences이다.
deletePageAndAllReferences 함수는 예외를 처리하지 않는다.
예외 처리는 logError 함수가 담당한다.
이렇게 정상 동작과 오류 처리 동작을 분리하면
코드를 이해하고 수정하기 쉬워진다.