쏙쏙 들어오는 함수형 코딩 - Chapter 01 ~ 03

date
May 9, 2024
slug
grokking-simplicity-1
status
Published
tags
PL & Compiler
summary
type
Post

Chapter 01

함수형 프로그래밍이란?

  • 수학 함수를 사용하고 부수 효과(side effect)를 피하는 것이 특징인 프로그래밍 패러다임
    • 불필요한 부수 효과를 가능한 사용하지 않으려고 한다. - 리턴값 이외에 하는 모든 일
  • 부수 효과 없이 순수 함수(pure function)만 사용하는 프로그래밍 스타일
    • 부수 효과 없이 리턴값이 인자에만 의존하는 함수
함수형 프로그래밍은 부수 효과를 피해야 한다고 하지만 부수 효과가 없다는 것은 유용한 프로그램이 아니라는 것이다. - 이메일을 전송하지 않는 이메일 전송 소프트웨어, 입력이 없는 프로그램 등 → 타협을 하여 부수 효과를 줄일 수 있다면 줄이자.

함수형 프로그래머는 코드를 액션과 계산, 데이터로 구분

  • 액션: 부르는 시점에 의존 - 실행 시점, 횟수 또는 둘 다에 의존한다.
  • 계산: 입력값을 계산해 출력하는 것 - 입력값이 같다면 항상 같은 결과가 나오며, 외부에 영향을 주지 않는다.
  • 데이터: 이벤트에 대한 사실을 기록한 것 - 실행하지 않아도 되는 데이터 형태로 존재
액션을 전체 코드에 영향을 주지 않도록 격리할 수 있는 능력 필요
코드의 많은 부분을 계산으로 옮긴다면 액션에 해당하는 코드가 줄어들고 그만큼 부수 효과도 줄어들게 될 것이다. → 계산은 시간에 의존적이지 않아서 다루기 쉽기 때문에 가능한 코드를 계산으로 바꾸는 것이 좋다.

함수형 사고

  • 액션과 계산, 데이터를 구분해서 생각하기 - PART1
    • 설계 관점에서 테스트가 쉽고 유지보수, 재사용성이 좋음
  • 일급 추상(first-class abstraction) 개념 - PART2
    • 함수를 재사용하는 것

Chapter 02

피자를 만드는 로봇을 프로그래밍 하는 예시로 설명하고 있다.
  • 액션: 호출 횟수, 시점에 의존
    • 반죽 펴기, 피자 배달, 재료 주문
  • 계산: 언제 사용해도 다른 곳에 영향을 주지 않는다.
    • 조리법에 나온 것을 두 배로 만들기, 쇼핑 목록 결정
  • 데이터: 변경 불가능한 데이터 - 불변
    • 고객 주문, 영수증, 조리법
notion image
 
notion image
 
하나의 로봇이 순서대로 처리할 때는 문제가 없지만, 여러 대의 로봇이 일을 분산하여 처리할 때는 처리 순서가 꼬이지 않게 잘 처리하는 것이 중요하다.
notion image
notion image
로봇이 수행해야 하는 작업(액션)이 언제 호출되고, 언제 끝날지 알 수 없기 때문에 완성되기 전까지는 외부로 나오지 못하게 격리시키는 방법이 필요하다. - 타임라인 커팅
타임라인 커팅을 통해 액션이 올바른 순서로 실행할 수 있도록 보장해준다.

Chapter 03

  • 액션: 실행 시점, 횟수에 의존 - 부수 효과(side-effects), 부수 효과가 있는 함수 (side-effecting function), 순수하지 않은 함수 (impure function)
    • 이메일 보내기, 데이터베이스 읽기
  • 계산: 입력으로 출력을 계산 - 순수 함수(pure function), 수학 함수(mathematical function)
    • 최댓값 찾기, 이메일 주소가 올바른지 확인하기
  • 데이터: 이벤트에 대한 사실
    • 사용자가 입력한 이메일 주소, 은행 API로 읽은 달러 수량

장보는 과정을 프로그래밍 관점으로 생각해보기

notion image
냉장고를 확인하거나 필요한 것을 구매하는 과정을 생각해보면 어느 시간대에 가도 제품이 항상 있는 것은 아니기 때문에 실행 시점에 의존하고 있다고 볼 수 있다.
운전해서 집으로 오기의 경우에도 선행 조건이 필요하기 때문에 실행 시점에 의존하고 있다.
notion image
그러나 액션을 수행하는 과정을 세분화하면 데이터, 계산 등의 과정이 추가로 보이게 되는데, 이렇게 액션을 계산, 데이터로 나누는 과정, 언제까지 나누는 것이 적절한지 등을 아는 것이 중요하다.
또한 액션을 계산으로, 계산을 데이터로 바꿀 수 있다면 그렇게 하는 것이 좋다.
이러한 과정이 필요한 이유는 부수 효과를 최소화하기 위함이다. → 불순한 함수에 방대한 코드들을 추가하면서 함수가 짊어져야 할 무게가 점점 무거워지는데, 이를 최소한으로 줄이기 위함이라고 볼 수 있다. → 외부에 영향을 주는 액션이 적을 수록 테스트 하기도 더 좋다.

구독자들에게 이메일로 쿠폰을 매주 보내주는 서비스

notion image
해당 서비스를 액션, 계산, 데이터로 나누게 된다면 위와 같은 다이어그램을 만들 수 있다.
notion image
notion image
ㅁㄴㅇㅁㄴㅇ
notion image
notion image
ㅁㄴㅇㅁㄴㅇ
notion image
ㅁㄴㅇㅁㄴㅇ
 

© hyuunnn 2024