CHAPTER 3. 액션과 계산, 데이터의 차이를 알기
<장보기로 알아보는 액션, 계산, 데이터>
냉장고 확인 //액션
현재 재고 //데이터
필요한 재고 //데이터
필요한 재고에서 현재 재고 빼기 //계산
장보기 목록 //데이터
목록에 있는 것 구입 //액션
-
액션
- 외부에 영향을 주거나 받는 것이며, 실행 시점(순서)과 횟수(반복)에 의존한다.
- 부수 효과가 있는 함수(side-effecting function)라고 부르며 어떤 일을 하려는지 아는 것이 중요합니다.
- 액션 안에는 계산과 데이터, 또 다른 액션이 숨어 있기도 합니다.
- 냉장고 확인에 포함된 데이터로
현재 재고
, 계산으로는필요한 재고에서 현재 재고 빼기
가 있습니다. 또, 냉장고 확인을 더 세부적으로 나누어냉장고 문 열기
,현재 재고 확인
을 액션으로 만들수도 있을 것 같습니다.
- 냉장고 확인에 포함된 데이터로
- 액션을 잘 사용하기 위한 방법
- 가능한 액션을 적게 사용합니다.
- 액션은 가능한 작게 만듭니다.
- 내부에 계산과 데이터만 있고 가장 바깥쪽에 액션이 있는 구조를 가지는 것이 이상적입니다.
- 액션이 호출 시점에 의존하는 것을 제한합니다.
- 예) 이메일 전송, 데이터베이스 읽기
-
계산
- 입력으로 출력을 계산하며, 순수 함수(pure function)라고 부릅니다.
- 참조 투명(referentially transparent): 실행 시점과 횟수에 상관없이 항상 같은 입력값에 같은 출력값을 돌려줍니다.
- 액션보다 좋은 점
- 테스트 하기 쉽습니다.
- 기계적인 분석이 쉽습니다.
- 조합(계산을 더 작은 계산과 데이터로 나누고 연결)하기 쉽습니다. 계산을 조합하여 더 큰 계산을 만들 수 있습니다.
- 만약 장보기를 완료한 후
냉장고 재고 정리
라는 계산이 있다면
const 냉장고_재고_정리 = (현재_재고, 필요한_재고) => { const 장보기_목록 = 필요한_재고에서_현재_재고_빼기(현재_재고, 필요한_재고) // 장보기에 실패하지 않았다고 가정 return 현재_재고 + 장보기_목록 }
- 이라는 값으로 계산 안에서 계산을 사용할 수 있을 것 같습니다.
- 만약 장보기를 완료한 후
- 실행 횟수, 동시에 실행되거나, 과거, 미래에 실행되는 것을 걱정하지 않아도 괜찮습니다.
- 예) 최댓값 찾기, 이메일 주소 확인
-
데이터
- 이벤트에 대한 사실이며, 숫자나 문자, 배열, 객체 같은 것 입니다.
- 데이터는 데이터만 조합할 수 있습니다.
- 함수형 프로그래머는 불변성을 가지기 위하여 두가지 원칙을 사용합니다.
- 카피-온-라이트(copy-on-write) : 변경할 때 복사본을 만듭니다.
- 방어적 복사(defensive copy) : 보관하려고 하는 데이터의 복사본을 만듭니다.
- 데이터의 장점
- 직렬화 : 액션과 계산은 다른 곳에서 잘 동작할 것이라는 보장이 없습니다. 하지만 직렬화된 데이터는 전송하거나 저장했다 읽기 쉽습니다.
- 동일성 비교
- 자유로운 해석
- 데이터의 단점
- 해석이 필요하다
- 예) 사용자가 입력한 이메일 주소, 은행 API로 읽은 달러 수량
CHAPTER 4. 액션에서 계산 빼내기
//장보기 목록 중 한가지 물건을 구매했다는 가정으로 진행하는 액션
const 목록에_있는_것_구입 = (장보기_목록, 구매한_단일_항목과_개수) => {
const 남은_장보기_목록 = 구입한_항목_제외(장보기_목록, 구매한_단일_항목과_개수)
}
const 구입한_항목_제외 = (장보기, 구입) => {
return 장보기_목록.map((_장보기) => 빼기(_장보기, 구입))
}
const 빼기 = (장보기, 구입) => {
if(장보기.이름 === 구입.이름){
return {장보기.이름 : 장보기.개수 - 구입.개수}
}
return 장보기
}
-
장보기를 통한 액션, 계산, 데이터 분리
냉장고 확인 //액션 현재 재고 //데이터 필요한 재고 //데이터 필요한 재고에서 현재 재고 빼기 //계산 장보기 목록 //데이터 목록에 있는 것 구입 //액션
장보기를 예시로 들자면,
필요한 재고에서 현재 재고 빼기
는 현재 재고가 액션을 통해 나오는 유동적인 데이터기 때문에 호출하는 시점에 따라 달라질 수 있는 액션이 아닐까 생각하였다.필요한 재고에서 현재 재고 빼기
라는 말에 집중하는 게 아니라,현재 재고
라는 숫자 데이터와필요한 재고
라는 숫자 데이터 두가지를 받아 두 숫자 데이터가 같다면 어떤 시점이나 횟수에 상관없이 항상 같은 값을 반환하는빼기
라는 것에 집중해야 한다는 것을 알았다.(사실 2챕터보다는 8챕터 정도까지 읽은 후에 완벽히 이해했다…)