관리 메뉴

흰둥씨의 개발장

[함수형 코딩#3] 액션, 계산, 데이터 차이알자 본문

함수형 프로그래밍/쏙쏙 들어오는 함수형 코딩

[함수형 코딩#3] 액션, 계산, 데이터 차이알자

돈워리비해삐 2023. 6. 28. 01:36

액션 : 실행시점과 횟수에 의존함 (ex)이메일 보내기, 데이터 베이스 읽기

계산 : 입력과 출력을 계산함, 어떤 일을 결정하는 것 (ex) 최댓값 찾기, 이메일 주소가 올바른지 확인하기 

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


1. 문제에 대해 생각할 때 
ㄴ 코딩 시작전, 문제 고민단계에서도 문제를 액션, 계산, 데이터로 나눠볼 수 있음

2. 코딩할 때 
ㄴ액션과 계산과 데이터를 분리해서 코드작성하도록 고민할 것 

3. 코드 읽을 때
ㄴ액션은 시간에 의존하기 때문에
ㄴ숨어있는 액션까지 잘 파악하고, 계산, 데이터로 나눠지지 않은 부분을 리팩토링 하도록 생각해보기 

***참조 투명(referentially transparent) ?
     계산의 결과값은 동일한 인자를 넣으면 동일한 값을 출력냄
     => 계산 호출코드 = 계산 결과로 취급 

 


 

데이터

ㄴ이벤트에 대한 사실 (=일어난일의 결과 , 사실정보는 추론, 토론, 계산을 위한 기초정보로 사용)
ㄴ사실은 변하지 않아 영구 기록 가능함 

함수형 프로그래밍에서 불변 데이터 구조를 만들기 위한 법칙
  1. 카피 온 라이트(copy-on-write) : 변경시 복사본을 만들자
  2. 방어적 복사(defensive copy) : 보관하려고 하는 데이터의 복사본을 만들자

데이터 장점 
  1. 직렬화 : 직렬화 된 데이터는 전송하거나 디스크 저장, 읽기가 쉬움
  2. 통일성 비교 : 데이터는 서로 비교하기가 쉬움 
  3. 자유로운 해석 : 데이터는 여러가지로 해석 할 수 있음 

데이터 단점
ㄴ자유로운 해석이 장점 이지만, 이 말의 의미는 " 해석이 반드시 필요하다 "는 뜻 (데이터 자체로는 할수있는것이 없음)
ㄴ계산은 해석 안해도 실행가능

웹요청을 해석하는 여러 단계...
ㄴ 바이트 => 문자 => JSON => 컬렉션 => 사용자 정보

소프트웨어 엔지니어는 "정보를 처리하는 시스템"을 만드는 사람 
ㄴ정보를 받고
ㄴ처리후에 (오류 날수 있음)
ㄴ결정을 하고(무엇을 저장하고, 누구에게 전송할지...)
ㄴ결정에 따라 특정행동취함(이메일 보내기)


계산

ㄴ계산은 함수로 구현함
ㄴ외부세계에 영향을 주고 받지 않음
ㄴ계산은 언제 실행되는지(시점,순서), 얼마나 실행되는지(횟수,반복) 에 의존하지 않음 
ㄴ순수함수(=수학함수)

액션을 계산으로 바꿀수 있다면 그렇게 하는 것이 좋은 편 (계산의 장점)
ㄴ계산은 test하기 쉽기 때문에 / 기계적 분석이 쉬움 / 계산들을 조합해서 더 큰 계산을 만들 수 있음 / 이해 쉬움
ㄴ액션은 test하기 어려움 

계산을 쓰면서 걱정 하지 않아도 되는 것들 
ㄴ동시에 실행되는 것
ㄴ과거에 실행되었던 것이나 미래에 실행 할 것
ㄴ실행 횟수 

계산의 단점 
ㄴ예측값은 있을 수 있지만, 결국 실행해야 결과를 얻음 


액션

ㄴ외부세계에 영향을 주거나, 받는 것
ㄴ액션은 언제 실행되는지(시점,순서), 얼마나 실행되는지(횟수,반복) 에 의존함
ㄴ순수하지 않은 함수 (=부수효과 있는 함수) 
ㄴ함수를 호출하는 것, 메서드 호출, 생성자 함수 호출, 표현식(변수 참조, 속성참조, 배열참조...), 상태 (값 할당, 속성 삭제)
ㄴ언제 호출했는지, 부르는 시점에 따라 값이 달라지는지, 값을 할당하거나 삭제한 시점을 토대로 다른 코드에 영향을 주는지 
ㄴex) ajax요청 보내기 , 이메일 보내기, 계좌에서 인출하기, 전역변수 값 할당 

쉽지 않은 액션을 잘 다루는 방법
  1. 가능한 액션은 적게 사용하기 
  2. 액션은 가능한 작게 만들기 
  3. 액션이 외부 세계와 상호작용하는 것 제한하기 
  4. 액션이 호출시점에 의존하는 것을 제한하기