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챕터 정도까지 읽은 후에 완벽히 이해했다…)