Ch03 액션, 계산, 데이터의 차이를 알기

·

2 min read

액션, 계산, 데이터

구분하기

모든 개발 과정에서 적용 가능

  • 문제에 대해 생각할 때

    • 코드를 작성할 때 특별히 주의해야할 부분(액션), 데이터로 처리해야 할 부분, 결정을 내려야 하는 부분(계산) 명확히 구분
  • 코딩할 때

    • 최대한 액션에서 계산 빼내기

    • 계산에서 데이터 분리할 수 있는지 생각하기

    • 액션이 계산이 될 수 있는지, 계산은 데이터가 될 수 있는지 고민하기

  • 코드 읽을 때

    • 액션은 시간에 의존하기 때문에 더욱 조심해야 함

    • 숨어있는 액션까지도 찾아야 함

일상에서 액션/계산/데이터 구분; 장보기

타임라인

  • 냉장고 확인 (액션)

    • 확인하는 시점이 중요하므로 액션

    • 냉장고에 있는 제품은 데이터; 현재 재고

  • 운전해서 상점으로 가기 (액션)

  • 필요한 것 구입하기 (액션)

    • 현재 재고 (데이터)

    • 필요한 재고 (데이터)

    • 재고 빼기 (계산)

    • 장보기 목록 (데이터)

    • 목록에 있는 것 구입 (액션)

  • 운전해서 집으로 오기 (액션)

  • 음식을 냉장고에 보관하기 (액션)

타임라인을 크게 보면 전부 액션이지만

  • 액션 안에 계산과 데이터로 나눌 수 있고, 각각의 액션도 세부 액션으로 나눌 수 있음

  • 계산도 더 작은 계산과 데이터로 나누고 연결할 수 있음

  • 데이터는 데이터만 조합할 수 있음

    • 데이터 찾는 일을 먼저 해야, 동작에 대해 많은 것을 알 수 있음
  • 계산 단계가 있지만 잘 보이지 않는 이유는 계산이 우리 사고 과정에 녹아있기 때문

데이터

  • 의미를 담는 방법: 자료구조 활용

  • 불변성

    • copy-on-write: 변경할 때 복사본 만들기

    • 방어적 복사 defensive copy: 보관하려고 하는 데이터의 복사본 만들기

  • 데이터로 할 수 있는 것

    • 직렬화

    • 동일성 비교

    • 자유로운 해석/활용

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

  • 의미를 담는 방법: 연산

  • 액션보다 계산이 좋은 이유

    • 테스트하기 쉽다

    • 기계적 분석이 쉽다; 정적 분석 - 자동화 분석

    • 조합하기 좋다; 계산을 조합해 더 큰 계산 만들기

액션 (순수하지 않은 함수/부수효과 함수)

  • 의미를 담는 방법: 외부 세상에 영향을 주는 일

  • 다루기 힘들지만, 액션은 꼭 써야 함

액션을 잘 사용하는 방법

  • 가능한 적게 사용; 액션 대신 계산을 사용할 수 있는지 고민

  • 가능한 작게 만들기; 액션에서 액션과 관련 없는 코드는 모두 제거

  • 외부 세계와 상호작용하는 것을 제한; 어니언 아키텍처(👉 18장)

  • 호출 시점/횟수에 의존하는 것을 제한

함수형 사고 적용하기

새로 코드 구현 순서

  • 데이터

  • 계산

    • 잘 만들어진 시스템이라면, 추상적인 개념이 바뀌지 않는 한 계산은 바뀌지 않아야
  • 액션

기존 코드에 적용

  • 액션을 활용하는 함수도 액션

    • \=> 액션은 코드 전체로 퍼진다

    • 어떤 함수가 액션인지 명확하게 구분할 수 있어야