본문 바로가기

프로그래밍 독서/클린코드

3. 함수

 

 

 

이 장에서는 함수를 예쁘게 작성하는 법에 대해서 나온다.

 

학교를 다닐때 프로그래밍관련 과목을 들으면서 프로젝트를 할때

 

소위 '족보'라고 하는 코드를 받아서(운좋게도 본전공이 아니었음에도 컴공친구들이 좀 있었다.) 참고해 가면서

 

과제를 끝마쳤던게 기억이 난다.

 

 

문제는 남이 만든 코드를 받아서 작성하다 보면 input, output과 각 함수가 뭘 하는 녀석인지

 

이름으로 유추를 하더라도 구조적으로 파악이 꽤 어려웠다는 것이다.

 

이 장에서는 함수를 작성하면서 가독성을 높이는 방법들을 소개해준다.

 

 

제일 중요한 키는 두가지이다.

 

A. 한 함수는 한가지만 해야한다.

 

B. 인수는 적을수록 좋다.

 

 

 

 

이제부터 아래에 정리할 여러가지 기법들은 이것을 위한 몇가지 테크닉들이다.

 

1. 작게 만들어라

함수가 크면 클수록 함수를 파악하기 힘들다.

 

글도 그렇다.

 

짧은 글일수록 읽기가 편하다. 이해하기도 편하다.

 

한 화면을 넘지 않는 고전적인 규율도 있고, 사실 짧으면 짧을수록 좋다고 말한다.

 

 

2. 한가지만 하자

당연히 한가지만 하는것이 이해하기 좋다.

 

다만 함정이 있을 수 있다.

 

요리에 예를 들자면 '스파게티를 만드는 함수' 는 잘못됐다.

 

사실 한 일만 하는 것 처럼 보일 수 있지만

 

알고 보면 이 함수에는 재료손질 -> 면삶기 -> 소스만들기 -> 소스와함께 조리하기 -> 플레이팅 등 여러 과정이 숨겨져

 

있을 수 있다.

 

이런 것들은 대부분의 경우 세부적으로 다 분류해주는 것이 좋다.

 

추상클래스와 인터페이스를 적극 활용하면 조금 더 쉽게 나눌 수 있다.

 

 

 

3. 위에서 아래로 읽히도록

글과 똑같다.

 

위에서 아래로 읽히도록 이야기처럼 구성해야 한다.

 

한 함수 밑에는 추상화 수준이 한단계 낮은 녀석이 오는것이 좋다.

 

예를 들면 스파게티 면을 삶으려면,  물이 준비돼야 하고, 면이 준비돼야 하고, 불이 준비돼야 한다.

 

물이 준비되려면, 냄비를 포함하고 정수물을 포함해야 한다.

 

냄비를 포함하려면, 5L들이 이상의 냄비를 체크하고 준비한다.

 

...

 

등의 과정으로 포괄 -> 세부 로 구성하는 것이 읽기 좋다.

 

 

 

4. 서술적인 이름을 사용

중요한건 계속 강조해 주시는 편인가보다. 이 눈에 상이 맺힐정도로 주구장창 읽었던 내용이다.

 

 

 

5. 인수의 갯수는 최소화

무항(0개)가 가장 좋고, 단항(1개), 이항(2개) 까지도 괜찮다.

 

3항 이상부터는 어지간하면 피하는 것이 좋다.

 

남이 쓴 코드나 예전에 내가 작성한 코드를 다시 볼때 머리가 아팠던 부분이 이거였다.

 

위에 테크닉들로 작은 단위로 나누면 인수를 최소화 할 수 있다.

 

가장 피해야 할 인수로, boolean을 넘기는 것을 아주 극혐하시는 편이다.

 

좌표계의 (x,y)정도는 필요에 따라 선택하는것도 괜찮다고 한다.

 

 

인수가 어떤 순서인지 알아보기 쉽게 작성하는 것도 중요하다.

 

예를들어, assertEquals(expected, actual) 에서 expected와 actual의 순서를 헷갈려 잘못 넣는 실수가 진짜 많다.

 

단항이 아닌 경우 어지간하면 알아볼 수 있게 도움을 주는게 좋다.

 

 

인수가 3개가 넘어가면 객체를 이용해서 줄이는 방법도 있다.

 

Circle makeCircle(double x, double y, double radius);

Circle makeCircle(Point center, double radius);

 

와 같은 잔기술을 이용하면 xy좌표를 한점으로 줄이고 radius를 이용해서 3항을 2항으로 줄일 수 있다.

 

 

 

6. 출력인수를 명확하게

 

appendFooter(s); 를 보면 s에 바닥글을 붙이는건지, s를 바닥글에 붙이는건지 모호하다.

 

report.appendFooter(s) 로 바꿔주면 s를 바닥글로 report를 작성하는 것이라는 의미가 명확해진다.

 

 

 

7. 명령과 조회를 분리하자 (if문 안에 명령과 조회를 같이하는 함수를 작성하면 보기 힘들다)

제목만 보고는 읭? 싶지만 예시를 보고 바로 이해가 갔다.

 

set에 성공하면 True 실패하면 False를 반환하는 함수가 있다고 할때 명령과 조회를 둘다 해버린다.

 

if( Set("Username", "unclebob")) 

 

이렇게 써버리면 set이 username을 unclebob으로 한 후 확인인지, unclebob이 username인지 확인하는건지 모호하다.

 

if(attributeExists("Username")){

      setAttribute("Username", "uncleBob");

      }

 

과 같이 해주면 명확해진다.

 

 

 

7. 반복하지 말아라

우리가 프로그래밍을 하는 주된 이유이다.

 

반복하기 싫어서 단순작업을 컴퓨터가 하도록 하는 건데

 

비슷한 메서드를 반복해서 새로 작성하거나 하는 행위는 아주 낭비다.

 

반복없이 깔끔할수록(물론 남들이 이해할 수 있는 한도 내에서 쓰는게 좋을 것 같다..) 좋은 코드다.

 

 

 

 

 

 

사실 아직 코테위주로 공부하였고, 팀으로 프로젝트를 한 경험이 없어서 함수를 깔끔하게 쓰지 않았을때의 대 참사가

 

아주 깊게 와닿지는 않지만, 교양과목으로 경험한 끔찍했던 팀플의 경험을 떠올리면 어느정도 이해가 간다.

 

내가 보는 것을 남도 볼 것이라고 생각하고 작성하도록 노력해야겠다.

'프로그래밍 독서 > 클린코드' 카테고리의 다른 글

5. 형식 맞추기  (0) 2022.01.10
4. 주석  (0) 2021.12.05
번외) 코드포매팅 단축키  (0) 2021.11.22
2. 의미있는 이름  (0) 2021.11.19
1. 깨끗한 코드  (0) 2021.11.19