Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[노예찬] 챕터3 : 액션과 계산, 데이터의 차이를 알기 #33

Merged
merged 1 commit into from
May 22, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
169 changes: 169 additions & 0 deletions 챕터_3/노예찬.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,169 @@
## 액션과 계산, 데이터

- 액션 : 실행 시점과 횟수에 의존합니다. 다른 말로 부수 효과, 부수효과가 있는 함수, 순수하지 않은 함수라고 부르기도 합니다.
- 계산 : 입력으로 출력을 계산합니다. 다른 말로 순수 함수라고 부르기도 합니다.
- 데이터 : 이벤트에 대한 사실
- 개발의 모든 과정에서 이 3가지를 구분해서 생각할 수 있다.
- 문제에 대해 생각할 때 : 문제를 액션과 계산, 데이터로 나누어보면 코드를 작성할 때 특별히 주의해야 할 부분(액션)과 데이터로 처리해야 할 부분, 결정을 내려야 하는 부분(계산)을 명확히 알 수 있다.
- 코딩할 때 : 액션에서 계산을 분리할 수 있는지, 계산에선 데이터를 분리할 수 있는지 고민한다.
- 코드를 읽을 때 : 코드를 읽을 때도 3가지를 구분하며 읽는다.

## 쿠폰 보내는 과정을 구현하기

데이터 베이스에서 가져온 구독자 데이터

```javascript
const subscriber = {
email: "[email protected]",
rec_count: 16,
};
```

쿠폰 등급은 문자열

```javascript
const rank1 = "best";
const rank2 = "good";
```

쿠폰 등급을 결정하는 것은 함수

```javascript
function subCouponRank(subscriber) {
// 입력
if (subscriber.rec_count >= 10)
// 계산
return "best";
else return "good"; // 출력
}
```

이 함수는 명확하고 테스트하기 쉬우며 재사용가능하다.

쿠폰 데이터 :

```javascript
const coupon = {
code: "10PERCENT",
rank: "bad",
};
```

특정 등급의 쿠폰 목록을 선택하는 계산은 함수입니다.

```javascript
function selectCouponsByRank(coupons, rank) {
// 입력
const ret = [];
for (let c = 0; c < coupons.length; c++) {
let coupon = coupons[c];
if (coupon.rank === rank) ret.push(coupon.code);
}
return ret; // 출력
}
```

이 함수는 같은 입력에 대해 항상 같은 출력을 반환한다. 때문에 이 함수는 계산이라고 볼 수 있다.

이메일 데이터 만들기

```javascript
const message = {
from: "[email protected]",
to: "[email protected]",
subject: "Your weekly coupons inside",
body: "Here are your coupons",
};
```

구독자가 받을 이메일을 계획하는 계산

```javascript
function emailForSubscriber(subscriber, goods, bests){ // 입력
let rank = subCouponRank(subscriber);
if(rank === "best")
return {
from :"[email protected]",
to : subscriber.email,
subject : "Your best weekly coupons inside",
body : "Here are the best coupons : " + bests.join(", ")
};
else // rank === 'good'
return {
...
}
}
```

이 함수도 계산이다. 외부에 어떤 영향도 주지 않고, 입력 값에 따라 이메일을 결정하고 리턴한다.

보낼 이메일 목록

```javascript
function emailsForSubscribers(subscribers, goods, bests) {
const emails = [];
for (let s = 0; s < subscribers.length; s++) {
let subscriber = subscribers[s];
let email = emailForSubscriber(subscriber, goods, bests);
emails.push(email);
}
return emails;
}
```

이 함수도 계산이다.

이메일 보내기 :

```javascript
function sendIssue() {
const coupons = fetchCouponsFromDB();
const goodCoupons = selectCouponsByRank(coupons, "good");
const bestCoupons = selectCouponsByRank(coupons, "best");
const subscribers = fetchSubscribersFromDB();
const emails = emailsForSubscribers(subscribers, goodCoupons, bestCoupons);
for (let e = 0; e < emails.length; e++) {
const email = emails[e];
emailSystem.send(email);
}
}
```

이 함수는 액션이다.

## 데이터에 대해 자세히 알아보기

- 데이터 : 이벤트에 대한 사실
- 불변성 : 2가지 방법이 있다. 카피온라이트와 방어적 복사이다. 카피온라이트는 변경할 때 복사본을 만든다. 방어적 복사는 보관하려고 하는 데이터의 복사본을 만든다.
- 예시 : 구입하려는 음식 목록 / 이름 / 전화번호 / 음식 조리법
- 데이터의 단점 : 해석하지 않은 데이터는 쓸모없는 바이트일 뿐이다.

## 계산에 대해서 자세히 알아보기

- 계산 : 계산은 입력값으로 출력값을 만드는 것이다. 실행 시점과 횟수에 관계없이 항상 같은 입력값에 대해서 같은 출력값을 돌려준다. 일반적으로 계산을 순수함수라고 부른다.
- 액션보다 계산이 좋은 이유 :
- 테스트하기 쉽다
- 기계적인 분석이 쉽다.
- 계산은 조합하기 좋다.
- 계산을 사용하면서 걱정하지 않아도 되는 것 :
- 동시에 실행되는 것
- 과거에 실행되었던 것이나 미래에 실행할 것
- 실행 횟수
- 계산의 단점 : 계산과 액션은 실행하기 전에 어떤 일이 발생할지 알 수 없다는 단점이 있다.

## 액션에 대해서 자세히 알아보기

- 액션 : 액션은 외부 세계에 영향을 주거나 받는 것을 말한다. 그리고 액션은 실행 시점과 횟수에 의존한다. 일반적으로 액션은 순수하지 않은 함수, 부수 효과 함수라고 부른다.
- 액션의 의미 : 액션으로 외부 세상에 영향을 줄 수 있다. 따라서 어떤 일을 하려는지 아는 것이 중요하다.
- 액션은 쉽지 않다 : 액션은 다루기 어려운데, 그럼에도 불구하고 꼭 사용해야만하는 것이다. 함수형 프로그래머는 액션을 잘 사용한다.
- 가능한 액션을 적게 사용한다.
- 가능한 액션을 작게 만든다.
- 액션이 외부 세계와 상호작용하는 것을 제한할 수 있다.
- 액션이 호출 시점에 의존하는 것을 제한한다.

---

## TIPS

- 굳이 액션에서 뽑아내어 계산을 만드는 이유 : 가능한 계산을 사용하려고 하는 이유는 테스트하기 쉽기 때문이다. 이메일을 실제로 보내고 결과를 주는 시스템은 테스트하기 어렵다.
- 함수형 프로그래밍의 구현 순서 : 데이터 -> 계산 -> 액션 순으로 프로그래밍을 구현한다. 데이터를 파악하는 것으로 시작해서 계산과 추가 데이터를 도출한다. 그리고 액션으로 모든 것을 묶는다.
Loading