명령과 조회를 분리해야한다.
함수 수행시 명령과 조회를 동시에 하게 되면 혼란을 초래해
코드 확인시 해석이 어려울수 있다.
public boolean set(String attribute, String value);
if (set("username", "userA"))
attribute인 속성값을 찾아 value로 설정한 후
성공-true 실패 - false 반환 코드이다.
코드를 해석하는 입장에서는 "username" 이 "userA"으로 설정된건지 확인하는 코드인지
아니면 "username"을"userA"로 설정하는 코드인지 혼란이 온다.
"set" 이라는 단어가 동사인지 형용사인지 분간하기 힘들기 때문이다.
해결책은 코드를 명령과 조회를 분리해서 짜는 방법이 있다 .
if (attributeExists("username")) {
setAttribute("username", "userA");
...
}
이렇게 되면 username 을 userA로 설정하는데 성공하면.. 으로 해석이 가능하다.
--------------------------------------
오류 코드보다 예외를 사용하자
if (deletePage(page) = E_OK) {
if (registry.deleteReference(page.name) = E_OK) {
if (configKeys.deleteKey(page.name.makeKey()) = E_OK){
logger.log("page deleted");
} else {
logger.logC'configKey not deleted");
}
} else {
logger.logC'deleteReference from registry failed");
}
} else {
logger.log("delete failed");
return E_ERR0R;
}
위 코드는 여러 단계로 중첩되는 코드를 불러일으킨다.
----------------------------------------
반면 오류코드 대신 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리되어 깔끔해진다.
try {
deletePage(page);
registry.deleteReference(page.name);
configKeys.deleteKey(page.name.makeKey());
}
catch (Exception e) {
logger.log(e.getMessage());
}
try/catch 블록은 정상 동작과 오류 처리 동작을 뒤섞어서
별도 함수로 뽑아내는 편이 좋다.
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);
configKeys.deleteKey(page.name.makeKey());
}
private void logError(Exception e) {
logger.log(e .getMessage());
}
delete함수는 모든 오류를 처리하도록 만들었다.
실제로 페이지 제거를 하는 함수는 deletePageAndAllReferences 다.
이 함수는 예외를 처리하지 않는다.
참고한 책
클린 코드 (Clean Code)
'CleanCode' 카테고리의 다른 글
Clean Code 짜기6 (0) | 2019.10.24 |
---|---|
Clean Code 짜기5 (0) | 2019.10.24 |
Clean Code 짜기3 (0) | 2019.10.21 |
Clean Code 짜기2 (0) | 2019.10.21 |
Clean Code 짜기 1 (0) | 2019.10.13 |