Değişmez Nesneler ve Değişmez Koleksiyonlar
Değişken ve değişmez nesneler üzerindeki tartışmadaki en ince noktalardan biri değişmezlik kavramını koleksiyonlara genişletme olasılığıdır. Değişmez bir nesne, genellikle verilerin tek bir mantıksal yapısını (örneğin değişmez bir dize) temsil eden bir nesnedir. Değişmez bir nesneye referansınız olduğunda, nesnenin içeriği değişmez.
Değişmez bir koleksiyon asla değişmeyen bir koleksiyon.
Değişken bir koleksiyon üzerinde bir işlem gerçekleştirdiğimde, koleksiyonu yerinde değiştiriyorum ve koleksiyona referansları olan tüm varlıklar değişikliği görecek.
Değişmez bir koleksiyon üzerinde bir işlem gerçekleştirdiğimde, değişikliği yansıtan yeni bir koleksiyona bir başvuru döndürülür. Koleksiyonun önceki sürümlerine referans veren tüm varlıklar değişikliği görmez.
Akıllı uygulamaların, bu değişmezliği sağlamak için tüm koleksiyonu kopyalaması (klonlaması) gerekmez. En basit örnek, tek bağlantılı bir liste olarak uygulanan yığın ve push / pop işlemleri. Yeni koleksiyondaki önceki koleksiyondaki tüm düğümleri, itme için yalnızca tek bir düğüm ekleyerek ve pop için hiçbir düğümü klonlayarak yeniden kullanabilirsiniz. Diğer taraftan, tekil bağlantılı bir listedeki push_tail işlemi o kadar basit veya verimli değildir.
Değişmez - Değişken Değişkenler / Referanslar
Bazı fonksiyonel diller, nesne referanslarına değişmezlik kavramını alarak sadece tek bir referans atamasına izin verir.
- Erlang'da bu tüm "değişkenler" için geçerlidir. Bir referansa yalnızca bir kez nesne atayabilirim. Bir koleksiyon üzerinde çalışacak olsaydım, yeni koleksiyonu eski referansa (değişken adı) yeniden atayamazdım.
- Scala ayrıca bunu var veya val ile bildirilen tüm referanslarla dile dönüştürür , vals sadece tek bir atamadır ve fonksiyonel bir tarzı teşvik eder, ancak daha C benzeri veya Java benzeri bir program yapısına izin verir.
- Var / val bildirimi gerekirken, birçok geleneksel dil java'da final ve C'de const gibi isteğe bağlı değiştiriciler kullanır .
Gelişim Kolaylığı ve Performans
Hemen hemen her zaman değişmez bir nesne kullanmanın nedeni, yan etkisi olmayan programlamayı ve kod hakkında basit akıl yürütmeyi (özellikle yüksek eşzamanlı / paralel bir ortamda) teşvik etmektir. Nesne değişmezse, temel verilerin başka bir varlık tarafından değiştirilmesinden endişelenmenize gerek yoktur.
Ana dezavantajı performanstır. İşte Java'da yaptığım basit bir test üzerine bir oyuncak problemindeki değişmez ve değişmez nesneleri karşılaştıran bir yazı .
Performans sorunları birçok uygulamada tartışmalı, ancak hepsi değil, bu yüzden Python'daki Numpy Array sınıfı gibi birçok büyük sayısal paket büyük dizilerin Yerinde güncellemelerine izin verir. Bu, büyük matris ve vektör işlemlerini kullanan uygulama alanları için önemli olacaktır. Bu büyük veri paralel ve hesaplamalı olarak yoğun problemler yerinde çalışarak büyük bir hızlanma sağlar.
string
değişmez, en azından .NET ve ben de diğer birçok modern dilde düşünüyorum.