mingg IT

[함수형 프로그래밍] 7장 신뢰할 수 없는 코드를 쓰면서 불변성 지키기 본문

FrontEnd

[함수형 프로그래밍] 7장 신뢰할 수 없는 코드를 쓰면서 불변성 지키기

mingg123 2023. 10. 14. 15:26

 7장 신뢰할 수 없는 코드를 쓰면서 불변성 지키기

 

  • 레거시 코드나 신뢰할 수 없는 코드로부터 내 코드를 보호하기 위해 방어적 복사를 만듬
  • 얕은 복사와 깊은 복사를 비교함
  • 카피-온-라이트와 방어적 복사를 언제 사용하면 좋은지 알 수 있음 

 

이번 장 같은 경우에는 언제 얕은 복사를 사용하고, 언제 깊은 복사를 사용하면 좋을지 개념적으로 설명되어있다.  

사실 현업을 진행하면서 습관적으로 데이터의 불변성을 위해 복사를 사용하는데

 언제 어떤 복사를 이용해야할지 원칙적으로 정리해본 적은 없었다.

이번 장을 통해 그런 점들을 한번쯤 상기시키고 개념화 할 수 있어서 좋았다.

 

 

방어적 복사

 

  • 블랙 프라이데이 행사를 위해 장바구니 항목에 세일을 적용하고 싶다. 
  • 카피-온-라이트 원칙을 지키면서 안전하게 함수를 사용하는 원칙을 방어적 복사라고 한다. 

 

 

방어적 복사는 원본이 바뀌는 것을 막아줌

 

  • 안전지대에서 나가거나 들어오는 데이터를 깊은 복사를 함으로써, 안전지대 내에 있는 데이터들을 보호함 => 방어적 복사 
function add_item_to_cart(name, price) { 
    var item = make_cart_item(namer price); 
    shopping_cart = add_item(shopping_cart, item);
    var total = calc_total(shopping_cart);
    set_cart_total_dom(total);
    update_shipping_icons(shopping_cart);
    update_tax_dom(total) ;
    var cart_copy = deepCopy(shopping_cart); // black_friday 를 적용전 깊은 복사
    black_friday_promotion(cart_copy);
    shopping_cart deepCopy(cart__copy); 
}
  • 데이터가 안전한 코드에서 나갈 때 복사하기
  • 안전한 코드로 데이터가 들어올 때 복사하기

 

카피-온-라이트 VS 방어적 복사

 

  카피-온-라이트 방어적 복사
언제? 통제할 수 있는 데이터를 바꿀 경우  신뢰할 수 없는 코드와 데이터를 주고 받을 경우 
어디서? 안전지대 어디에서나 사용 가능  안전지대의 경계에서 데이터가 오고 갈 때 
복사 방식 얕은 복사(비용이 적음) 깊은 복사(비용이 많이듬)
규칙  1. 바꿀 데이터의 얕은 복사를 만듬
2. 복사본을 변경
3. 복사본을 리턴 
1. 안전지대로 들어오는 데이터에 깊은 복사를 만듬
2. 안전지대에서 나가는 데이터에 깊은 복사를 만듬 

 

 

깊은 복사 구현 방법

 

  • lodash 라이브러리의 clone.deep (난 무거워서 잘 사용하지 않긴함) 
  • JSON.parse(JSON.stringfy) (함수 같은경우에는 복사가 안됨)
  • 직접 함수로 구현 
function deepCopy(thing) {
    if (Array.isArray(thing)) {
        var copy = [];
        for (var i = 0; i < thing.length; i++)
            copy.push(deepCopy(thing[i]));
        return copy;
    } else if (thing === null) {
        return null;
    } else if (typeof thing === "object") {
        var copy = {};
        var keys = Object.keys(thing);
        for (var i = 0; i < keys.length; i++) {
            var key = keys[i];
            copy[key] = deepCopy(thing[key]);
        }
        return copy;
    } else {
        return thing;
    }
}

 

요점

 

  • 방어적 복사는 불변성을 구현하는 원칙임. 데이터가 들어오고 나갈때 복사본을 만듬 
  • 방어적 복사는 깊은 복사를 수행함. 카피-온-라이트보다 비용이 더 듬
  • 방어적 복사는 불변성 원칙을 구현하지 않은 코드로 부터 내 코드를 보호해줌 
  • 복사본이 많이 필요하지 않기 때문에 보통 카피-온-라이트를 많이 사용함. 방어적 복사는 신뢰할 수 없는 코드와 함께 사용할때만 ㅅ용함
  • 깊은 복사는 위에서 아래로 중첩된 데이터 전체를 복사함. 
  • 얕은 복사는 필요한 부분만 최소한으로 복사함 
Comments