Community

개발자 99% 커뮤니티에서 수다 떨어요!

← Go back
TIL-3 함수
by leeq
#clean_code
2년 전
550


TIL (Today I Learned)

2022.02.22

오늘 읽은 범위

3장. 함수

책에서 기억하고 싶은 내용을 써보세요.

  • 서론 - p40

  1. 의도를 분명히 표현하는 함수를 어떻게 구현할 수 있을까?

  2. 함수에 어떤 속성을 부여해야 처음 읽는 사람이 프로그램 내부를 직관적으로 파악할 수 있을까?

  • 작게 만들어라! - p42

  1. 함수를 만드는 첫째 규칙은 '작게!'다. 함수를 만드는 둘째 규칙은 '더 작게!'다.

  2. 다시 말해, if 문/ else 문 / while 문 등에 들어가는 블록은 한 줄이어야 한다는 의미다.

  3. 그러므로 함수에서 들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다.

  • 한 가지만 해라! - p44

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

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

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

  1. 한 함수 다음에 추상화 수준이 한 단계 낮은 함수가 온다.

  2. switch 문을 추상 팩토리에 꽁꽁 숨긴다.

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

  1. 함수가 작고 단순할수록 서술적인 이름을 고르기도 쉬워진다.

  2. 이름이 길어도 괜찮다.

  • 함수 인수 - p50

  1. 인수는 개념을 이해하기 어렵게 만든다.

  2. 플래그 인수는 추하다.

  3. 단항 함수는 함수와 인수가 동사 / 명사 쌍을 이뤄야 한다.

  4. 함수 이름에 키워드를 추가하는 형식이다.

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

  1. 많은 경우 시간적인 결합이나 순서 종속성을 초래한다.

  2. 일반적으로 출력 인수는 피해야 한다.

  • 명령과 조회를 분리하라! - p56

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

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

  2. 오류 코드 대신 예외를 사용하면 새 예외는 Exception 클래스에서 파생된다.

  • 반복하지 마라! - p.60

  1. 어쩌면 중복은 소프트웨어에서 모든 악의 근원이다.

  • 여러분이 작성하는 함수가 분명하고 정확한 언어로 깔끔하게 같이 맞아 떨어져야 이야기를 풀어가기가 쉬워진다는 사실을 기억하기 바란다.

오늘 읽은 소감은? 떠오르는 생각을 가볍게 적어보세요

개발자에게 있어서, 프로그래밍은 추상화다. 추상화가 없다면 PC를 비롯한 전자기기는 존재하지 않을 것이다. 사람이 직접 작업을 수행하는 것과 별 다를 바가 없을 테니까. 함수는 그 추상화의 알파와 오메가요, 처음과 마지막이요, 시작과 마침이라. 추상화를 위해 함수를 사용하고, 좋은 함수를 위해 적절한 추상화를 사용한다. 적절한 추상화를 통해 함수를 구성한다면, 함수의 목적도 분명해지고, 꼭 필요한 인수 만을 입력 받게 되며, 불필요한 추가 작업도 없어질 것이다. 여기에 더해, 의미 있는 이름을 붙이고 가능한 작은 작업 단위로 쪼개면 좋은 함수 완성이다. 그 때문에 이 책에서도 추상화에 대해 깊게 설명하고 있다.

좋은 함수의 기준 중 하나가 '작고 한 가지 작업만 수행하는 함수'라는 사실은 알고 있었다. 하지만 이 책에서 설명하는 것만큼 작게 나눌 생각까지는 하지 못했다. 특히, "들여쓰기 수준은 1단이나 2단을 넘어서면 안 된다." 문장에서는 가벼운 충격을 받기까지 했다. 머리로는 간단한 함수를 짜야겠다는 생각을 하면서도, 코딩을 하다 보면 횡 스크롤을 하면서 코딩하기 일쑤인데... 함수 하나에 너무 많은 케이스를 집어넣으려는 습관 탓이다. 게다가 작은 함수로 분리하지 않는 습관까지. 이 장을 다시 되새기며 나쁜 습관을 꼭 고쳐야겠다.

하지만 인수가 4개 이상은 특별한 이유가 있어도 사용하면 안 된다는 말에는 동의할 수 없다. 이는 나의 도메인이 일반적인 프로그래머의 그것과 달라서 발생하는 불일치일 것이다. 하지만, Machine Learning 알고리즘들이 구조적으로 얼마나 많은 인수들을 필요로 하는지 아는가? 가장 간단한 Neural Network (신경망) 알고리즘의 주요 옵션만 해도, data, labels, size, decay, max iter, 5개나 된다. 딥러닝이 아니다! 기본 신경망 알고리즘에서 필수 인수와 자주 사용하는 옵션들이다. 더 복잡한 ML 알고리즘을 사용하거나 데이터 분석 모델을 진행하다 보면 이보다 복잡한 인수들을 가진 함수를 자주 맞닥뜨릴 수 있다. 물론, 일반적으로 인수가 적을 수록 좋다는 것에는 동의한다.

의미 있는 이름 명명하기가 시 짓기와 비슷하다면, 좋은 함수 작성하기는 건물 짓기와 같다. 아파트는 공장에서 주물로 한번에 찍어낼 수 없다. 시멘트는 시멘트 공장에서, 철근은 제철소에서, 각각 따로 만들어진다. 한 채는 한 층으로부터, 한 층은 골조로부터 완성된다. 함수도 마찬가지다. 높은 수준의 추상화 함수를 작성하기 위해서는, 작고 간단한 함수부터 차곡차곡 쌓아 올려야 한다. 적절한 추상화라는 튼튼한 바닥 기초 공사는 기본이다. 책 전체로 보면 얼마 읽지 않았지만, 지금까지 읽은 내용 중, 이 장에서 가장 많은 것을 배웠다. 내 코딩 스타일에서 가장 부족한 부분을 채울 단서를 찾을 수 있었다.

궁금한 내용이 있거나, 잘 이해되지 않는 내용이 있다면 적어보세요.

  • 스윙: 자바에서 GUI를 구현하기 위한 개발 툴킷. 자바 기반 클래스의 일부이다. AWT의 제약을 극복하기 위해 이를 기반으로 개발되었다.