0411_immutable

Author Avatar
John Doe Apr 11, 2018

why Immutable

맨 처음에 왜 ??? 라는 점이 머리 속에서 떠나지 않았다.
그리고 문서들 찾아보면서, 다시 한 번 역시 개발자는 영어를 잘해야 한다.
좋은 글+ 찾기 쉬운 것은 전부 영어 !!!!

1
2
3
4
Mutable의 가지는 단점을 보완 
이전 상태를 되돌리기가 어렵다.
이전 상태와 현재상태를 유지하면서 동작해야 하는 경우가 존재할 수 있다.
새로운 데이터를 만듬으로써, 데이터의 변경 여부를, 쉽게 판단할 수 있다.(oldData !== newData)
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48

하지만 그냥 js함수 같은 부분 mutable로 짜오면서 굳이 왜 써야 되냐는 질문이 머릿속에 빠지지가 않았다.
여기서는 그냥 디버깅 툴로 다 추적할 수 있지 않나?

내가 내린 결론은 프로그래머가 코드 블럭을 멈추면서 보는 그런 디버깅이 아닌 것 같다.
ex) 브라우저의 뒤로가기, 실행 및 ui의 관점에서

+ 뒤에 코멧님이 답변해주신 일일이 체크해야 되는 부분
참조만으로 변경을 감지할 수 있게 해줄 수 있다.

* 함수형 프로그래밍에서의 지향점

순수함수 불변성
Redux, React
ShouldComponent Update,
Setstate ...
등등, immutable을 통해서 데이터 변경 및 흐름을 파악한다.

* 성능에 대한 질문은

알아본 바로 아직 정확하지는 않지만,
최적화 및 기억을 통해서 거의 차이가 없다. +_+

처음엔 immutable이 더 빠른지 알았다. 더 빠를수도 있고 아니고?.?
이 부분은 조금 더 알아봐야 될 듯 하다. 데이터에 따라서 다르다?
어찌되었든 성능에는 거의 차이가 없다고 하면 이 패러다임에서
성능은 주안점이 아니다.

데이터추적, 변경인지용이, 함수형


Simplified data flow through apps.
Removed requirement for defensive copying of data.
Optimisation through data change detection.
Performance enhancement through memoization

Commet님의 답변

불변객체를 이용하는 이유라고하면 주로 "상태 변경" 에 대한 얘기일 것 같습니다. 상태가 Mutable 하다면 어쩔 수 없이 상태 변경을 매번 추적하기 위해 이 상태를 "깊게" 비교해야하는데, 데이터가 불변함을 보장한다면 간단히 참조 정도만 비교하고 넘어갈 수 있으니까요.
여기서 불변이라함은 어떤 참조가 가르키는 메모리의 구조가 절대 바뀌지 않는 걸 보장하는 것입니다.

동등(equals)한 값에 대해 항상 같은 참조가 제공되도록 하는데 이걸 구현하는 가장 쉬운방법이 "변경하지 않고 복사해서 쓰기" 입니다.

물론 Immutable 라이브러리는 단순히 복사만 하진 않습니다만, 그렇다고해도 성능외적인 장점(참조에 대한 신뢰, 레이스컨디션 회피 등)은 가져갈 수 있죠

레이스컨디션? 회피?

게임 같이 성능 최적화가 중요한 영역에서는 다른 기법을 쓰는 것 같다고 한다.

Immutable 참고문헌

미디엄글+_Immutable.js

does_immutability-hurt-performance-in-javascript

why-is-immutability-so-important-or-needed-in-javascript

todoList 수정

1
2
3
4
5
6
7
8
9
10
11
12
13
Objcet.assign이라는 새로운 객체를 할당해줄 수 있는 클래스 메소드로 새 데이터를 쓰고 이 데이터를 업데이트해주는 형식으로 수정해보았다. 

function objUpdateByKeyValue(state, property, item ) {
return Object.assign({}, state, {[property]: item});
}

function objUpdate(state, ...change){
return Object.assign({}, state, ...change)
}

대체로 자바스크립트 인스턴스에서 새로운 것을 만들어서 반환해주는
map, filter, slice, concat, 등등을 잘 활용해서 조작하면 될 것 같다.
+ es6 spread!!!

JSon Test

  • equal 함수
  • Jest -> 살펴보기
  • TDD

이슈

음 늦은 점 + 뒤에 집중도 좀 낮아짐

코딜리티 05-3

오늘은 꼭 한 시간…

오늘 공부하면서 그냥 느낌

  • 질문을 많이 하자
  • 다른 사람들 코드도 많이 보고 좋은 것을 흡수하자

삽질 인스턴스 메소드에서 매개변수를 this로 접근해서 undefined나는 점을 한 참을 찾았다. 아오 …

equal(fn(a,b),value)
이퀄 함수를 만들 떄
그냥 equal(input===value)인 건데 …
들어오는 함수 fn => (..args).. 막 이렇게 풀려고 했었다.
아오 그냥 함수 실행시키고 결과 값이 들어온건데

다른사람은 투두의 다른 기능도 붙이는 것 같은데 후우… 한 번 다 보고 추후에 CRUD기능 다시 다 있는 부분도 작업 한 번 해봐야곘다.

  • 성실성도 내 리듬은 계속 유지하자 오늘 같이 평소보다 많이 늦지 맙시다.

시간보다 효율성에 고민을 많이 해보자

  • call, apply, bind, this

컨텍스트 여기 제대로 잘 공부하자 대충 안다는 점이 확 느껴졌다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var c = {
a: function(){
console.log('this',this)
}
}

c.a() -> this는 c를 나타낸다.
기존에 알고 있는 부분

var d = c.a
d()를 실행시키면 -> this는 전역객체 window를 가지고 온다

d => c.a를 가리키고 있어서 실행시키면 c의 메소드니까 c를 나타낼 줄 알았는데

this바인딩이 실행하는 부분에서 d가 주체니까 d에 this가 바인딩 된다 우선 이렇게 생각하고...
아래 글 읽어보고 수정하기 !!!

실행컨텍스트_클로저
여기 정독하기!!!