반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 시스템설계면접팁
- 가상면접3장
- gitsquash
- react-ga
- 시스템설계방법
- Git commit 합치기
- 디자인패턴
- 테스트코드책
- 리액트구글애널리틱스
- cypressBDD
- formik react-query submitting not working
- git commit 협업
- cypress React
- 전략패턴
- 가상면접으로대규모시스템
- git commit merge
- 시스템설계면접
- awss3
- FirebaseAnalytics
- 시스템설계
- 시스템설계면접예시
- 헤드퍼스트전략패턴
- 리팩터링2판테스트
- 가상면접2장
- 리팩토링2판4장
- file not found Error
- formik submitting not working
- s3이미지다운로드됨
- react
- git squash
Archives
- Today
- Total
mingg IT
[함수형 프로그래밍] 4장 액션에서 계산 빼내기 본문
4장 액션에서 계산 빼내기
함수형 프로그램 적용 전 장바구니 예시
var shopping_cart = [];
var shopping_cart_total = 0;
// 장바구니 카트에 추가
function add_item_to_cart(name, price) {
shopping_cart.push({
name: name,
price: price,
});
calc_cart_total();
}
// 장바구니 총액 계산
function calc_cart_total() {
shopping_cart_total = 0;
for (var i = 0; i < shopping_cart.length; i++) {
var item = shopping_cart[i];
shopping_cart_total += item.price;
}
set_cart_total_dom();
update_shipping_icons();
update_tax_dom();
}
// 일정 금액 이상이면 무료 배송 아이콘 보여줌
function update_shipping_icons() {
var buy_buttons = get_buy_buttons_dom();
for (var i = 0; i < buy_buttons.length; i++) {
var button = buy_buttons[i];
var item = button.item;
if (item.price + shopping_cart_total >= 20) button.show_free_shipping_icon();
else button.hide_free_shipping_icon();
}
}
//세금 계산
function update_tax_dom() {
set_tax_dom(shopping_cart_total * 0.1);
}
테스트 재사용시 고려해야할 점
- DOM 업데이트와 비즈니스 규칙은 분리되어야함
- 전역변수가 없어야함
- 전역변수에 의존하지 말아야함
- 함수가 결과값을 리턴해야함
함수형 프로그래밍 기법
- 액션에서 계산 빼내기
- 계산 추출 단계
- 계산 코드를 찾아 빼냄
- 새 함수에 암묵적 입력과 출력을 찾음
- 암묵적 입력은 인자로 암묵적 출력은 리턴값으로 바꿈
내가 수정한 코드 예시
// var shopping_cart = [];
// var shopping_cart_total = 0;
// 장바구니 카트에 추가
function add_item_to_cart(name, price) {
var shopping_cart = add_shopping_cart(name, price);
calc_cart_total(shopping_cart);
}
function add_shopping_cart(name, price) {
var shopping_cart = [];
shopping_cart.push({
name: name,
price: price,
});
return shopping_cart;
}
// 장바구니 총액 계산
function calc_cart_total(shopping_cart) {
shopping_cart_total = cal_total(shopping_cart);
set_cart_total_dom();
update_shipping_icons(shopping_cart_total, 20);
update_tax_dom(shopping_cart_total, 0.1);
}
function cal_total(shopping_cart) {
shopping_cart_total = 0;
for (var i = 0; i < shopping_cart.length; i++) {
var item = shopping_cart[i];
shopping_cart_total += item.price;
}
return shopping_cart_total;
}
// 일정 금액 이상이면 무료 배송 아이콘 보여줌
function update_shipping_icons(total, price) {
var buy_buttons = get_buy_buttons_dom();
for (var i = 0; i < buy_buttons.length; i++) {
var button = buy_buttons[i];
var item = button.item;
if (item.price + total >= price) button.show_free_shipping_icon();
else button.hide_free_shipping_icon();
}
}
//세금 계산
function update_tax_dom(total, taxPercent) {
set_tax_dom(total * taxPercent);
}
- 전역변수를 모두 제거함
- 상수값(20, 0.1등) 을 매개변수로 전달받도록 수정함
책에서 수정한 코드 예시
var shopping_cart = [];
var shopoing_cart_total = 0;
function add_item_to_cart(name, price) {
shopping_cart = add_item(shopping_cart, name, price);
calc_cart_total();
}
function calc_cart_total() {
shopping_cart_total = calc_total(shopping_cart);
set_cart_total_dom();
update_shipping_icons();
update_tax_dom();
}
function update_shipping_icons() {
var buttons = get_buy_buttons_dom();
for (var i = 0; i < buttons.length; i++) {
var button = buttons[i];
var item = button.item;
if (gets_free_shipping(shopping_cart_total, item.price)) button.show_free_shipping_icon();
else button.hide_free_shipping_icon();
}
}
function update_tax_dom() {
set_tax_dom(calc_tsx(shopoing_cart_total));
}
function add_item(cart, name, price) {
var new_cart = cart.slice();
new_cart.push({
name: name,
price: price,
});
return new_cart;
}
function calc_total(cart) {
var total = 0;
for (var i = 0; i < cart.length; i++) {
var item = cart[i];
total += item.price;
}
return total;
}
function gets_free_shipping(total, item_price) {
return item_price + total >= 20;
}
function calc_tax(amount) {
return amount * 0.1;
}
내가 작성한 코드와의 차이점
- gets_free_shipping을 함수로 따로 빼서 계산함
- 전역변수를 아직 제거하지 않음
- 20, 0.1 등 인자값을 함수안에 포함되어있음
요점
- 액션은 암묵적인 입력 또는 출력을 가지고 있음
- 계산의 정의에 따르면 계산은 암묵적인 입력이나 출력이 없어야함
- 전역변수는 일반적으로 암묵적 입력 혹은 출력이 됨
- 암묵적 입력은 인자로 바꿀 수 있음
- 암묵적 출력은 리턴값으로 바꿀 수 있음
- 함수형 원칙을 적용하면 액션은 줄어들고 계산은 늘어남
'FrontEnd' 카테고리의 다른 글
[함수형 프로그래밍] 6장 변경 가능한 데이터 구조를 가진언어에서 불변성 유지하기 (0) | 2023.10.14 |
---|---|
[함수형 프로그래밍] 5장 더 좋은 액션 만들기 (0) | 2023.10.09 |
[함수형 프로그래밍] 3장 액션과 계산, 데이터의 차이를 알기 (0) | 2023.09.23 |
[함수형 프로그래밍] 2장 현실에서의 함수형 사고 (0) | 2023.09.17 |
[함수형 프로그래밍] 1장 쏙쏙 들어오는 함수형 코딩에 오신 것을 환영합니다 (0) | 2023.09.17 |
Comments