쏙쏙 들어오는 함수형 코딩 Chapter 3
🖍 쏙쏙 들어오는 함수형 코딩 - 심플한 코드로 복잡한 소프트웨어 길들이기
이 글은 쏙쏙 들어오는 함수형 코딩 - 심플한 코드로 복잡한 소프트웨어 길들이기를 읽고 작성한 글입니다. 함수형도 함수형이지만, 이 책을 통해 좀더 깔끔하고 직관적인 코드를 작성할 수 있을 것이란 팀원들의 의견을 토대로 이번 스터디 서적으로 선정하였습니다.
Chap 3. 액션과 계산, 데이터의 차이를 알기
- 액션과 계산, 데이터의 차이를 알 수 있다.
- 액션이 코드 전체로 퍼질 수 있다.
- 코드에서 어떤 부분이 액션인지 찾을 수 있다.
액션과 계산, 데이터
모든 개발 과정에서 액션과 계산, 데이터를 구분하는 기술을 적용할 수 있다.
액션(부수 효과)
- 실행 시점과 횟수에 의존
계산(순수 함수, 수학 함수)
- 입력을 받아서 출력을 반환한다.
데이터
- 이벤트에 대한 사실
함수형 프로그래머는..!
- 최대한 액션에서 계산을 빼내려고 한다.
- 또 계산에서 데이터를 분리할 수 있는 생각한다.
- 나아가서 액션을 계산으로, 계산을 데이터로 바꿀 수 있는지 고민한다.
액션과 계산, 데이터는 어디에나 적용할 수 있다.
장보기 과정에 적용해보기
액션: 냉장고 확인하기
-> 액션: 운전해서 상점으로 가기
-> 액션: 필요한 것 구입하기
-> 액션: 운전해서 집으로 오기
전부 다 액션으로 보인다. 이는 큰 범주에서 일부분이 액션이기만 해도 전체가 액션이 되기 때문이다. 여기서 더 잘게 나눠서 계산, 데이터를 뽑아보자.
-
액션: 냉장고 확인하기
- 데이터: 냉장고에 있는 제품(현재 재고)
-
액션: 운전해서 상점으로 가기
- 데이터: 상점 위치, 가는 경로 등
-
액션: 필요한 것 구입하기
- 계산: 필요한 재고 - 현재 재고 = 장보기 목록
- 데이터: 필요한 재고, 현재 재고(위에 존재), 장보기 목록
-
액션: 운전해서 집으로 오기 => 더 나눌 수 있지만
장보기 과정
에서 중요한 로직은 아니기에 패스
나누다보면
너무 복잡해지는 거 아니야?
라고 생각할 수 있지만, 나눌 수 있는 만큼 나누는 게 좋다.<br/> 함수형 프로그래머는나눌 수 있는 만큼
을 알고 적절한 곳에서 멈출 수 있어야 한다.<br/> 계산 또한 여러 계산으로 나눌 수 있다. 첫 번째 계산의 출력이 두 번째 계산의 입력이 되는 식이다.<br/> 계산이 잘 보이지 않는 이유는, 기본적으로 계산은 우리의 사고 과정에 녹아있기 때문이다.(이미 머리에서 다 파악이 되기 때문)
데이터, 계산 그리고 액션 자세히 들여다보기
데이터
이벤트에 대한 사실
- 자료 구조로 데이터에 의미를 담을 수 있다. ex) 순서가 중요한 데이터는 배열로 처리한다.
- 불변성
- 카피-온-라이트: 변경할 때 복사본을 만든다.
- 방어적 복사: 보관하려고 할 때 복사본을 만든다.
- 장점
- 직렬화: 전송 및 저장이 쉽다.(보장된다.)
- 동일성 비교: 데이터는 비교하기 쉽다.
- 자유로운 해석: 같은 데이터도 다르게 해석이 가능하므로 유용하다.
- 단점
- 유연하게 해석이 된다는 점이 장점이기도 하지만 반드시 해석이 필요하다는 게 단점이다.
- 즉, 해석하지 않은 데이터는 그냥 바이트 덩어리일 뿐이다.
계산
입력값으로 출력값을 만든다.
- 실행 시점과 횟수와 상관없이
항상 같은 입력값에 대해 같은 출력값을 반환한다
. - 함수(
순수 함수
)로 구현한다. - 액션보다 좋은 이유
- 테스트하기 쉽다.
- 기계적인 분석이 쉽다.(정적 분석)
- 조합해서 사용하기 좋다.(순수 함수)
- 계산에서 걱정하지 않아도 되는 부분
- 동시에 실행되는 것
- 과거 혹은 미래에 실행한 것
- 실행 횟수
- 단점
- 실행(호출) 전에는 어떤 일이 발생할지 알 수 없다는 점.
액션
외부 세계에 영향을 주거나 받는 것
실행 시점과 횟수에 의존한다.
- 시점: 언제 실행되는지(순서)
- 횟수: 얼마나 실행되는지(반복)
- 함수로 구현한다.(부수 효과(Side Effect) 함수)
- 어떻게 보면 함수형 프로그래밍에서 가장 중요하다.
- 액션을 잘 사용한다는 것은...
- 가능한 적게 사용한다.
- 가능한 작게 만든다.
- 외부 세계에 영향을 주거나 받을 수 있다. 즉, 내부에는 계산과 데이터만, 가장 바깥쪽에 액션이 있는 구조가 이상적이다.
- 실행 시점과 횟수에 의존하는 것을 조금이라도 제한한다.(덜 의존하도록 만드는 기술을 통해!)
- 액션을 쓰는 순간, 그 액션을 포함하고 있는 무언가(주로 함수)도 전부 액션이 되어버린다.(액션은 퍼져나간다.)
undefined