- 함수형 프로그래밍은 데이터의 불변성이 중요함.
- 이것을 지원하지 않는 언어에서도 불변성을 유지하게 하는 방법
- 카피-온-라이트(copy-on-write)
- 동작은
읽기
,쓰기
두 가지로 나눌 수 있음.- 제품 개수 가져오기 -> 읽기
- 제품 이름으로 제품 가져오기 -> 읽기
- 제품 추가하기 -> 쓰기
- 제품 이름으로 제품 빼기 -> 쓰기
- 제품 이름으로 제품 구매 수량 바꾸기 -> 쓰기
- 카피 온 라이트
- 복사본 만들기
- 수정하기
- 복사본 반환하기
- 카피 온 라이트는
쓰기
를읽기
로 변경함.- 왜? 기존 데이터를 변경하지 않고, 새로운 데이터를 만들어 냈으니까!
- 기본적으로 카피 온 라이트는 얕은 복사를 활용함
- 그렇다면, 배열 안의 객체를 수정할 때는 어떻게?
- 변경 함수를 하나 더 만들어서 해당 객체만 복사하면 됨
- 원래 코드
function setPriceByName(cart, name, price){ for(var i = 0; i < cart.length; i++>){ if(cart[i].name === name){ cart[i].price = price; } } }
- 카피 온 라이트
function setPriceByName(cart, name, price){ var cartCopy = cart.slice(); for(var i = 0; i < cartCopy.length; i++>){ if(cartCopy[i].name === name){ // cartCopy[i].price = price 는 안됨. // .slice() 함수는 얕은 복사를 하기 때문에 기존 값을 변경함. // 아래처럼 특정 객체만 복사해서 변경하는 함수를 새로 만들어서 사용하면 불변성을 유지할 수 있음. cartCopy[i] = setPrice(cartCopy[i], price); } } return cartCopy } function setPrice(item, newPrice){ var itemCopy = Object.assing({}, item); itemCopy.price = newPrice; return item_copy }
- 불변성을 지원하지 않는 언어에서는 불변성을 유지하도록 하는 것이 보일러 플레이트 코드가 될 수도 있음. 미리 공통 로직을 작성해 두는 것도 좋은 방법 중 하나임.