티스토리 뷰

도서/클린 코드

함수

woo'^'chang 2022. 7. 7. 16:13

어떤 프로그램이든 가장 기본적인 단위는 함수입니다. 이번 장에서는 함수를 만드는 법을 소개하고 있습니다.

작게 만들어라!

장황한 함수보다는 작고 간결하고 명확한 함수가 좋은 것은 모두가 알고 있는 사실입니다. 작은 함수는 어떻게 만들 수 있을까요?

 

블록들여쓰기를 활용합니다. if/else 문, while 문 등에 들어가는 블록에는 적절한 이름을 가진 함수를 배치하여 한 줄로 생성하도록 합니다. 중첩 구조가 생길수록 함수가 커지기 때문에 들여쓰기 수준도 1단에서 2단을 넘어서면 안 됩니다. 그래야만 이해하기 쉽고 가독성 높은 함수를 생성할 수 있습니다.

for 문 안에서 발생하는 동작을 하나의 함수로 바꿔보도록 하겠습니다.

다음과 같이 바꾸게 되었더니 함수 자체도 간결해지고 역할도 명확해졌음을 느끼게 되었습니다.

한 가지만 해라!

자신이 맡은 임무를 다하라는 말이 있듯 함수도 자신이 맡은 역할이 있다고 생각합니다. 따라서 함수는 역할에 집중해야 하고 맡은 역할은 한 가지를 해야 집중할 수 있습니다. 한 가지를 한다는 말이 모호하게 다가올 수 있습니다.

 

이 책에서는 다음과 같이 설명하고 있습니다.

지정된 함수 이름 아래 추상화 수준이 하나인 단계만 수행한다면 그 함수는 한 가지 작업만 수행한다.

간단하게 판단할 방법은 의미 있는 다른 함수로 추출할 수 있다면 여러 작업을 수행하고 있다는 것입니다.

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

추상화 수준이 높아질수록 가독성이 떨어집니다. 소설처럼 함수가 위에서 아래로 술술 읽힌다면 좋은 함수임을 짐작할 수 있습니다. 이렇게 만드는 작업은 숙련된 프로그래머라 할지라도 매우 어려운 작업이기에 코드를 많이 읽어보고 작성해봐야 합니다. 어렵다고 할지라도 절대 포기할 수 없는 중요한 규칙입니다.

함수 인수

함수에서 가장 이상적인 인수의 개수는 0개입니다. 즉, 함수 인수가 적을수록 좋다는 의미입니다. 인수가 여러 개가 될수록 함수의 본질적인 의미를 이해하기 어렵고, 테스트 케이스도 증가하게 되어 어려움을 줍니다.

 

함수의 인수로 플래그를 준다는 의미는 여러 가지를 수행한다는 의미를 담고 있기에 좋지 않은 방법입니다.

 

인수를 적게 가져가면 함수 이름에 인수 키워드를 포함할 수 있습니다. 인수 키워드를 포함함으로 인수의 의미 파악, 인수의 순서 파악 등 많은 정보를 얻을 수 있습니다.

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

오류 코드를 사용하게 된다면 오류 코드 처리가 필요하기에 추가적인 작업이 발생하는 문제에 부딪히게 됩니다. 하지만 예외를 사용하면 오류 처리 코드가 원래 코드에서 분리되기에 코드가 깔끔해집니다.

 

try/catch 블록을 사용하면 예외를 처리할 수 있게 되는데 이는 분리하는 것이 좋습니다. 코드 구조에 혼란을 주고 정상 동작과 오류 처리 동작을 뒤섞는 현상이 발생하기 때문입니다. 따라서 try/catch 블록 함수를 분리하고 이 함수는 try로 시작해서 catchfinally로 끝나야 합니다.

함수는 어떻게 짜죠?

처음부터 위에 설명한 모든 규칙을 생각하며 작성할 수 있는 프로그래머는 거의 없으리라 생각합니다. 필자 또한 하나의 거대한 함수를 작성한 뒤 다듬고, 함수를 만들고, 이름을 바꾸고, 중복을 제거하며 리팩토링을 진행한다고 합니다. 물론 이 과정에서 테스트는 항상 존재해야 합니다.

 

하나의 그림을 그리는 것처럼 전체적인 스케치를 진행한 후, 이쁜 그림으로 만들기 위해 하나하나 다듬어가는 식으로 함수를 작성하면 좋을 것 같다는 생각이 들었습니다.

'도서 > 클린 코드' 카테고리의 다른 글

객체와 자료 구조  (0) 2022.07.12
형식 맞추기  (0) 2022.07.10
주석  (0) 2022.07.09
의미 있는 이름  (0) 2022.07.05
깨끗한 코드  (0) 2022.07.04
댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Total
Today
Yesterday