Ch03 액션, 계산, 데이터의 차이를 알기
액션, 계산, 데이터
구분하기
모든 개발 과정에서 적용 가능
문제에 대해 생각할 때
- 코드를 작성할 때 특별히 주의해야할 부분(액션), 데이터로 처리해야 할 부분, 결정을 내려야 하는 부분(계산) 명확히 구분
코딩할 때
최대한 액션에서 계산 빼내기
계산에서 데이터 분리할 수 있는지 생각하기
액션이 계산이 될 수 있는지, 계산은 데이터가 될 수 있는지 고민하기
코드 읽을 때
액션은 시간에 의존하기 때문에 더욱 조심해야 함
숨어있는 액션까지도 찾아야 함
일상에서 액션/계산/데이터 구분; 장보기
타임라인
냉장고 확인 (액션)
확인하는 시점이 중요하므로 액션
냉장고에 있는 제품은 데이터; 현재 재고
운전해서 상점으로 가기 (액션)
필요한 것 구입하기 (액션)
현재 재고 (데이터)
필요한 재고 (데이터)
재고 빼기 (계산)
장보기 목록 (데이터)
목록에 있는 것 구입 (액션)
운전해서 집으로 오기 (액션)
음식을 냉장고에 보관하기 (액션)
타임라인을 크게 보면 전부 액션이지만
액션 안에 계산과 데이터로 나눌 수 있고, 각각의 액션도 세부 액션으로 나눌 수 있음
계산도 더 작은 계산과 데이터로 나누고 연결할 수 있음
데이터는 데이터만 조합할 수 있음
- 데이터 찾는 일을 먼저 해야, 동작에 대해 많은 것을 알 수 있음
계산 단계가 있지만 잘 보이지 않는 이유는 계산이 우리 사고 과정에 녹아있기 때문
데이터
의미를 담는 방법: 자료구조 활용
불변성
copy-on-write: 변경할 때 복사본 만들기
방어적 복사 defensive copy: 보관하려고 하는 데이터의 복사본 만들기
데이터로 할 수 있는 것
직렬화
동일성 비교
자유로운 해석/활용
계산 (순수함수/수학함수)
의미를 담는 방법: 연산
액션보다 계산이 좋은 이유
테스트하기 쉽다
기계적 분석이 쉽다; 정적 분석 - 자동화 분석
조합하기 좋다; 계산을 조합해 더 큰 계산 만들기
액션 (순수하지 않은 함수/부수효과 함수)
의미를 담는 방법: 외부 세상에 영향을 주는 일
다루기 힘들지만, 액션은 꼭 써야 함
액션을 잘 사용하는 방법
가능한 적게 사용; 액션 대신 계산을 사용할 수 있는지 고민
가능한 작게 만들기; 액션에서 액션과 관련 없는 코드는 모두 제거
외부 세계와 상호작용하는 것을 제한; 어니언 아키텍처(👉 18장)
호출 시점/횟수에 의존하는 것을 제한
함수형 사고 적용하기
새로 코드 구현 순서
데이터
계산
- 잘 만들어진 시스템이라면, 추상적인 개념이 바뀌지 않는 한 계산은 바뀌지 않아야
액션
기존 코드에 적용
액션을 활용하는 함수도 액션
\=> 액션은 코드 전체로 퍼진다
어떤 함수가 액션인지 명확하게 구분할 수 있어야