쏙쏙 들어오는 함수형 코딩 ch03
챕터 3 - 액션과 계산, 데이터의 차이를 알기
챕터 3 : 액션과 계산, 데이터의 차이를 알기
챕터 3 문제 : 액션, 데이터, 계산이란 무엇인가?
액션- 실행 시점과 횟수에 의존.
다른 말로 부수 효과. 부수효과가 있는 함수. 순수하지 않은 함수
ex) 이메일 보내기, 데이터 베이스 읽기
계산 - 입력으로 출력 계산.
다른 말로 순수 함수, 수학 함수
ex) 최댓값 찾기, 이메일 주소가 올바른지 확인하기
데이터 - 이벤트에 대한 사실
ex) 사용자가 입력한 이메일 주소, 은행 API로 읽은 달러 수량
챕터 3 요점정리
-
함수형 프로그래머는 액션과 계산, 데이터를 구분함.
-
계산은 계획이나 결정을 할 때 적용하고, 액션을 통해 계산으로 만든 계획을 실행할 수 있음.
-
액션은 실행 시점이나 횟수에 의존. 일반적으로 액션은 외부 세계에 영향을 주거나 받음.
-
계산은 입력값으로 출력값을 만드는 것. 외부 세계에 영향을 주거나 받지않고 실행 시점이나 횟수에 의존하지 않음.
-
데이터는 이벤트에 대한 사실. 영구적으로 기록 가능.
-
함수형 프로그래머는 액션 < 계산 < 데이터 순으로 좋아함.
-
계산은 같은 입력값을 주면 항상 같은 출력값이 나오기 떄문에 액션보다 테스트하기 쉬움.
Q. 참조 투명이란?
A. 계산은 계산을 호출하는 코드를 계산 결과로 바꿀 수 있기 때문에 참조투명이라함. 계산의 결과는 항상 같기 때문에 여러 번 불러도 문제가 없다는 뜻
Q. 액션, 계산, 데이터를 구분지을 때 가장 먼저 해야하는 일은?
A. 데이터를 찾는 일. 데이터를 찾았다면 동작에 대해 많은 것을 알 수 있음.
Q. 데이터는 무엇인가요?
A. 데이터는 이벤트에 대한 사실입니다. 일어난 일의 결과를 기록한 것.
Q. 데이터를 어떻게 구현하나요?
A. 자바스크립트에서는 기본 데이터 타입으로 구현한다. 숫자, 문자, 배열, 객체같은 것들. 다른 언어에서는 더 정교한 방법으로 데이터 만들 수 있음. EX) 하스켈은 새로운 데이터 타입을 정의해 도메인 표현가능
Q. 불변 데이터 구조를 만드는 두 가지 원칙
A.
- 카피-온-라이트 : 변경할 때 복사본을 만듦
- 방어적 복사 : 보관하려고 하는 데이터의 복사본을 만듦.
Q. 데이터의 예
A. 구입하려는 음식 목록, 이름, 전화 번호, 음식 조리법
Q. 데이터의 장점
A.
-
직렬화 - 직렬화된 액션과 계산은 다른 곳에서 잘 동작할 거라는 보장이 없음. 하지만 직렬화된 데이터는 전송하거나 디스크에 저장했다가 읽기 쉬움.
-
동일성 비교 - 계산이나 액션은 서로 비교하기 어려움. 하지만 데이터는 비교하기 쉬움.
-
자유로운 해석 - 데이터는 여러 가지 방법으로 해석할 수 있음. 접속 로그는 문제 해결을 위해 사용할 수 있지만 모니터링을 위해 사용할 수도 있음.
Q. 데이터의 단점
A. 유연하게 해석할 수 있다는 점은 장점이지만 해석이 반드시 필요한 거는 단점임. 계산은 해석하지 않아도 실행할 수 있음. 하지만 데이터는 쓸모없는 바이트가됨
Q. 모든 데이터가 이벤트에 대한 사실인가?
A. YES.
Q. 액션보다 계산을 사용하려는 이유.
A. 테스트하기 쉽기 때문. (계산은 외부에 영향을 주지 않기 때문에 여러번 테스트해도 문제가 없음.) 예로 이메일을 보내고 결과를 주는 시스템은 테스트 하기 어려움. 하지만 결과가 이메일 목록 데이터인 시스템은 테스트하기 쉬움.
Q. 함수형 프로그래밍의 일반적인 구현순서
A. 데이터를 먼저 구현하고 계산을 구현한 후 마지막으로 액션을 구현하는 것.
Q. 계산은 무엇인가요?
A. 입력값으로 출력값을 만드는 것. 실행 시점과 횟수에 관계없이 항상 같은 입력값에 대해 같은 출력값을 돌려줌..
Q. 계산은 어떻게 구현함?
A. 계산은 함수로 구현함.
Q. 어떻게 계산에 의미를 담을 수 있음?
A. 계산에는 연산을 담을 수 있음. 계산은 입력값을 출력값으로 만드는 것을 표현함. 계산을 언제 사용할지 또는 어떻게 사용할지에 따라 다름.
Q. 액션보다 계산이 더 좋은점
-
테스트하기 쉬움. 언제 어디서나 (로컬 장비, 빌드 서버, 테스트 장비) 원하는 만큼 테스트 가능
-
기계적인 분석이 쉬움. 정적 분석에서 자동화된 분석은 중요함.
-
계산은 조합하기 쉬움. 계산을 조합하면 더 큰 계산을 만들 수 있음. 이때 일급 계산을 사용함.
계산은 일반적으로 함수형 프로그래밍 외부에 있는 액션을 통해 수행됨!
Q. 계산을 쓰면서 걱정 안 해도 되는것..
A. 동시에 실행되는 걸 걱정 안 해도됨. 과거에 실행되었던 것이나 미래에 실행할 거 계산 안 해도됨. 실행 횟수 걱정 안 해도됨.
Q. 계산 단점.
A.
계산과 액션은 실행 전에는 어떤 일이 발생하지 알수 없다는 단점이 있음.
물론 코드를 읽으면 예상할수있지만 소프트웨어 측면에선 어려움. 입력값으로 실행해야 결과를 알 수 있음.
이런 단점이 싫으면 계산이나 액션 대신 데이터를 사용해야함
Q. 액션의 형태 다섯가지를 말해보세요
A.
- 함수 호출 2. 메서드 호출
- 생성자 호출
- 표현식
- 상태 공유하기 위해 값을 할당했고 변경 가능한 변수라면 다른 코드에 영향을 주기 때문에 액션.
모든 액션을 다 찾을 필욘없다. 단지 코드가 호출시점이나 횟수에 의존하는지 생각해보면 됨.
Q. 액션은 무엇인가요?
A. 액션은 외부 세계에 영향을 주거나 받는 것을 말함. 실행 시점과 횟수에 의존함 언제 실행되는지 - 순서 얼마나 실행되는지 - 반복
Q. 액션은 어떻게 구현하나요?
A. 함수로 구현함. 계산도 함수로 구현해서 구분하기 쉽지않음.
Q. 어떻게 액션에 의미를 담을 수 있나요?
A. 액션으로 외부 세상에 영향을 줄수있음. 따라서 어떤 일을 하려는지 아는 게 중요..
Q. 액션의 예
A. 이메일 보내기, 계좌에서 인출하기, 전역변숫값 바꾸기, AJAX 요청하기
Q. 액션은 일반적으로 무엇이라고 하나요?
A. 순수하지 않은 함수, 부수 효과 함수, 부수 효과가 있는 함수.
Q. 액션을 잘 사용하기 위한 방법 4가지
- 가능한 액션을 적게 사용한다. 아예안 쓸순없음
- 가능한 작게 만든다. 액션에서 액션과 관련없는 코드는 모두 제거하여 계산으로 빼냄.
- 액션이 외부 세계와 상호작용하는 것을 제한함. 내부에 계산과 데이터만 있고 가장 바깥쪽에 액션이 있는ㄱ 구조가 이상적임
- 액션이 호출시점에 의존하는 것을 제한함.