클린코드 스터디 - 003

3 분 소요

3장 함수

어떤 프로그램이든 가장 기본적인 단위는 함수이고, 따라서 함수를 잘 만드는 법은 중요함

작게 만들어라!

함수는 최대한 간결하게 만들어라

if/else/while 블럭을 만들면 내부에서 한 줄로 다른 함수를 호출해라

중첩구조가 생길만큼 함수가 커져서는 안된다

한 가지만 해라!

함수는 한가지를 해야한다. 그 한가지를 잘 해야 한다. 그 한 가지만을 해야 한다.

-> 그 한가지가 무엇일까?

우리가 함수를 만드는 이유는 큰 개념을 다음 추상화 수준으로 여러 단계로 나눠 수행하기 위해서이다

-> 추상화란 구체적인 것들에서 일반화된 부분만을 뽑아내는 Bottom-up 식 사고임

-> 큰 함수를 다음 단계의 추상화로 나눠 수행한다는 뜻은 함수가 한가지를 수행할 때까지 쪼개라는 뜻으로 보임

-> ‘작게 만들어라’는 명제로 참조한다면 if/else/while 블럭이 하나가 될 때까지 구분하라는 뜻?

단순히 다른 표현이 아니라 의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다.

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

한 함수 내의 추상화 수준은 동일해야 한다

-> 읽는 사람이 헷갈림

쉽지 않겠지만 내려가기 규칙을 사용하여 추상화 수준이 하나인 함수를 구현하라.

Switch 문

본질적으로 switch 문은 여러가지 경우를 처리하기 위해 만들어진 것

다형성을 이용하여 처리가능?

Switch 문은 어쩔 수 없다. 단 한 번만 참아준다

서술적인 이름을 사용하라!

충분히 시간을 들여서 최대한 서술적인 이름으로 지어라

모듈 내의 함수 이름은 같은 문구, 명사, 동사를 사용하여 일관성있게 지어라

함수인수

함수에서 이상적인 인수 개수는 0개, 차선은 1개

인수는 적을수록 좋음, 이유는 인수가 추가될수록 읽는 사람이 그것의 의미를 해석하기 어려워짐

많이 쓰는 단항 형식

인수가 1개로 용납되는 경우

인수로 질문하는 경우

boolean isFileExists(MyFile) {

뭔가를 변화하는 경우

inputStream fileOpen(MyFile) {

이벤트인 경우

void passwordAttemptFailedNtimes(int attempts) {

플래그 인수

플래그 인수는 쓰지마라

void doSomething(boolean isTrue) {

이항 함수

이해하기 어려우니 가급적 쓰지마라

좌표계같이 인수 2개가 필요할 것 같은 경우도 있지만 가능하면 단항함수로 바꾸도록 한다

삼항 함수

신중하게 고려하라고 권고한다

인수 객체

인수가 2~3개 필요하면 클래스로 선언할 가능성을 짚어봐라

인수 목록

리스트형 인수를 취급하는 함수라도 사실상 단항, 이항, 삼항 함수이다

부수효과를 일으키지 마라!

부수 효과가 아니라 그 함수가 한가지 일을 하지 않기 때문임, 한가지만 하는 함수로 바꿔라

출력 인수

인수를 출력대상으로 사용하지마라

명령과 조회를 분리하라!

함수는 뭔가를 수행하거나 뭔가에 대한 답을 하거나 둘 중의 하나만 수행

명령 함수와 조회 함수는 명확히 분리해야 한다

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

명령 함수에서 오류 코드를 반환하는 방식은 여러 단계로 중첩되는 코드를 야기할 수 있음

따라서 try/catch 로 오류처리를 원래 코드에서 분리할 것

Try/Catch 블록 뽑아내기

정상 동작과 오류 처리 동작을 별도의 함수로 분리하는게 코드를 이해하기 쉬워짐

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

오류를 처리하는 함수가 오류를 전담해야 함

오류코드 대신 예외클래스를 사용하여 작업하면 쉽게 새 예외 클래스를 추가할 수 있음

반복하지 마라!

어쨌든 소스 코드에서 중복을 제거해라

많은 원칙과 기법이 중복을 없애거나 제어할 목적으로 나왔음

구조적 프로그래밍

기본적으로는 함수는 입구와 출구만 존재해야 한다고 함

그래도 함수를 충분히 작게 만든다면 return, break, continue 를 여러 차례 사용해도 괜찮음

함수를 어떻게 짜죠?

처음에는 길고 복잡하게 만듬

단위 테스트 케이스를 만듬

단위 테스트 케이스 통과를 유지하면서 함수를 정제함

결론

프로그래밍의 기술은 언어 설계의 기술임

대가 프로그래머는 시스템을 구현할 대상이 아니라 풀어갈 스토리로 생각함

설명한 규칙을 따른다면 간결하고 체계적인 좋은 이름을 가진 함수들이 나올 것임

참고