불변성의 모순 된 견해
TL / DR : 불변성은 JavaScript의 필요성보다 패션 트렌드입니다. React를 사용하는 경우 상태 관리에서 혼란스러운 디자인 선택 에 대한 깔끔한 해결 방법을 제공합니다 . 그러나 대부분의 다른 상황에서는 실제 클라이언트 요구를 충족시키는 것보다 이력서 를 채우는 데 더 많은 역할을하면서 도입 된 복잡성에 비해 충분한 가치를 추가하지 않습니다 .
긴 대답 : 아래를 읽으십시오.
왜 자바 스크립트에서 불변성이 그렇게 중요하거나 필요한가?
글쎄, 당신이 물어봐서 기뻐요!
얼마 전에 Dan Abramov 라는 재능있는 사람 은 순수한 기능과 불변성을 사용하는 Redux 라는 자바 스크립트 상태 관리 라이브러리를 작성했습니다 . 또한 아이디어를 이해하고 판매하기 쉽게 만드는 멋진 동영상 을 만들었습니다.
타이밍이 완벽했습니다. Angular 의 참신함 은 희미 해졌고 JavaScript 세계는 적절한 수준의 시원함을 가진 최신 것을 고칠 준비가되었습니다.이 라이브러리는 혁신적 일뿐 만 아니라 다른 Silicon Valley 강국에 의해 통제되고 있는 React 와 완벽하게 슬롯되었습니다 .
슬프게도 패션은 JavaScript 세계에서 지배합니다. 이제 아브라모프는 반신으로 찬사를 받고 있으며, 필사자 들만이 불변성 의 Dao에 자신을 맡겨야합니다.
객체를 돌연변이시키는 데 무엇이 잘못 되었습니까?
아무것도!
실제로 프로그래머는 변형 할 객체가있는 한 객체를 변형했습니다. 다시 말해 50 년 이상의 응용 프로그램 개발입니다.
왜 문제가 복잡합니까? 당신이 물건 cat
을 가지고 죽을 때, 당신은 정말로 cat
변화를 추적하기 위해 1 초가 필요 합니까? 대부분의 사람들은 그냥 말하고 cat.isDead = true
끝낼 것입니다.
(개체를 돌연변이시키는) 것이 일을 단순하게하지 않습니까?
예! .. 물론 그렇습니다!
특히 JavaScript에서는 실제로 데이터베이스와 같이 다른 곳에서 유지 관리되는 일부 상태의 뷰를 렌더링하는 데 가장 유용합니다.
업데이트해야 할 새 뉴스 개체가 있으면 어떻게합니까? ...이 경우 어떻게 달성합니까? 상점을 삭제하고 다시 만드시겠습니까? 배열에 객체를 추가하는 것이 비용이 덜 드는 작업입니까?
글쎄, 전통적인 접근 방식으로 News
객체를 업데이트하여 객체의 메모리 내 표현이 변경되고 사용자에게 표시되는보기가 변경 될 수 있습니다 ...
아니면 ...
섹시한 FP / Immutability 접근 방식을 시도하고 모든 변경 사항을 추적하는 배열에News
객체 의 변경 사항을 추가하여 배열 을 반복하고 올바른 상태 표현이 무엇인지 파악할 수 있습니다 (푸우!).
나는 여기에 무엇이 있는지 배우려고합니다. 나를 계몽하십시오 :)
패션이왔다 갔다. 고양이를 피부에 바르는 방법에는 여러 가지가 있습니다.
끊임없이 변화하는 프로그래밍 패러다임의 혼란을 겪게되어 유감입니다. 그러나 안녕하세요, 클럽에 오신 것을 환영합니다 !!
이제 불변성과 관련하여 기억해야 할 몇 가지 중요한 사항이 있으며, 순진한 사람 만이 할 수있는 열렬한 강도로 이러한 것들을 얻을 수 있습니다.
1) 다중 스레드 환경에서 경쟁 조건 을 피하기 위해 불변성은 훌륭 합니다 .
다중 스레드 환경 (C ++, Java 및 C #과 같은)은 둘 이상의 스레드가 객체를 변경하려고 할 때 객체를 잠그는 관행에 유죄입니다. 이것은 성능에는 좋지 않지만 데이터 손상의 대안보다 낫습니다. 그러나 모든 것을 불변으로 만드는 것만 큼 좋지는 않습니다 (주님 Haskell을 칭찬하십시오!).
하지만 그렇습니다! JavaScript에서는 항상 단일 스레드에서 작동합니다 . 웹 워커조차 (각각 별도의 컨텍스트 내에서 실행 ). 따라서 실행 컨텍스트 내 에서 스레드 관련 경쟁 조건을 가질 수 없으므로 (모든 사랑스러운 전역 변수 및 클로저) 불변성을 선호하는 요점은 창 밖으로 나옵니다.
(가, 그런 말을 데 입니다 메인 스레드에서 개체 하구에 대한 어떤 기대가없는 것이 오 웹 노동자, 순수한 기능을 사용하는 장점은.)
2) 불변성은 앱 상태에서 경쟁 조건을 피할 수 있습니다.
그리고 여기에 문제의 진정한 요점이 있습니다. 대부분의 (React) 개발자는 불변성과 FP가 어떻게 든 마법을 사용하여 응용 프로그램의 상태를 예측할 수 있다고 말할 것입니다.
물론 이것이 데이터베이스의 경쟁 조건을 피하고 모든 브라우저의 모든 사용자 를 조정 해야하며 WebSockets 와 같은 백엔드 푸시 기술이 필요 하다는 것을 의미하지는 않습니다 ( 아래에 더 자세히 설명) 앱을 실행하는 모든 사람에게 변경 사항을 브로드 캐스트합니다.
또한 JavaScript에서 응용 프로그램 상태를 예측할 수있게하기 위해 불변성이 필요한 일부 고유 한 문제가 있다는 의미는 아닙니다. React 이전에 프런트 엔드 응용 프로그램을 코딩 한 개발자라면이 사실을 알 수 있습니다.
이 혼란스러운 주장은 단순히 React 를 사용 하면 응용 프로그램 상태가 경쟁 조건에 더 취약 해지지 만 불변성으로 인해 고통을 덜 수 있음을 의미합니다. 왜? React는 특별하기 때문입니다. 일관성있는 상태 관리가 2 위를 차지하는 고도로 최적화 된 렌더링 라이브러리 로 설계 되었으므로 구성 요소 상태는 제어 할 수없는 비동기 이벤트 체인 (일명 "일방향 데이터 바인딩")을 통해 관리됩니다. 상태를 직접 변경하지 않는 것을 기억 하고 당신에게 의지 하십시오 ...
이러한 맥락에서, 불변성의 필요성이 JavaScript와 거의 관련이 없으며 React의 경쟁 조건과 많은 관련이 있음을 쉽게 알 수 있습니다. 응용 프로그램에 많은 상호 의존적 변경이 있고 무엇을 알아낼 수있는 쉬운 방법이 없다면 귀하의 주가 현재 있고 혼란 스러울 것이므로 불변성을 사용하여 모든 역사적 변화를 추적하는 것이 완벽 합니다.
3) 경쟁 조건은 엄청나게 나쁘다.
글쎄, 당신이 React를 사용한다면 그럴 수 있습니다. 그러나 다른 프레임 워크를 선택하면 드물게 나타납니다.
게다가, 당신은 일반적으로 다루어야 할 훨씬 더 큰 문제 가 있습니다 ... 의존성 지옥 같은 문제. 부풀린 코드베이스처럼. CSS 가로 드되지 않는 것처럼. 느린 빌드 프로세스 또는 반복을 거의 불가능하게하는 모 놀리 식 백엔드에 빠지는 것처럼. 미숙 한 개발자들과 마찬가지로 무슨 일이 일어나고 있는지 이해하지 못하고 엉망으로 만듭니다.
당신은 알고있다. 현실. 근데 누가 신경써?
4) 불변성은 참조 유형 을 사용하여 모든 상태 변경 추적의 성능 영향을 줄입니다.
진지하게, 상태가 바뀔 때마다 물건을 복사하려는 경우 현명한 지 확인하는 것이 좋습니다.
5) 불변성은 물건을 취소 할 수 있습니다 .
왜냐하면 .. 이것은 프로젝트 관리자가 요구하는 최고의 기능입니다. 맞습니까?
6) 불변 상태는 WebSocket과 함께 멋진 잠재력을 가지고 있습니다.
마지막으로, 상태 델타의 누적은 WebSocket과 함께 매우 매력적인 사례를 만들어 불변의 이벤트 흐름으로 상태를 쉽게 사용할 수 있습니다 ...
페니가이 개념을 포기하면 ( 최신 견해를 나타내는 조잡한 기록이 아니라 사건의 흐름 이된다) 불변의 세계는 거주하기에 마법의 장소가된다. 시간 을 초월 하는 이벤트 기반의 경이와 가능성 의 땅 . 그리고 완료되면 바로이 확실히 실시간 EASI 애플 리케이션을 만들 수 있습니다 어 달성하기를, 당신은 단지 그들이 할 수 있도록 관심있는 모든 사람에게 사건의 흐름 방송을 자신의 표현을 구축 본의와 공동 흐름에 자신의 변화를 다시 쓰기.
그러나 어떤 시점에서 당신은 깨어나 모든 경이와 마법이 무료로 오지 않는다는 것을 깨달았습니다. 열성적인 동료 들과는 달리, 이해 관계자 (즉, 돈을 지불하는 사람들)는 철학이나 패션, 그리고 그들이 팔 수있는 제품을 만들기 위해 지불하는 돈에 대해서는 거의 관심이 없습니다. 결론은 불변의 코드를 작성하기가 어렵고 깨지기 쉬우 며, 지원할 백엔드가 없다면 불변의 프론트 엔드를 갖는 것이 거의 없다는 것입니다. WebSockets와 같은 푸시 기술을 통해 이벤트를 게시하고 소비해야한다는 사실을 이해 관계자에게 마침내 설득 하면 프로덕션 환경에서 확장 해야 할 고통이 무엇인지 알게됩니다 .
이제 몇 가지 조언을 받아들이도록 선택해야합니다.
FP / Immutability를 사용하여 JavaScript를 작성하는 선택은 또한 응용 프로그램 코드 기반을 더 크고 복잡하고 관리하기 어렵게 만드는 선택입니다. 나는 당신이하고있는 일을 알지 못한다면 Redux 감속기 로이 접근법을 제한 할 것을 강력히 주장 할 것입니다 ... 그리고 계속 진행하고 불변성을 사용한다면 불변 상태를 전체 응용 프로그램 스택에 적용 하십시오. 그렇지 않으면 실제 가치를 놓치므로 클라이언트 측.
지금, 당신이 당신의 일에서 선택을 할 수있을만큼 운이 좋으면, 당신의 지혜를 시도하고 사용하고 지불하는 사람이 옳은 일을하십시오 . 당신의 경험, 장, 또는 당신의 주위에 무슨 일이 있었는지에 근거 할 수 있습니다. Resume Driven Development 또는 Hype Driven Development 접근법을 시도 할 수 있습니다 . 그들은 더 당신의 일이 될 수 있습니다.
즉, 일이 불변성에 대해 말했다 수는 있다는 것입니다 것입니다 다음 열풍 주위에 제공 적어도 때까지하는 당신이 이동 드리겠습니다 포인트, 동료와 당신이 유행합니다.
이제이 자기 치료 세션이 끝난 후이 기사를 내 블로그의 기사 => JavaScript의 불변성 : 대립적 견해로 추가했습니다 . 가슴에서 내리고 싶은 강한 감정이 있다면 자유롭게 답장하십시오.).