오류 코드 대신 예외 사용하기
명령 함수에서 오류 코드를 반환하는 형태의 처리는 명령/조회 분리 규칙을 모호하게 위반할 수 있다.
왜냐하면 if문에서 명령을 표현식으로 사용하기 쉬운 구조가 되기 때문이다.
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 not deleted");
}
}else{
logger.log("deleteReference from registry failed");
}
}else{
logger.log("delete failed");
return ERROR;
}
위와 같은 오류 코드 대신 예외 처리를 사용한다면 오류 처리 코드가 분리되므로 코드가 더 간결해진다.
try{
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}catch(Exception e){
logger.log(e.getMessage());
}
Try/Catch 블록 뽑아내기
여기서 추가로 try/catch 블록을 메소드로 묶어주는 게 좋다.
public void delte(Page page){
try{
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}catch(Exception e){
logger.log(e.getMessage());
}
}
private void deletePageAndAllReferences(Page page) throws Exception {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e){
lopgger.log(e.getMessage());
}
위와 같이 코드를 구분해서 정리하면 알아보기 한층 더 쉬워진다.
실제 페이지를 제거하는 함수는 deletePageAndAllReferences 이고 이 함수에서 직접적인 에러 처리 코드가 없어도 상관 없어진다.
오류처리도 하나의 작업
함수는 한 가지 작업만 담당해야만 한다.
오류 처리 또한 그 한 가지 작업에 해당하므로 위의 logError() 처럼 오류에 대한 처리만 해야 한다.
Error.java 의존성 자석
오류코드를 반환한다는 얘기는 클래스든 열거형 번수든 오류 코드가 어딘가 정의되어 있다는 뜻이다.
이러한 클래스는 import 해서 사용해야 하므로 만약 그 클래스에 변경사항이 생긴다면 해당 클래스를 사용하고 있는 모든 클래스 전부를 재 컴파일하고 재배치해야 하는 비용이 든다.
이런 부분을 개선하기 위해 오류 코드 대신 예외를 사용하면 새 예외는 Exception 클래스에서 파생되므로 아무런 부가 동작 없이 편리하게 예외처리가 가능하다.
'클린 코드' 카테고리의 다른 글
[클린 코드] 형식 맞추기(1) (0) | 2022.01.11 |
---|---|
[클린 코드] 주석(2) (0) | 2022.01.05 |
[클린 코드] 주석(1) (0) | 2022.01.04 |
[클린 코드] 함수(3) (0) | 2021.12.29 |
[클린 코드] 함수(1) (0) | 2021.12.27 |