[함수형 코딩] 3장. 액션과 계산, 데이터의 차이를 알기

셀레스틴 허·2022년 7월 3일
0

BOOKS

목록 보기
1/2
post-thumbnail

액션과 계산, 데이터

액션

  • 실행 시점과 횟수에 의존
  • 이렇게도 불린다: 부수 효과, 부수 효과가 있는 함수, 순수하지 않은 함수
  • ex) 이메일 읽기, 데이터베이스 읽기

계산

  • 입력으로 출력을 계산
  • 이렇게도 불린다: 순수 함수, 수학 함수
  • ex) 최댓값 구하기, 올바른 이메일 주소인지 확인

데이터

  • 이벤트에 대한 사실
  • ex) 사용자가 입력한 이메일 주소, 은행 API로 읽은 달러 수량

정리

  • 액션과 계산, 데이터는 어디에나 적용할 수 있음
  • 액션 안에는 계산과 데이터, 또 다른 액션이 숨어있을 수 있음
    함수형 프로그래밍에서는 액션을 더 작은 액션, 계산, 데이터를 나누고 나누는 것을 언제 멈춰야 할지 아는 사것이 중요
  • 계산은 더 작은 계산과 데이터로 나누고 연결할 수 있음
  • 데이터는 데이터만 조합할 수 있음
  • 계산은 때로 "우리 머릿속에서" 일어남

데이터란?

  • 데이터는 이벤트에 대한 사실
  • 데이터 구조로 의미 담을 수 있음
  • 불변성
    함수형 프로그래머는 불변 데이터 구조를 만들기 위하여
    1) copy-on-write
    데이터 변경 시 복사본 만듦
    2) 방어적 복사 defensive-copy
    보관하려고 하는 데이터의 복사본을 만듦
  • 데이터의 장점: 데이터는 데이터 자체로 할 수 있는 것이 없기 때문에 좋다
    1) 직렬화
    2) 동일성 비교
    3) 자유로운 해석
  • 데이터의 단점: 해석이 반드시 필요

함수형 프로그래머는 일반적으로 가능하면 액션을 쓰지 않으려고 한다. 그리고 계산으로 바꿀 수 있다면 그렇게 하는게 좋다고 생각한다. => 계산은 외부에 영향을 주지 않으며, 테스트하기 쉽기 때문이다.

계산은 입력값으로 출력값을 만든다. 호출 시점이나 횟수에 의존하지 않고 시점이나 횟수에 의존하지 않는다. 동일한 입력값으로 부르면 항상 같은 결괏값을 돌려준다.

  • 액션으로 모든 기능을 하나로 묶는다
  • 데이터를 먼저 구현하고 계산을 구현한 후에 마지막으로 액션을 구현하는 것이 함수형 프로그래밍의 일반적인 구현 순서

계산이란?

  • 계산은 입력값으로 출력값을 만드는 것.
  • 실행 시점과 횟수에 관계 없이 항상 같은 입력값에 대해 같은 풀력값을 돌려줌
  • 액션보다 계산이 좋은 이유?
    1) 테스트하기 쉽다
    2) 기계적인 분석이 쉽다 (정적 분석)
    3) 계산은 조합하기 쉽다 => 계산을 조합해 더 큰 계산을 만들 수 있음 (일급 계산 사용)
  • 계산할 때 걱정하지 않아도 되는 것
    1) 동시 실행되는 것
    2) 과거/미래에 실행된/할 것
    3) 실행 횟수
  • 계산의 단점: 계산 & 액션은 실행하기 전에 어떤 일이 발생할지 알 수 없다는 것

액션의 다양한 형태

자바스크립트에서 발생할 수 있는 액션들:
1) 함수 호출
ex) alert('Hello world!');
2) 메서드 호출
ex) console.log();
3) 생성자
ex) new Date();
4) 표현식 - 공유되고 변경 가능하다면 읽은 시점에 따라 값이 달라질 수 있음
ex) 변수 참조 (y), 속성 참조(y.first), 배열 참조(x[0])
5) 상태
ex) 값 할당(y = 2), 속성 삭제(delete y.first)

액션이란?

  • 액션은 외부 세계에 영향을 주거나 받는 것을 말함
  • 액션은 실행 시점 & 횟수에 의존
    ㄴ 언제 실행되는지(순서), 얼마나 실행되는지(반복)
  • 액션을 잘 사용하기 위한 방법
    1) 가능한 액션을 적게 사용 => 계산을 대신 사용
    2) 액션은 가능한 작게 만듦
    액션과 관계 없는 코드(액션 계획/결정)는 계산으로 뺌
    3) 액션이 외부 세계와 상호작용하는 것을 제한 => 어니언 아키텍쳐
    4) 액션이 호출 시점, 횟수에 의존하는 것을 제한

3장 후기

"액션은 코드 전체로 퍼집니다."
ㄴ 그렇다 나의 코드는 액션 그 자체였다. 내일부터 레거시 코드 리팩토링 작업 들어가는데 각 서비스 타임라인 다이어그램 작성 후, 액션/데이터/계산 구분하여 리스트업 해야겠다.

profile
Software Developer / 고통은 필연, 괴로움은 선택

0개의 댓글