3장 함수(이어서)

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문으로 끝나야 한다