작을수록 좋다. 일반적으로 15줄을 초과하지 말자.
블록 -> 한 줄(대개 여기서 함수 호출)
들여쓰기 -> 2단 이하
함수 이름 아래에서 추상화 수준이 한 단계만 수행해야 한다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 나온다(내려가기 규칙).
추상 팩토리에 숨겨 다형성 객체를 생성하라.
❌testableHTML -> ✅SetupTeardownIncluder.render
includeSetupAndTeardownPages, includeSetupPages, includesSuiteSetupPage, includeSetupPage
-최선: 0개
-차선: 1개
아래 세 가지 경우가 아니라면 단항 함수는 가급적 피한다.
인수에 질문을 던지는 경우(ex. boolean fileExists('MyFile'))
인수를 변환해 결과를 반환하는 경우
이벤트 함수
true면 이걸 하고 false면 저걸 하라는 말이므로 함수가 한 가지 일을 하지 않는다. 함수는 한 가지 일을 해야하므로 플래그 인수는 지양하자.
플래그 -> boolean 값
ex. render(true)
단항 함수로 만들어라.
예외. Point p = new Point(0, 0) -> 직교 좌표계 점처럼 이항이 자연스러운 경우
신중히 고려하라. 함수를 볼 때마다 순서, 주춤, 무시로 야기되는 문제가 증가한다.
인수가 2~3개가 필요하다면 일부를 독자적인 클래스 변수로 선언할 수 있는지 검토한다.
❌Circle makeCircle(double x, double y, double radius);
✅Circle makeCircle(Point center, double radius);
가변 인수를 전부 동등하게 취급하여 List 형 인수 하나로 취급한다.
-단항함수는 함수와 인수가 동사/명사 쌍을 이뤄야 한다.
✅write(name)
✅writeField(name)
-함수 이름에 인수 추가
❌assertEquals(expected, actual)
-> ✅assertExpectedEqualsActual(expected, actual)
부수 효과는 함수는 한 가지를 하겠다고 약속하고선 남몰래 다른 짓도 하는 거짓말이다. 함수를 쪼개거나 이름에 두 가지 일을 한다고 명시하라.
일반적으로 출력 인수는 피해야 한다. 출력 인수 대신 this를 사용하라.
함수는 뭔가를 수행하거나, 뭔가를 답하거나 둘 중 하나만 해야 한다.
// <명령과 조회를 분리하지 않은 경우>
// 함수 이름이 attribute인 속성을 찾아 값을 value로 설정한 후 성공하면 true, 실패하면 false를 반환하는 함수
public boolean set(String attribute, String value);
// username이 unclebob이면 true인지, username이 unclebob으로 설정하는 것에 성공하면 true인지 모호
if(set("username", "unclebob"))
// <명령과 조회를 분리한 경우>
if (attributeExists("username")) {
setAttribute("username", "unclebob")
...
}
//수정 전
if(조건) {
if(조건) {
실행 코드
} else {
오류 처리 코드1
}
} else {
오류 처리 코드2
}
//수정 후
try {
실행 코드
}
catch{//예외로 넣어 줌
오류 처리 코드1
오류 처리 코드2
}
try/catch 블록을 하나의 함수 안에 넣어라.
//수정 후
함수이름 () {
try {
실행 함수()
}
catch {
오류 처리 함수()
}
}
실행 함수 이름 () {}
오류 처리 함수 이름 () {}
오류를 처리하는 함수는 오류만 처리해야 한다. try로 시작하면 catch/finally 문으로 끝나야 한다.
오류 코드 대신 예외를 사용하면 새 예외는 Exception 클래스에서 파생되므로 재컴파일/재배치 없이도 새 예외 클래스 추가가 가능하다.
알고리즘이 중복되면 하나만 변해도 여러 군데를 수정해야 한다. 반복은 최대한 피하라.
-에츠허르 데이크스트라의 구조적 프로그래밍 원칙
: 모든 함수와 함수 내 모든 블록에 입구와 출구가 하나만 존재해야 함.
return -> 함수 당 하나
루프 안 -> break, continue, goto❌
-저자의 생각하는 예외를 두어도 괜찮은 경우: 함수가 작을 경우
return, break, cotinue -> 여러 차례 사용 가능
goto -> 큰 함수에서만 의미 있으므로 작은 함수에서는 피해야 함
글짓기와 비슷하다. 여러 차례의 수정을 거쳐야 한다.