6 명령과 조회를 분리하라
함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야한다
→ 객체 상태를 변경 or 객체 정보를 반환 둘 중 하나만
public boolean set(String attribute, String value);
이 함수는 이름이 attribute인 속성을 찾아 값을 value로 설정한 후 성공하면 true를 반환하고, 실패하면 false를 반환한다.
코드를 읽는 사람 입장에서, username이 value로 설정되어 있는 지 확인하는 코드인지, username을 value로 설정하는 코드인지 의미가 모호하다.
이러한 문제를 해결하는 방법은 명령과 조회를 분리하는 것이다
if (attributeExists("username")) {
setAttribute("username", "unclebob");
}
7 오류 코드보다 예외를 사용하라
<aside> 💡 명령 함수에서 오류 코드를 반환하는 방식은 명령/조회 분리 규칙을 위반한다
</aside>
if (deletePage(page) == E_OK)
위 코드는 동사/형용사 혼란을 일으키지 않으나 여러 단계로 중첩된 코드다
오류 코드 대신 예외(try/catch)를 사용하면 오류 처리 코드가 원래 코드에서 분리되므로 코드가 깔끔해진다
public void delete(Page page) {
try {
deletePageAndAllReferences(page);
}
catch (Exception e) {
logError(e);
}
}
오류 처리도 한 가지 작업이다. 함수 키워드가 try로 시작한다면 함수는 catch/finally문으로 끝나야 한다