<aside> ❓ 책에서 기억하고 싶은 내용을 써보세요.
</aside>
어떤 프로그램이든 가장 기본적인 단위는 함수
함수를 작게 만들어라!
함수는 한 가지만 해야 한다!
함수는 한 가지를 해야 한다. 그 한 가지를 잘 해야 한다. 그 한 가지만을 해야 한다.
함수 당 추상화 수준은 하나로!
서술적인 이름을 사용하라!
함수에서 인수는 적을수록 좋다!
fileExists(”MyFile”)
) 2)인수를 뭔가로 변환해 결과를 반환하는 경우(fileOpen(”MyFile”)
)
write(name)
assertEquals
→ assertExpectedEqualsActual(expected, actual)
부수 효과를 일으키지 마라!
부수 효과는 많은 경우 시간적인 결합과 순서 종속성을 초래한다.
시간적인 결합이 있는 함수는 특정 상황에서만 호출이 가능하다.
checkPassword
라는 함수 내부에서 세션을 초기화할 경우 이 함수는 세션을 초기화해도 괜찮은 경우에만 호출이 가능하다. 자칫 잘못 호출하면 의도하지 않게 세션 정보가 날아간다. → 시간적 결합이 필요하다면 checkPasswordAndInitializeSession
처럼 함수 이름에 명시하는 게 좋다.(하지만 이렇게 되면 함수가 ‘한 가지'만 한다는 규칙을 위반)출력 인수는 일반적으로 피해야 한다. 함수에서 상태를 변경해야 한다면 함수가 속한 객체 상태를 변경하는 방식을 택한다.
// Bad
public void appendFooter(StringBuffer report)
appendFooter(s)
// Good
report.appendFooter()
명령과 조회를 분리하라!
함수는 뭔가를 수행하거나(객체 상태를 변경) 뭔가에 답하거나(객체 정보를 반환) 둘 중 하나만 해야 하며 둘 다 하면 안된다.
// Bad
public boolean set(String attribute, String value);
if (set("username", "unclebob"))...
// Good
if (attributeExists("username")) {
setAttribute("username", "unclebob");
...
}
오류 코드보다 예외를 사용하라!
// Bad
if (deletePage(page) == E_OK)
// Good
try {
deletePage(page);
}
catch (Exception e) {
loggeError(e);
}
반복하지 마라!
⇒ 함수를 짜는 것은 글쓰기와 마찬가지.
처음에는 길고 복잡하다. 들여쓰기 단계도 많고 중복된 루프도 많다. 인수 목록도 아주 길다. 이름은 즉흥적이고 코드는 중복된다. 하지만 나는 그 서투른 코드를 빠짐없이 테스트하는 단위 테스트 케이스도 만든다. 그런 다음 나는 코드를 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거한다. 메소드를 줄이고 순서를 바꾼다. 때로는 전체 클래스를 쪼개기도 한다. 이 와중에도 코드는 항상 단위 테스트를 통과한다.
⇒ 프로그래밍 기술은 언제나 언어 설계의 기술. 언어라는 수단을 사용하여 시스템이라는 이야기를 풀어가는 데에 목표가 있다.
<aside> 📌 오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요
</aside>