Değişmezliğe Karşıt Bir Bakış
TL / DR: Değişmezlik, JavaScript'te bir zorunluluktan çok bir moda trendi. React kullanıyorsanız , devlet yönetimindeki bazı kafa karıştırıcı tasarım seçeneklerine düzgün bir çözüm sağlar . Bununla birlikte, diğer birçok durumda, getirdiği karmaşıklığa yeterince değer katmayacak ve bir özgeçmiş doldurmak için daha fazla hizmet verecektir gerçek bir müşteri ihtiyacını karşılamaktan daha fazla .
Uzun cevap: aşağıyı okuyun.
Javascript'te değişmezlik neden bu kadar önemli (veya gerekli)?
Sorduğunuza sevindim!
Bir süre önce Dan Abramov adında çok yetenekli bir adam , Redux adlı saf fonksiyonları ve değişmezliği kullanan bir javascript devlet yönetimi kütüphanesi yazdı . Ayrıca , fikri gerçekten anlaşılmasını (ve satmasını) kolaylaştıran bazı harika videolar da yaptı.
Zamanlama mükemmeldi. Yeniliği açısal solma edildi ve JavaScript Dünya serin sağ derecesini vardı son şey sabitleşmek hazırdı ve bu kütüphane sadece yenilikçi değil ama mükemmel oluklu React diğeri tarafından sokak sokak hangi Silikon Vadisi güç merkezi .
Ne yazık ki, JavaScript dünyasında moda hakimdir. Şimdi Abramov yarı tanrı olarak selamlanıyor ve hepimiz sadece ölümlüler kendimizi Değişmezlik Dao'una tabi tutmalıyız ... Mantıklı olsun ya da olmasın.
Nesneleri değiştirirken yanlış olan ne?
Hiçbir şey değil!
Aslında, programcılar mutasyona uğrayan nesneler olduğu sürece nesneleri eritiriyorlar. 50 yıldan fazlaYani fazla uygulama geliştirme.
Ve neden işleri karmaşıklaştırıyor? Nesneniz olduğunda cat
ve öldüğünde, cat
değişikliği izlemek için gerçekten bir saniyeye mi ihtiyacınız var ? Çoğu insan bunu söyler cat.isDead = true
ve onunla yapılır.
(Nesneleri değiştirerek) işleri basitleştirmiyor mu?
EVET! .. Elbette öyle!
Özellikle JavaScript'te, pratikte başka bir yerde (veritabanında olduğu gibi) korunan bazı durumların görüntülenmesi için en kullanışlı olanıdır.
Güncellenmesi gereken yeni bir Haber nesnesim varsa ne olur? ... Bu durumda nasıl başarabilirim? Mağaza silinsin mi ve yeniden oluşturulsun mu? Diziye bir nesne eklemek daha ucuz bir işlem değil midir?
Geleneksel yaklaşıma gidebilir ve News
nesneyi güncelleyebilirsiniz , böylece o nesnenin bellek içi gösterimi değişir (ve kullanıcıya görüntülenen görünüm, ya da biri umar) ...
Veya alternatif olarak...
Seksi FP / Immutability yaklaşımını deneyebilir ve her tarihsel değişikliği izleyen bir diziye değişikliklerinizi News
nesneye ekleyebilirsiniz, böylece dizi üzerinden yineleyebilir ve doğru durum gösteriminin ne olması gerektiğini anlayabilirsiniz (vay!).
Burada ne olduğunu öğrenmeye çalışıyorum. Lütfen beni aydınlatın :)
Moda gelir ve gider dostum. Bir kedinin derisini almanın birçok yolu vardır.
Sürekli değişen bir dizi programlama paradigmasının karışıklığına katlanmak zorunda olduğunuz için üzgünüm. Ama hey, KULÜBE HOŞGELDİNİZ !!
Şimdi, Değişmezlik ile ilgili hatırlanması gereken birkaç önemli nokta var ve bunları sadece naifliğin toplayabileceği ateşli yoğunluk ile atacaksınız.
1) Değişmezlik, çok iş parçacıklı ortamlarda yarış koşullarından kaçınmak için harika .
Çok iş parçacıklı ortamlar (C ++, Java ve C # gibi), birden fazla iş parçacığı bunları değiştirmek istediğinde nesneleri kilitleme uygulamasından suçludur. Bu performans için kötü, ancak veri bozulması alternatifinden daha iyidir. Ve yine de her şeyi değişmez yapmak kadar iyi değil (Lord Haskell'i övüyor!).
AMA ALAS! JavaScript'te her zaman tek bir iş parçacığında çalışırsınız . Web çalışanları bile (her biri ayrı bir bağlam içinde çalışır ). Dolayısıyla , yürütme bağlamınızda (tüm bu güzel küresel değişkenler ve kapanışlar) iş parçacığıyla ilgili bir yarış koşuluna sahip olamayacağınız için, Değişmezlik lehine ana nokta pencereden dışarı çıkar.
(Orada, söyledikten olan ana iş parçacığı üzerinde nesneler ile işe yaramaz hakkında hiç beklentilere sahip olacak olmasıdır web işçileri, saf işlevlerini kullanarak bir avantajdır.)
2) Değişmezlik, bir şekilde uygulamanızın durumundaki yarış koşullarından kaçınabilir.
Ve işte konunun asıl noktası, çoğu (React) geliştiricisi, Immutability ve FP'nin bir şekilde başvurunuzun durumunun öngörülebilir olmasını sağlayan bu büyüyü çalıştırabileceğini söyleyecektir.
Tabii ki bu , veritabanındaki yarış koşullarından kaçınabileceğiniz anlamına gelmez, bunu kaldırmak için tüm tarayıcılardaki tüm kullanıcıları koordine etmeniz gerekir ve bunun için WebSockets ( bununla ilgili daha fazla bilgi), uygulamayı çalıştıran herkese değişiklikler yayınlayacak.
Ayrıca JavaScript'te, uygulama durumunuzun öngörülebilir olması için değişmezliğe ihtiyaç duyduğu bazı doğal bir sorun olduğu anlamına gelmez, React size bunu bildirmeden önce ön uç uygulamaları kodlayan herhangi bir geliştirici.
Bu oldukça kafa karıştırıcı iddia , React ile başvuru durumunuzun yarış koşullarına daha yatkın olacağı anlamına gelir , ancak bu değişmezlik bu acıyı ortadan kaldırmanıza izin verir. Neden? React özel olduğu için , devlet yönetimi neredeyse sonradan düşünülen son derece optimize edilmiş bir görüntüleme kütüphanesi olarak tasarlanmıştır ve bu nedenle bileşen durumu, kontrolünüz olmayan eşzamansız bir olaylar zinciri (diğer bir deyişle "tek yönlü veri bağlama") aracılığıyla yönetilir ve durumu doğrudan değiştirmemeyi hatırlayarak sana güveniyorum ...
Bu bağlam göz önüne alındığında, değişmezlik ihtiyacının JavaScript ile nasıl bir ilgisi olmadığını ve React'teki yarış koşullarıyla ne ilgisi olduğunu görmek kolaydır: eğer uygulamanızda bir dizi birbirine bağlı değişiklik varsa ve ne olduğunu anlamanın kolay bir yolu yoksa devletiniz şu anda karışıyor , kafanız karışacak ve bu nedenle her tarihsel değişikliği izlemek için değişmezliği kullanmak mantıklı .
3) Yarış koşulları kategorik olarak kötüdür.
React kullanıyorsanız bunlar olabilir. Ancak farklı bir çerçeve seçerseniz bunlar nadirdir.
Ayrıca, normalde başa çıkmak için çok daha büyük sorunlarınız var… Bağımlılık cehennemi gibi sorunlar. Şişirilmiş bir kod tabanı gibi. CSS'niz yüklenmiyor gibi. Yavaş bir inşa süreci veya yinelemeyi neredeyse imkansız kılan monolitik bir arka uca yapışmış gibi. Deneyimsiz geliştiriciler gibi neler olup bittiğini anlamıyor ve bir şeyleri karıştırıyor gibi.
Bilirsin. Gerçeklik. Ama hey, kimin umrunda?
4) Değişmezlik, her durum değişikliğinin izlenmesinin performans etkisini azaltmak için Referans Tiplerini kullanır.
Cidden, eğer durumunuz her değiştiğinde bir şeyler kopyalayacaksanız, bu konuda akıllı olduğunuzdan emin olmalısınız.
5) Değiştirilemez şeyler UNDO sağlar .
Çünkü er .. bu proje yöneticinizin isteyeceği bir numaralı özellik, değil mi?
6) Değişmez durum, WebSockets ile birlikte çok fazla serin potansiyele sahiptir
Son fakat en az değil, devlet deltalarının birikimi , değişmez olayların akışı olarak kolay bir devlet tüketimine izin veren WebSockets ile birlikte oldukça zorlayıcı bir durum ortaya çıkarıyor ...
Kuruş bu konsepte düştüğünde (devlet, bir olay akışıdır - en son görüşü temsil eden kaba bir kayıtlar grubu yerine), değişmez dünya yaşamak için büyülü bir yer haline gelir. Zamanın kendisini aşan olay kaynaklı bir merak ve olasılık ülkesi . Ve bittiğinde sağ bu kesinlikle gerçek zamanlı EASI uygulamalar yapabilir er gerçekleştirmek için, sadece onlar böylece ilgilenen herkese olayların akışını yayın kendi temsilini inşa mevcut ve ortak akışına kendi değişikliklerini geri yazın.
Fakat bir noktada uyanırsınız ve tüm bu mucizenin ve büyünün ücretsiz olmadığını fark edersiniz. İstekli meslektaşlarınızın aksine, paydaşlarınız (evet, size ödeme yapan kişiler) felsefeye veya modaya çok az önem veriyorlar ve satabilecekleri bir ürün oluşturmak için ödedikleri paraya çok önem veriyorlar. Sonuç olarak, değişmez kod yazmak daha zor ve kırılması daha kolay, ayrıca onu desteklemek için bir arka ucunuz yoksa değişmez bir ön uca sahip çok az nokta var. Son olarak, paydaşlarınızı WebSockets gibi bir itme teknolojisi aracılığıyla yayınlayıp tüketmeniz gerektiğine ikna ettiğinizde , üretimde ölçeklendirmenin ne kadar acı olduğunu anlarsınız .
Şimdi bazı tavsiyeler için, kabul etmeyi seçmelisiniz.
FP / Immutability kullanarak JavaScript yazma seçeneği, uygulama kod tabanınızı daha büyük, daha karmaşık ve yönetilmesi daha zor hale getirmek için de bir seçimdir. Ne yaptığınızı bilmiyorsanız, bu yaklaşımı Redux redüktörlerinizle sınırlandırmanızı şiddetle öneririm ... Ve eğer devam edip değişmezliği kullanacaksanız, o zaman sadece tüm uygulama yığınıza değişmez bir durum uygulayın , müşteri tarafında, aksi takdirde gerçek değerini kaçırdığınız için.
Şimdi, işinizde seçim yapabileceğiniz kadar şanslıysanız, bilgeliğinizi kullanmayı deneyin (ya da kullanmayın) ve size ödeme yapan kişinin doğru olanı yapın . Bunu deneyiminize, bağırsağınıza veya etrafınızda olup bitenlere dayandırabilirsiniz (kuşkusuz herkes React / Redux kullanıyorsa, çalışmaya devam etmek için bir kaynak bulmanın daha kolay olacağına dair geçerli bir argüman vardır) .. Alternatif olarak, Driven Development veya Hype Driven Development yaklaşımlarını deneyebilirsiniz . Onlar daha çok sizin türünüz olabilir.
Kısacası, değişmezlik için söylenecek olan şey , en azından bir sonraki çılgınlık ortaya çıkana kadar akranlarınızla modaya uygun hale gelecektir , bu noktada ilerlemekten memnuniyet duyacaksınız.
Şimdi bu kendi kendine terapi seansından sonra bunu blogumda bir makale olarak eklediğimi belirtmek isterim => JavaScript'te Değişmezlik: Aksi Görünüm . Göğsünüzden de kurtulmak istediğiniz güçlü duygularınız varsa, orada cevap vermekten çekinmeyin;).