모든 동작을 불변형으로 만들 수 있나요?
데이터가 중첩되어 있을 경우 기본적으로 카피-온-라이트를 통해 불변 동작 구현 필요
*중첩 (nested): 데이터 구조 안에 데이터 구조가 있는 경우
**깊이 중첩 (deeply nested): 중첩이 이어지는 경우
동작을 읽기, 쓰기 또는 둘 다로 분류하기
특성 | |
읽기 | - 데이터를 바꾸지 않음 (데이터에서 정보를 가져옴)
- 인자에만 의존 시 계산임 |
쓰기 | - 데이터를 바꿈 (바뀐 값이 어디서 사용될 지 모름 → 원칙 필요)
- 불변성 원칙(copy-on-write)에 따라 구현해야 함
- 불변성 원칙 내장 언어: 하스켈, 클로저, 엘름, 퓨어스크립트, 얼랭, 엘릭서 |
카피-온-라이트 원칙 세 단계
1.
복사본 만들기
2.
본사본 변경하기
3.
복사본 리턴하기
“카피-온-라이트는 쓰기를 읽기로 바꿈”
// 카피-온-라이트를 통해 함수를 변경하면서 불변성 원칙을 지키는 예시
function add_element_last(array, elem) {
var new_array = array.slice();
// 데이터를 직접 변경하지 않고 복사본을 변경
new_arrray.push(elem);
// 암묵적 입/출력 없이 리턴값을 반환함
return new_aaray;
}
JavaScript
복사