클린코드 3장

3장 함수

의도를 분명히 표현하는 함수를 어떻게 구현할 수 있을까? 함수에 어떤 속성을 부여해야 처음 읽는 사람이 프로그램 내부를 직관적으로 파악할 수 있을까?

작게 만들어라

중첩 구조가 생길만큼 함수가 커져서는 안된다. 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안된다. if문, while문 안에 들어가는 코드가 길어질거 같다면 함수로 쪼개자

한 가지만 해라

함수는 한 가지만 해야 한다. '한가지' 의 기준이 좀 모호한데... 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 한다고 봐도 된다.

함수 당 추상화 수준은 하나로

추상화 수준이 높은 함수랑 추상화 수준이 낮은 함수랑 막 섞어쓰지 말자.

내려가기 규칙
한 함수 다음에는 추상화 수준이 한 단계 낮은 함수가 온다. 즉, 위에서 아래로 프로그램을 읽으면 함수 추상화 수준이 한 번에 한 단계씩 낮아진다.

Switch 문

스위치문은 작게 만들기 어렵다. 각 스위치문을 저차원 클래스에 숨기면 좀 더 효율적으로 짤 수 있다. 다형성을 이용한다.

※다형성
다형성이란 같은 자료형에 여러 가지 객체를 대입하여 다양한 결과를 얻어내는 성질을 의미한다.

뭐 이런 구조가 있다 치면..Man은 People로 표현할 수 있고, Woman도 People로 표현할 수 있다. 이런 식으로 하면 하나의 타입으로 다양한 실행 결과를 얻을 수 있으며 객체를 부품화하여 유지 보수를 용이하게 한다.

swtich(r.type){
	case 1:
    	return new Man(r)
    case 2:
        return new Woman(r)
}

이런 식으로 스위치 문을 추상 팩토리 안에 숨기자. 팩토리는 스위치문을 사용해 적절한 파생 클래스의 인스턴스를 생성한다. 적절한 함수들은 인터페이스를 거쳐 호출된다.

서술적인 이름을 사용하라

서술적인 이름을 사용하면 개발자 머릿속에서도 설계가 뚜렷해지므로 코드를 개선하기 쉬워진다. 그리고 이름 붙일때는 일관성있게 붙이자. includeSetupAndTeardownPages, includeSetupPages 등...

함수 인수

함수의 이상적인 인수 개수는 0개다.. 인수는 적을 수록 좋다. 그리고 플래그 인수는 되도록 사용하지 말자.

부수 효과를 일으키지 마라

함수에서 한 가지를 하겠다고 약속하고선 남몰래 다른짓을 하는 것....해롭다. 많은 경우 시간적인 결합이나 순서 종속성을 초래한다. 예를 들어 패스워드를 체크하는 함수에 세션을 초기화하는 기능도 있다든지..

명령과 조회를 분리하라

함수는 뭔가를 수행하거나 뭔가에 답하거나 둘 중 하나만 해야 한다. 둘 다 하면 혼란을 초래한다.

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

if (deletePage(page)==E_OK){
	if (registry.deleteReference(page.nae)==E_OK){
    	...
    }
}

이렇게 오류를 하나하나 if문으로 잡으면 중첩 구조가 심해진다. try-catch로 한꺼번에 잡는게 깔끔하다. try-catch 블록은 되도록 별도 함수로 뽑아내자.

반복하지 마라

알고리즘이 변하면 여기저기 손봐야하므로, 중복은 좋지 않다.

구조적 프로그래밍

return,break,continue를 쓰지 말자. 작게 만든다면 괜찮지만, 큰 함수에선 별로다. 반면 goto는 큰 함수에서 쓰고, 작은 함수에서는 쓰지 말자

함수를 어떻게 짜죠?

처음부터 완벽하게 짜는건 불가능하다....일단 즉흥적으로 막 짜면 서투른 코드가 완성된다. 그런 다음 코드를 빠짐없이 테스트하는 단위 테스트 케이스를 만든다. 그리고 코드를 다듬고, 이름을 바꾸고, 중복을 제거하며 다듬는다. 그런 와중에도 단위 테스트는 항상 통과해야한다. 이렇게 하다보면 예쁜 함수를 만들 수 있다.

좋은 웹페이지 즐겨찾기