고양이와 코딩
[쏙쏙 들어오는 함수형 코딩] - CH1 ~ CH3 본문
chapter1 에서는 코드를 액션, 계산, 데이터로 구분하는 내용이 주로 이루어져 있습니다.
저는 기존에 프로젝트를 할때 제가 코드를 짜고 수정하기 보다는, 남의 코드를 보고 덧붙여 작성하는 일이 많았는데요,
그 때는 이유도 모른채 상대방의 폴더 구조를 보고 눈치껏 데이터와 함수를 분리해서 작성했던 기억이 있습니다.
챕터1을 읽고 왜 그렇게 코드를 작성했는지 명확히 이해할 수 있었습니다. (설명이 쉬운 덕입니다 😺)
액션에서 계산을 빼내기 -> 계산에서 데이터를 분리할 수 있는지 생각 -> 액션이 계산이 될 수 있는지,
반대로 계산은 액션이 될 수 있는지 생각의 확장
챕터2의 p.34를 읽고 강사님이 말씀하신 무작정 코드를 짜지 말고 그 전에 생각을 하라 ! 의 개념도 제대로 그려졌습니다.
평소에도 코드를 짤 때 아이패드에 구성 할 목록을 작성하긴 했지만, 내용을 더 구체화 시키는 편이 놓친 부분을 찾기도 쉽고
코드를 짤 때도 훨씬 수월할 것 같습니다.
실습
1. 주제를 하나 정해서 그에 대한 순서도를 생각한 뒤 한 페이지에 코드를 작성합니다.
2. 작성된 코드를 액션, 계산, 데이터로 분리합니다. (큰 틀에서 나누기)
3. 2번에서 분리했던 코드를 다시 한 번 확장해서 분리하도록 해 봅니다.
✏️ customer 데이터를 사용해서 주문 수량이 5개 이상인 손님들에게는 "배송비는 무료입니다." 메시지를,
5개 이하인 손님들에게는 "배송비는 2000원입니다." 라는 메시지를 보내고, 만약 주문 수량이 5개 미만이면서
country가 korea가 아닐 경우 배송비에 1000원을 추가해서 메시지를 보내는 코드를 작성해 봅시다.
액션 : 실행 시점이나 횟수 중 하나, 또는 둘 다에 의존
계산 : 같은 입력값을 가지고 있다면, 항상 같은 결괏값이 나타나야 함
데이터 : 데이터
고객 정보 받기 - 액션
고객 정보에서 country와 count 값 추출 - 액션
country가 korea인 고객과 아닌 고객 분리 - 액션
count가 5이상인 고객과 5미만인 고객 분리 - 액션
country가 korea가 아니면서 count가 5 미만인 고객 찾기 - 계산
보낼 메시지 - 데이터
배송비 - 데이터
일단 작성해본 전체 코드
const customers = [
{
id : 1,
name: "sam",
number : "000-0000-0000",
orderItem : "book",
country: "korea",
count : 3
},
{
id : 2,
name: "jam",
number : "111-1111-1111",
orderItem : "apple",
country : "korea",
count : 10
},
{
id: 3,
name: "pam",
number: "222-2222-2222",
orderItem : "bottle",
country : "america",
count: 4
},
{
id: 4,
name: "tam",
number: "333-3333-3333",
orderItem: "orange",
country: "japan",
count: 2
},
{
id: 5,
name: "ham",
number: "444-4444-4444",
orderItem: "flower",
country: "korea",
count: 6
}
]
const deliveryFee = 2000;
const additionalFee = 1000;
const deliveryMessages = (customers) => {
customers.forEach((customer) => {
let fee = 0;
if (customer.count < 5) {
fee += deliveryFee;
if (customer.country !== "korea") {
fee += additionalFee;
}
}
payDeliveryMessage(fee);
});
};
const payDeliveryMessage = (fee) => {
if (fee === 0) {
console.log("배송비는 무료입니다.");
} else {
console.log(`배송비는 ${fee}원입니다.`);
}
};
deliveryMessages(customers);
제가 문제 예시를 이상하게 들어서인지, 함수형 코딩이 이해가 잘 안되서인지.. 아무튼.. (⁍̥̥̥᷄д⁍̥̥̥᷅) 액션만 보여서..
최대한 액션을 사용하지 않아보자!! 하는 마음으로 코드를 수정했습니다.
const customers = [
{
id : 1,
name: "sam",
number : "000-0000-0000",
orderItem : "book",
country: "korea",
count : 3
},
{
id : 2,
name: "jam",
number : "111-1111-1111",
orderItem : "apple",
country : "korea",
count : 10
},
{
id: 3,
name: "pam",
number: "222-2222-2222",
orderItem : "bottle",
country : "america",
count: 4
},
{
id: 4,
name: "tam",
number: "333-3333-3333",
orderItem: "orange",
country: "japan",
count: 2
},
{
id: 5,
name: "ham",
number: "444-4444-4444",
orderItem: "flower",
country: "korea",
count: 6
}
]
const calculateDeliveryFee = (customer) => {
const deliveryFee = 2000;
const additionalFee = 1000;
if (customer.count < 5){
return deliveryFee + (customer.country !== "korea" ? additionalFee : 0);
}
return 0;
};
const deliveryMessages = (customers) => {
customers.forEach((customer) => {
const fee = calculateDeliveryFee(customer);
payDeliveryMessage(fee);
});
};
const payDeliveryMessage = (fee) => {
console.log(fee === 0 ? "배송비는 무료입니다." : `배송비는 ${fee}원입니다.`);
};
deliveryMessages(customers);
기존 코드에서 배달 수수료를 계산하는 로직을 좀 더 전용적인(?) 함수로 만들었습니다.
customers : 데이터
calculateDeliveryFee : 계산
deliveryMessage : 액션
payDeliveryMessage: 액션
(아마도 ...)
챕터3까지 책을 정독하고 실습 해 본 소감은, 읽을때는 정말 쏙쏙 들어오고 .. 책을 쉽게 잘 썼다는 생각이 들고..
함수형 코딩의 모든것을 통달한 기분이었지만, 일부러 내가 만든 어거지 문제에서 어거지로 함수형 코딩을 해 보려고 하니
작성하기 어려운 코드가 아님에도 어려움을 느꼈습니다. (어떻게 분리하지? 에서 머리 빙빙)
하지만 확실히 도움이 되는 내용이며, 저처럼 아직 많은 코드를 짜본게 아닌 초보자에게도 초장에 바른 습관을 들이기에
더할 나위 없이 좋은 책이라고 생각합니다. ٩( ᐕ)و
'함수형 코딩 스터디' 카테고리의 다른 글
[쏙쏙 들어오는 함수형 코딩] CH14 ~ CH15 (0) | 2024.03.19 |
---|---|
[쏙쏙 들어오는 함수형 코딩] CH12 ~ CH13 함수형 반복, 함수형 도구 체이닝 (0) | 2024.03.12 |
[쏙쏙 들어오는 함수형 코딩] - CH8 ~ CH9 계층형 설계 (0) | 2024.02.19 |
[쏙쏙 들어오는 함수형 코딩] CH6 ~ CH7 (얕은 복사, 깊은 복사) (0) | 2024.02.11 |
[쏙쏙 들어오는 함수형 코딩] - CH4 ~ CH5 (1) | 2024.02.04 |