favicon

Jayden { do: smite }

쏙쏙 들어오는 함수형 코딩 Chapter 3

🖍 쏙쏙 들어오는 함수형 코딩 - 심플한 코드로 복잡한 소프트웨어 길들이기

이 글은 쏙쏙 들어오는 함수형 코딩 - 심플한 코드로 복잡한 소프트웨어 길들이기를 읽고 작성한 글입니다. 함수형도 함수형이지만, 이 책을 통해 좀더 깔끔하고 직관적인 코드를 작성할 수 있을 것이란 팀원들의 의견을 토대로 이번 스터디 서적으로 선정하였습니다.

Chap 3. 액션과 계산, 데이터의 차이를 알기

  • 액션과 계산, 데이터의 차이를 알 수 있다.
  • 액션이 코드 전체로 퍼질 수 있다.
  • 코드에서 어떤 부분이 액션인지 찾을 수 있다.

액션과 계산, 데이터

모든 개발 과정에서 액션과 계산, 데이터를 구분하는 기술을 적용할 수 있다.

액션(부수 효과)

  • 실행 시점과 횟수에 의존

계산(순수 함수, 수학 함수)

  • 입력을 받아서 출력을 반환한다.

데이터

  • 이벤트에 대한 사실

함수형 프로그래머는..!

  • 최대한 액션에서 계산을 빼내려고 한다.
  • 또 계산에서 데이터를 분리할 수 있는 생각한다.
  • 나아가서 액션을 계산으로, 계산을 데이터로 바꿀 수 있는지 고민한다.

액션과 계산, 데이터는 어디에나 적용할 수 있다.

장보기 과정에 적용해보기

액션: 냉장고 확인하기 -> 액션: 운전해서 상점으로 가기 -> 액션: 필요한 것 구입하기 -> 액션: 운전해서 집으로 오기

전부 다 액션으로 보인다. 이는 큰 범주에서 일부분이 액션이기만 해도 전체가 액션이 되기 때문이다. 여기서 더 잘게 나눠서 계산, 데이터를 뽑아보자.

  • 액션: 냉장고 확인하기

    • 데이터: 냉장고에 있는 제품(현재 재고)
  • 액션: 운전해서 상점으로 가기

    • 데이터: 상점 위치, 가는 경로 등
  • 액션: 필요한 것 구입하기

    • 계산: 필요한 재고 - 현재 재고 = 장보기 목록
    • 데이터: 필요한 재고, 현재 재고(위에 존재), 장보기 목록
  • 액션: 운전해서 집으로 오기 => 더 나눌 수 있지만 장보기 과정에서 중요한 로직은 아니기에 패스

나누다보면 너무 복잡해지는 거 아니야?라고 생각할 수 있지만, 나눌 수 있는 만큼 나누는 게 좋다.<br/> 함수형 프로그래머는 나눌 수 있는 만큼을 알고 적절한 곳에서 멈출 수 있어야 한다.<br/> 계산 또한 여러 계산으로 나눌 수 있다. 첫 번째 계산의 출력이 두 번째 계산의 입력이 되는 식이다.<br/> 계산이 잘 보이지 않는 이유는, 기본적으로 계산은 우리의 사고 과정에 녹아있기 때문이다.(이미 머리에서 다 파악이 되기 때문)

데이터, 계산 그리고 액션 자세히 들여다보기

데이터

  • 이벤트에 대한 사실
  • 자료 구조로 데이터에 의미를 담을 수 있다. ex) 순서가 중요한 데이터는 배열로 처리한다.
  • 불변성
    • 카피-온-라이트: 변경할 때 복사본을 만든다.
    • 방어적 복사: 보관하려고 할 때 복사본을 만든다.
  • 장점
    • 직렬화: 전송 및 저장이 쉽다.(보장된다.)
    • 동일성 비교: 데이터는 비교하기 쉽다.
    • 자유로운 해석: 같은 데이터도 다르게 해석이 가능하므로 유용하다.
  • 단점
    • 유연하게 해석이 된다는 점이 장점이기도 하지만 반드시 해석이 필요하다는 게 단점이다.
    • 즉, 해석하지 않은 데이터는 그냥 바이트 덩어리일 뿐이다.

계산

  • 입력값으로 출력값을 만든다.
  • 실행 시점과 횟수와 상관없이 항상 같은 입력값에 대해 같은 출력값을 반환한다.
  • 함수(순수 함수)로 구현한다.
  • 액션보다 좋은 이유
    • 테스트하기 쉽다.
    • 기계적인 분석이 쉽다.(정적 분석)
    • 조합해서 사용하기 좋다.(순수 함수)
  • 계산에서 걱정하지 않아도 되는 부분
    • 동시에 실행되는 것
    • 과거 혹은 미래에 실행한 것
    • 실행 횟수
  • 단점
    • 실행(호출) 전에는 어떤 일이 발생할지 알 수 없다는 점.

액션

  • 외부 세계에 영향을 주거나 받는 것
  • 실행 시점과 횟수에 의존한다.
    • 시점: 언제 실행되는지(순서)
    • 횟수: 얼마나 실행되는지(반복)
  • 함수로 구현한다.(부수 효과(Side Effect) 함수)
  • 어떻게 보면 함수형 프로그래밍에서 가장 중요하다.
  • 액션을 잘 사용한다는 것은...
    • 가능한 적게 사용한다.
    • 가능한 작게 만든다.
    • 외부 세계에 영향을 주거나 받을 수 있다. 즉, 내부에는 계산과 데이터만, 가장 바깥쪽에 액션이 있는 구조가 이상적이다.
    • 실행 시점과 횟수에 의존하는 것을 조금이라도 제한한다.(덜 의존하도록 만드는 기술을 통해!)
  • 액션을 쓰는 순간, 그 액션을 포함하고 있는 무언가(주로 함수)도 전부 액션이 되어버린다.(액션은 퍼져나간다.)
undefined

Copyright 2023. all rights reserved by Jayden