• Blog

  • Snippets

더 좋은 액션 만들기

May 12, 2024

쏙쏙들어오는 함수형 코딩

# 함수형 프로그래밍에선 값의 불변성을 위해 복사를 하고 처리하는데 비용이 너무 드는건 아닌가?

함수형 프로그래밍에선 객체를 업데이트할때 복사를 하고나서 처리하는데, 비용이 너무 드는건아닌가 생각이들지만, 최신프로그래밍 언어의 런타임과 가비지컬렉터는 불필요한 메모리를 효율적으로 잘 관리하기 때문에 복사를 하는게 좋음. 그리고 복사를 하고 처리를 한다면 원본데이터의 불변성을 지킬수있기때문에 좋음.

# 코드를 많이 쪼개다보면 코드의 양이 늘어나는데, 이게 과연 좋은 코드인가?

코드를 많이 쪼개면 각각 함수의 크기는 줄어들거고, 이해하기 쉬울것임. 그리고 테스트코드 짜기에도 용이해짐.

# 설계는 엉켜있는 코드를 푸는것이다.

하나의 역할을 하는 함수이고, 작은 단위의 함수일수록 어디든 코드를 조립 할 수 있고, 테스트가 용이해지며, 유지보수하기 쉬워짐.

# 문제.

함수를 하나의 분류에만 속하도록 풀어야함.

원래 코드

function update_shipping_icons(cart) {
var buy_buttons = get_buy_buttons_dom(); // buy button들의 dom을 다 불러온다.
for(var i=0; i<buy_buttons.length; i++) { // element를 반복문 돌린다.
var button = buy_buttons[i]; // 개별 buy button element
var item = button.item; // 개별 buy button element의 item
var new_cart = add_item(cart, item); // cart에 각각 개별 아이템을 추가한 list
if(gets_free_shipping(new_cart)) { // 무료배송이 가능한지 여부
button.show_free_shipping_icon(); // 무료배송 아이콘 노출
} else {
button.hide_free_shipping_icon(); // 무료배송 아이콘 숨김
}
}
}

나의 풀이

function get_item(buttonElement) {
return buttonElement.item;
}
function show_or_hide_icon(isShipping, buttonElement) {
if(isShipping) {
buttonElement.show_free_shipping_icon();
} else {
button.hide_free_shipping_icon();
}
}
function update_shipping_icons(cart) {
var buy_buttons = get_buy_buttons_dom();
for(var i=0; i<buy_buttons.length; i++) {
var button = buy_buttons[i];
var item = get_item(button);
var new_cart = add_item(cart, item);
show_or_hide_icon(gets_free_shipping(new_cart), button);
}
}

정답

function update_shipping_icons(cart) {
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;
var hasFreeShpping =
gets_free_shipping_with_item(cart, item);
set_free_shipping_icon(button, hasFreeShpping)
}
}
// cart와 item 관련 동작
function gets_free_shipping_with_item(cart, item) {
var new_cart = add_item(cart, item);
return get_free_shipping(new_cart);
}
// Dom 관련 동작
function set_free_shipping_icon(button, isShown) {
is(isShown) {
buttonElement.show_free_shipping_icon();
} else {
button.hide_free_shipping_icon();
}
}

내가 푼 풀이는 정확히 각자의 동작에 따라 나누지 못했음. 정확히 어떠한 동작이 있고, 그 동작들에 따라 함수를 분류하는 능력을 길러야 할 것 같음.