함수형 코딩에서는 액션과 계산, 데이터를 구분하는 일을 아주 중요하게 생각한다.
문제에 대해 생각할 때도, 코딩을 할 때도, 코드를 읽을 때도 모두 액션, 계산, 데이터로 나누어 생각할 수 있다.
우리가 일상에서 자주 하는 장보기를 액션, 계산, 데이터로 나눌 수 있다.
🤔 오잉 다 액션 아닌가요?
위 액션들을 아주 작게작게 쪼개어 보면 장보기가 액션으로만 이루어져 있지 않다는 것을 알 수 있다.
냉장고를 확인하는 일은 확인하는 시점이 중요하기 때문에 액션이다. 거기에 냉장고에 있는 물건들은 데이터라고 할 수 있으며 현재 재고라고 가정해보자.
구입하는 일은 액션이지만, 구입 과정을 작게 작게 쪼개어 볼 수 있다.
액션
데이터
데이터
계산
데이터
이렇게 액션으로만 이루어져 있던 장보기를 한 번 작게 작게 쪼개어 보았다.
액션
데이터
데이터
계산
데이터
액션
액션
액션
❗️ 😃 아하 이렇게 반복하면 액션, 계산, 데이터를 많이 찾을 수 있겠네용
처음에 생각했던 장보기를 위한 행동들에 더 많은 행동들이 추가된 것을 알 수 있다. 점점 많아지면 복잡하다는 생각이 들 수 있겠지만, 액션에 숨어있는 다른 액션이나 계산 또는 데이터를 발견하기 위해 나눌 수 있는 만큼 나누는 것이 좋다.
쿠폰독은 쿠폰에 관심 있는 구독자들에게 이메일로 쿠폰을 매주 보내주는 서비스이다. 쿠폰독에서는 사용자를 더 늘리기 위해 친구 10명을 추천하면 더 좋은 쿠폰을 보내주려고 한다. 10명 이상 추천하면 Best 쿠폰을, 10명 이하는 Good 쿠폰을 보내줄 것이다.
이러한 서비스를 만들기 위해 코드를 작성한다고 했을 때 작성해야 하는 코드를 액션, 계산, 데이터로 분류해보자.
액션
액션
계산
액션
데이터
데이터
데이터
계산
데이터
데이터
데이터
데이터
데이터
쿠폰을 이메일로 보내려면 데이터베이스에서 구독자를 가져와야 한다.
액션
데이터
액션
데이터
계산
데이터
구독자 목록과 쿠폰 목록을 가져와 이메일 목록 계획하기 라는 계산을 조금 더 작은 계산으로 나눌 수도 있다.
데이터
계산
데이터
계산
데이터
어떤 구독자가 good 쿠폰을 받을지, best 쿠폰을 받을지 결정하는 것을 계산으로 만들 수 있다.
데이터
계산
데이터
이보다 더 작게 작게 나눌 수도 있고 더 작게 나눌 수록 구현하기 쉽다. 하지만 충분히 구현하기 쉽다고 생각이 되면 이제 나누는 것을 멈추어야 한다.
액션
함수형 프로그래밍에서는 액션보다 게산을 사용하려고 한다.
function figurePayout(affiliate) {
var owed = affiliate.sales * affiliate.commission;
if(owed > 100)
sendPayout(affiliate.bank_code, owed); // 이 코드만 액션일까요?
}
function affiliatePayout(affiliates) {
for(var a = 0; a < affiliates.length; a++)
figurePayout(affiliate[a]);
}
function main(affiliates) {
affiliatePayout(affiliates);
}
제나가 자회사에 수수료를 보내기 위해 만든 코드이다. sendPayout()
함수는 실제 은행 계좌로 송금하는 액션이다.
🤔 그런데 제나가 작성한 코드가 함수형 코드일까요? 액션 코드는 하나만 있는 걸까요?
제나가 말한 액션 코드 한 줄부터 시작해보면 실제 돈을 송금하는 코드이다. 호출 시점이나 횟수가 중요하기 때문에 액션이라고 할 수 있다.
그런데 액션의 정의에 따르면 액션은 호출 시점이나 횟수에 의존한다. figurePayout()
함수는 액션인 sendPayout()
함수를 호출하기 때문에 이 함수 역시 호출 시점과 횟수에 의존하게 된다. 그래서 figurePayout()
도 액션이 된다.
또 affiliatePayout()
함수도 액션인 figurePayout()
함수를 호출하기 때문에 affiliatePayout()
함수도 액션이 된다.
같은 논리로 액션인 affiliatePayout()
함수를 호출하는 main()
함수도 액션이 된다.
그래서 제나가 작성한 코드는 모두 액션이다.
액션을 부르는 함수가 있다면 그 함수도 액션이 된다. 이런 식으로 작은 액션 하나가 코드 전체로 퍼져 나가게 된다.
함수 호출
alert("Hello world");
팝업 창이 뜨는 것은 액션이다.
메서드 호출
console.log("hello");
콘솔에 출력한다.
생성자
new Date();
부르는 시점에 따라 다른 값을 가지기 때문에 액션이다.
표현식 - 변수 참조
y
y가 공유되고 변경 가능한 변수라면 읽는 시점에 따라 값이 다를 수 있다.
표현식 - 속성 참조
user.first_name
user가 공유되고 변경 가능한 객체라면 읽는 시점에 따라 값이 다를 수 있다.
표현식 - 배열 참조
stack[0]
stack이 공유되고 변경 가능한 배열이라면 첫번째 항목은 읽는 시점에 따라 값이 다를 수 있다.
상태 - 값 할당
z = 3;
공유하기 위해 값을 할당했고 변경 가능한 변수라면 다른 코드에 영향을 주기 때문에 액션이다.
상태 - 속성 삭제
delete user.first_name;
속성을 지우는 것은 다른 코드에 영향을 주기 때문에 액션이다.
혹시나 잘못된 정보가 있다면 댓글로 알려주세요 ! 저의 성장의 큰 도움이 될 것 같습니다.🌱