[독서 기록-Clean Code] 3장. 함수

소이뎁·2022년 12월 4일
0

1.작게 만들어라

작을수록 좋다. 일반적으로 15줄을 초과하지 말자.

2.블록과 들여쓰기

블록 -> 한 줄(대개 여기서 함수 호출)
들여쓰기 -> 2단 이하

3.한 가지만 해라! (=함수 당 추상화 수준은 하나로!)

함수 이름 아래에서 추상화 수준이 한 단계만 수행해야 한다. 한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 나온다(내려가기 규칙).

4.Switch문

추상 팩토리에 숨겨 다형성 객체를 생성하라.

5.서술적인 이름을 사용하라

❌testableHTML -> ✅SetupTeardownIncluder.render

6.일관성

includeSetupAndTeardownPages, includeSetupPages, includesSuiteSetupPage, includeSetupPage

7.함수 인수

-최선: 0개
-차선: 1개

1)많이 쓰는 단항 형식(하나의 인수를 취하는 것)

아래 세 가지 경우가 아니라면 단항 함수는 가급적 피한다.

인수에 질문을 던지는 경우(ex. boolean fileExists('MyFile'))
인수를 변환해 결과를 반환하는 경우
이벤트 함수

2) 플래그 인수 지양

true면 이걸 하고 false면 저걸 하라는 말이므로 함수가 한 가지 일을 하지 않는다. 함수는 한 가지 일을 해야하므로 플래그 인수는 지양하자.
플래그 -> boolean 값
ex. render(true)

3) 이항 함수

단항 함수로 만들어라.
예외. Point p = new Point(0, 0) -> 직교 좌표계 점처럼 이항이 자연스러운 경우

4) 삼항 함수

신중히 고려하라. 함수를 볼 때마다 순서, 주춤, 무시로 야기되는 문제가 증가한다.

5) 인수 객체

인수가 2~3개가 필요하다면 일부를 독자적인 클래스 변수로 선언할 수 있는지 검토한다.
❌Circle makeCircle(double x, double y, double radius);
✅Circle makeCircle(Point center, double radius);

6) 인수 목록

가변 인수를 전부 동등하게 취급하여 List 형 인수 하나로 취급한다.

7) 동사와 키워드

-단항함수는 함수와 인수가 동사/명사 쌍을 이뤄야 한다.
✅write(name)
✅writeField(name)
-함수 이름에 인수 추가
❌assertEquals(expected, actual)
-> ✅assertExpectedEqualsActual(expected, actual)

8.부수 효과를 일으키지 마라

부수 효과는 함수는 한 가지를 하겠다고 약속하고선 남몰래 다른 짓도 하는 거짓말이다. 함수를 쪼개거나 이름에 두 가지 일을 한다고 명시하라.

1) 출력 인수

일반적으로 출력 인수는 피해야 한다. 출력 인수 대신 this를 사용하라.

9.명령과 조회를 분리하라

함수는 뭔가를 수행하거나, 뭔가를 답하거나 둘 중 하나만 해야 한다.

// <명령과 조회를 분리하지 않은 경우>
// 함수 이름이 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")
    ...
}

10.오류 코드보다 예외를 사용하라

//수정 전
if(조건) {
	if(조건) {
    	실행 코드
    } else {
    	오류 처리 코드1
    }
} else {
	오류 처리 코드2
}

//수정 후
try {
	실행 코드
}
catch{//예외로 넣어 줌
	오류 처리 코드1
    오류 처리 코드2
}

1) try/catch 블록 뽑아내기

try/catch 블록을 하나의 함수 안에 넣어라.

//수정 후
함수이름 () {
	try {
    	실행 함수()
    }
    catch {
    	오류 처리 함수()
    }
}

실행 함수 이름 () {}

오류 처리 함수 이름 () {}

2) 오류 처리도 한 가지 작업이다

오류를 처리하는 함수는 오류만 처리해야 한다. try로 시작하면 catch/finally 문으로 끝나야 한다.

3) Error.java 의존성 자석

오류 코드 대신 예외를 사용하면 새 예외는 Exception 클래스에서 파생되므로 재컴파일/재배치 없이도 새 예외 클래스 추가가 가능하다.

11.반복하지 마라

알고리즘이 중복되면 하나만 변해도 여러 군데를 수정해야 한다. 반복은 최대한 피하라.

12.구조적 프로그래밍

-에츠허르 데이크스트라의 구조적 프로그래밍 원칙
: 모든 함수와 함수 내 모든 블록에 입구와 출구가 하나만 존재해야 함.
return -> 함수 당 하나
루프 안 -> break, continue, goto❌

-저자의 생각하는 예외를 두어도 괜찮은 경우: 함수가 작을 경우
return, break, cotinue -> 여러 차례 사용 가능
goto -> 큰 함수에서만 의미 있으므로 작은 함수에서는 피해야 함

13.함수 짜는 법

글짓기와 비슷하다. 여러 차례의 수정을 거쳐야 한다.

0개의 댓글