Değişmez nesne - Immutable object

İçinde nesne odaklı ve işlevsel programlama, bir değişmez nesne (değiştirilemez[1] nesne) bir nesne durumu oluşturulduktan sonra değiştirilemez.[2] Bu, bir değiştirilebilir nesne (değiştirilebilir nesne), oluşturulduktan sonra değiştirilebilir. Bazı durumlarda, bir nesne dahili olarak kullanılan bazı öznitelikler değişse bile değişmez olarak kabul edilir, ancak nesnenin durumu harici bir bakış açısından değişmeden görünür. Örneğin, kullanan bir nesne hafızaya alma pahalı hesaplamaların sonuçlarını önbelleğe almak hala değişmez bir nesne olarak kabul edilebilir.

Dizeler ve diğer somut nesneler, okunabilirliği ve çalışma zamanı verimliliğini artırmak için tipik olarak değişmez nesneler olarak ifade edilir. nesne yönelimli programlama. Değişmez nesneler de yararlıdır çünkü doğaları gereği iş parçacığı güvenli.[2] Diğer faydaları, anlaşılması ve muhakeme edilmesinin daha kolay olması ve değiştirilebilir nesnelere göre daha yüksek güvenlik sunmasıdır.[2]

Kavramlar

Değişmez değişkenler

İçinde zorunlu programlama, tutulan değerler program değişkenleri içeriği hiç değişmeyenler olarak bilinir sabitler bunları yürütme sırasında değiştirilebilecek değişkenlerden ayırmak için. Örnekler, metreden ayağa dönüştürme faktörlerini veya pi birkaç ondalık basamağa.

Salt okunur alanlar, program çalıştığında hesaplanabilir (önceden bilinen sabitlerin aksine), ancak başlatıldıktan sonra asla değişmez.

Zayıf ve güçlü değişmezlik

Bazen kesin konuşur alanlar değişmez olan bir nesnenin. Bu, nesnenin diğer bölümleri değiştirilebilir olsa bile, nesne durumunun bu bölümlerini değiştirmenin bir yolu olmadığı anlamına gelir (zayıf değişmez). Tüm alanlar değişmez ise, nesne değişmezdir. Tüm nesne başka bir sınıf tarafından genişletilemezse, nesne çağrılır kesinlikle değişmez.[3] Bu, örneğin, nesnenin ömrü boyunca aynı kalan nesnedeki belirli verilerle ilgili belirli değişmezlerin açık bir şekilde uygulanmasına yardımcı olabilir. Bazı dillerde bu bir anahtar kelime ile yapılır (ör. sabit içinde C ++, final içinde Java ) alanı değişmez olarak belirler. Bazı diller bunu tersine çevirir: OCaml, bir nesnenin veya kaydın alanları varsayılan olarak değişmezdir ve açıkça işaretlenmelidir. değişebilir öyle olmak için.

Nesnelere referanslar

Çoğunlukla nesne yönelimli diller nesneler kullanılarak başvurulabilir Referanslar. Bu tür dillerin bazı örnekleri Java, C ++, C #, VB.NET ve birçok komut dosyası dilleri, gibi Perl, Python, ve Yakut. Bu durumda, nesneler referanslar aracılığıyla paylaşıldığında bir nesnenin durumunun değişip değişmeyeceği önemlidir.

Referans ile nesnelerin kopyalanması

Bir nesnenin değişmez olduğu biliniyorsa, bir nesnenin oluşturulması tercih edilir. referans tüm nesneyi kopyalamak yerine. Bu, veri yinelemesini önleyerek ve kuruculara ve yıkıcılara yapılan çağrıları önleyerek belleği korumak için yapılır; ayrıca yürütme hızında potansiyel bir artışa neden olur.

Referans kopyalama tekniğinin, değiştirilebilir nesneler için kullanılması çok daha zordur, çünkü değiştirilebilir bir nesne referansının herhangi bir kullanıcısı onu değiştirirse, bu referansın diğer tüm kullanıcıları değişikliği görür. Amaçlanan etki bu değilse, diğer kullanıcılara doğru şekilde yanıt vermelerini bildirmek zor olabilir. Bu durumlarda, savunmacı kopyalama referanstan ziyade nesnenin tamamı genellikle kolay ama maliyetli bir çözümdür. gözlemci deseni değişebilir nesnelerdeki değişiklikleri işlemek için alternatif bir tekniktir.

Yazarken kopyala

Avantajlarını harmanlayan bir teknik değişebilir ve değişmez hemen hemen tüm modern donanımlarda doğrudan desteklenir ve yazma üzerine kopyalama (İNEK). Bu tekniği kullanarak, bir kullanıcı sistemden bir nesneyi kopyalamasını istediğinde, bunun yerine yalnızca aynı nesneye işaret eden yeni bir referans oluşturur. Bir kullanıcı nesneyi belirli bir referans yoluyla değiştirmeye çalışır çalışmaz, sistem gerçek bir kopya oluşturur, değişikliği buna uygular ve referansı yeni kopyaya başvurmak üzere ayarlar. Diğer kullanıcılar bundan etkilenmez, çünkü hala orijinal nesneye başvururlar. Bu nedenle, COW altında, tüm kullanıcılar nesnelerinin değiştirilebilir bir sürümüne sahip gibi görünmektedir, ancak kullanıcıların nesnelerini değiştirmemesi durumunda, değişmez nesnelerin yer tasarrufu ve hız avantajları korunur. Yazarken kopyala, şu ülkelerde popülerdir: sanal bellek sistemler, çünkü bir uygulama programının yapabileceği her şeyi doğru bir şekilde işlerken bellek alanından tasarruf etmelerine izin verir.

Stajyer

Eşit nesnelerin kopyaları yerine her zaman referansların kullanılması uygulaması şu şekilde bilinir: staj. İnterning kullanılırsa, iki nesne, ancak ve ancak, tipik olarak işaretçiler veya tamsayılarla gösterilen referansları eşitse eşit kabul edilir. Bazı diller bunu otomatik olarak yapar: örneğin, Python otomatik olarak stajyerlerin kısa dizeleri. İnterneti uygulayan algoritmanın mümkün olduğu her durumda bunu yapması garanti edilirse, nesneleri eşitlik açısından karşılaştırmak, çoğu uygulamada hızda önemli bir kazanç olan işaretçileriyle karşılaştırmaya indirgenir. (Algoritmanın kapsamlı olduğu garanti edilmese bile, hala bir olasılık vardır. hızlı yol nesneler eşit olduğunda ve aynı referansı kullandığında durum iyileştirme.) Interning genellikle yalnızca değişmez nesneler için yararlıdır.

İplik güvenliği

Değişmez nesneler, çok iş parçacıklı uygulamalarda yararlı olabilir. Birden çok iş parçacığı, diğer iş parçacıkları tarafından değiştirilen verilerle ilgilenmeden değişmez nesneler tarafından temsil edilen veriler üzerinde hareket edebilir. Bu nedenle değişmez nesneler daha çok kabul edilir iş parçacığı güvenli değiştirilebilir nesnelerden daha fazla.

Değişmezliği ihlal etmek

Değişmezlik, nesnenin bilgisayarın bilgisayarında depolandığı şekliyle hafıza yazılamaz. Daha ziyade, değişmezlik bir Derleme zamanı Bir programcının nesnenin normal arabirimi aracılığıyla ne yapabileceğini gösteren yapı, kesinlikle ne yapabileceğini değil (örneğin, tür sistemini atlatarak veya sabit doğruluk içinde C veya C ++ ).

Dile özgü ayrıntılar

İçinde Python, Java ve .NET Framework dizeler değişmez nesnelerdir. Hem Java hem de .NET Framework değiştirilebilir dizge sürümlerine sahiptir. Java'da bunlar StringBuffer ve StringBuilder (değişebilir Java sürümleri Dize) ve .NET'te bu StringBuilder (.Net'in değiştirilebilir sürümü Dize). Python 3 isimli değiştirilebilir bir dizge (bayt) varyantına sahiptir bytearray.[4]

Ek olarak, tüm ilkel sarmalayıcı sınıfları Java'da değişmez.

Benzer modeller Değişmez Arayüz ve Değişmez Sarıcı.

Saf fonksiyonel programlama dilleri genişletmeden değiştirilebilir nesneler oluşturmak mümkün değildir (örneğin, değiştirilebilir bir referans kitaplığı veya bir yabancı işlev arabirimi ), bu nedenle tüm nesneler değişmezdir.

Ada

İçinde Ada, herhangi bir nesne ya bildirilir değişken (yani değişebilir; tipik olarak örtük varsayılan) veya sabit (yani değişmez) aracılığıyla sabit anahtar kelime.

  tip Bazı_tür dır-dir yeni Tamsayı; - daha karmaşık bir şey olabilir  x: sabit Bazı_tür:= 1; - değişmez  y: Bazı_tür; - değiştirilebilir

Alt program parametreleri değişmezdir. içinde modu ve değiştirilebilir dışarıda ve dışarı modlar.

  prosedür Yap(a: içinde Tamsayı; b: içinde dışarı Tamsayı; c: dışarı Tamsayı) dır-dir  başla    - a değişmezdir    b:= b + a;    c:= a;  son Yap;

C #

İçinde C # ile bir sınıfın alanlarının değişmezliğini zorlayabilirsiniz. Sadece oku Beyan. Tüm alanları değişmez olarak zorlayarak, değişmez bir tür elde edersiniz.

sınıf AnImmutableType{    halka açık Sadece oku çift _value;    halka açık AnImmutableType(çift x)     {         _value = x;     }    halka açık AnImmutableType Meydan()     {         dönüş yeni AnImmutableType(_value * _value);     }}

C ++

C ++ 'da bir sabit-doğru uygulanması Araba kullanıcının sınıfın yeni örneklerini şu şekilde bildirmesine izin verir: sabit (değişmez) veya değiştirilebilir, istenildiği gibi, iki farklı versiyonun sağlanmasıyla getItems () yöntem. (C ++ 'da özel bir kurucu sağlamanın gerekli olmadığına ve aslında imkansız olduğuna dikkat edin. sabit örnekler.)

sınıf Araba { halka açık:  Araba(std::vektör<Öğe> öğeler): öğeler_(std::hareket(öğeler)) {}  std::vektör<Öğe>& öğeler() { dönüş öğeler_; }  sabit std::vektör<Öğe>& öğeler() sabit { dönüş öğeler_; }  int ComputeTotalCost() sabit { / * fiyatların getiri toplamı * / } özel:  std::vektör<Öğe> öğeler_;};

Bir işaretçi veya başka bir nesneye başvuru olan bir alan varsa, bu durumda bu tür bir işaretçi veya referansla gösterilen nesneyi const-doğruluğunu ihlal etmeden bir const yöntemi içinde değiştirmenin yine de mümkün olabileceğini unutmayın. Böyle bir durumda nesnenin gerçekten değişmez olmadığı tartışılabilir.

C ++ ayrıca, (bitselin aksine) soyut değişmezlik sağlar. değişebilir bir üye değişkeninin bir sabit yöntem.

sınıf Araba { halka açık:  Araba(std::vektör<Öğe> öğeler): öğeler_(std::hareket(öğeler)) {}  sabit std::vektör<Öğe>& öğeler() sabit { dönüş öğeler_; }  int ComputeTotalCost() sabit {    Eğer (toplam tutar_) {      dönüş *toplam tutar_;    }    int toplam tutar = 0;    için (sabit Oto& eşya : öğeler_) {      toplam tutar += eşya.Maliyet();    }    toplam tutar_ = toplam tutar;    dönüş toplam tutar;  } özel:  std::vektör<Öğe> öğeler_;  değişebilir std::isteğe bağlı<int> toplam tutar_;};

D

İçinde D iki tane var tür niteleyiciler, sabit ve değişmez, değiştirilemeyen değişkenler için.[5] C ++ 'ların aksine sabit, Java'nın finalve C # 'lar Sadece okugeçişlidirler ve böyle bir değişkenin referansları aracılığıyla erişilebilen her şeye yinelemeli olarak uygulanırlar. Arasındaki fark sabit ve değişmez uyguladıkları şey: sabit değişkenin bir özelliğidir: referans değere yasal olarak değişken referanslar olabilir, yani değer gerçekten değişebilir. Tersine, değişmez anılan değerin bir özelliğidir: değer ve ondan geçiş yoluyla ulaşılabilen herhangi bir şey değiştirilemez (tür sistemini bozmadan, tanımlanmamış davranış ). Bu değerin herhangi bir referansı işaretlenmelidir sabit veya değişmez. Temelde herhangi bir niteliksiz tip için T, sabit (T) ayrık birliği T (değiştirilebilir) ve değişmez (T).

sınıf C {  / * değiştirilebilir * / Nesne mField;    sabit     Nesne cField;    değişmez Nesne iField;}

Değişken bir C nesne, onun mField yazılabilir. Bir sabit (C) nesne, mField değiştirilemez, devralır sabit; iField daha güçlü bir garanti olduğu için hala değişmezdir. Bir ... için değişmez (C), tüm alanlar değişmezdir.

Bunun gibi bir işlevde:

geçersiz işlev(C m, sabit C c, değişmez C ben){ / * parantez içinde * / }

Diş tellerinin içinde c ile aynı nesneye başvurabilir myani mutasyonlar m dolaylı olarak değişebilir c yanı sıra. Ayrıca, c ile aynı nesneye başvurabilir ben, ancak bu durumda değer değişmez olduğu için hiçbir değişiklik olmaz. Ancak, m ve ben yasal olarak aynı nesneye atıfta bulunamaz.

Garantiler dilinde, mutable'ın hiçbir garantisi yoktur (fonksiyon nesneyi değiştirebilir), sabit işlevin hiçbir şeyi değiştirmeyeceğine dair yalnızca dışa dönük bir garantidir ve değişmez çift ​​yönlü bir garantidir (işlev, değeri değiştirmez ve arayan bunu değiştirmemelidir).

Olan değerler sabit veya değişmez noktasında doğrudan atama ile başlatılmalıdır beyan veya bir kurucu.

Çünkü sabit parametreler, değerin değiştirilebilir olup olmadığını, benzer bir yapıyı unutur, giriş, bir anlamda değişkenlik bilgisi için bir değişken görevi görür. const (S) işlevi (const (T)) İadeler sabit (S) değişken, sabit ve değişmez argümanlar için yazılmış değerler. Aksine, bir tür işlev inout (S) fonksiyonu (inout (T)) İadeler S değişebilir için T argümanlar, sabit (S) için sabit (T) değerler ve değişmez (S) için değişmez (T) değerler.

Değişmez değerlerin değişkenlere atanması, orijinal değer değişebilir bir kaynaktan gelse bile, değişiklik üzerine tanımsız davranışa neden olur. Değişken değerlerin değişmez olarak atanması, daha sonra değişken referanslar kalmadığında yasal olabilir. "Bir ifade, eğer ifade benzersizse ve geçişli olarak atıfta bulunduğu tüm ifadeler benzersiz veya değişmez ise, değişken (...) 'den değişmeze dönüştürülebilir."[5] Derleyici benzersizliği kanıtlayamazsa, çevrim açıkça yapılabilir ve değişken referansların bulunmadığından emin olmak programcıya kalmıştır.

Tip dizi takma addır değişmez (karakter) [], yani değişmez karakterlerin yazılı bir bellek dilimi.[6] Alt dizeler oluşturmak ucuzdur, çünkü yalnızca bir işaretçiyi ve dosyalanan uzunluğu kopyalayıp değiştirir ve temeldeki veriler değiştirilemediğinden güvenlidir. Tür nesneleri const (karakter) [] dizelere başvurabilir, aynı zamanda değiştirilebilir tamponlara da başvurabilir.

Sabit veya değişmez bir değerin yüzeysel bir kopyasını yapmak, değişmezliğin dış katmanını kaldırır: Değişmez bir dizeyi kopyalamak (değişmez (karakter [])) bir dize (değişmez (karakter) []). Değişmez işaretçi ve uzunluk kopyalanır ve kopyalar değiştirilebilir. Bahsedilen veriler kopyalanmamıştır ve örnekte niteleyicisini korur değişmez. Depper kopyası yapılarak sıyrılabilir, ör. kullanmak çift işlevi.

Java

Değişmez bir nesnenin klasik bir örneği, Java'nın bir örneğidir Dize sınıf

Dize s = "ABC";s.toLowerCase();

Yöntem toLowerCase () "ABC" verisini değiştirmez s içerir. Bunun yerine, yeni bir String nesnesi başlatılır ve yapımı sırasında "abc" verisi verilir. Bu String nesnesine bir başvuru, toLowerCase () yöntem. İp yapmak için s "abc" verilerini içerir, farklı bir yaklaşım gereklidir:

s = s.toLowerCase();

Şimdi Dize s "abc" içeren yeni bir String nesnesine başvurur. Sözdiziminde hiçbir şey yok beyan onu değiştirilemez olarak zorlayan String sınıfının; daha ziyade, String sınıfının yöntemlerinden hiçbiri bir String nesnesinin içerdiği verileri etkilemez, dolayısıyla onu değişmez kılar.

Anahtar kelime final (detaylı makale ) değişmez ilkel türlerin ve nesne referanslarının uygulanmasında kullanılır,[7] ama kendi başına yapamaz nesnelerin kendileri değişmez. Aşağıdaki örneklere bakın:

İlkel tür değişkenler (int, uzun, kısavb.) tanımlandıktan sonra yeniden atanabilir. Bu, kullanılarak önlenebilir final.

int ben = 42; // int ilkel bir türdürben = 43; // TAMAM MIfinal int j = 42;j = 43; // derlemez. j nihai olduğundan yeniden atanamaz

Referans türleri sadece kullanılarak değişmez hale getirilemez. final anahtar kelime. final yalnızca yeniden atamayı engeller.

final MyObject m = yeni MyObject(); // m, referans türündedirm.veri = 100; // TAMAM MI. M nesnesinin durumunu değiştirebiliriz (m değişebilir ve son bu gerçeği değiştirmez)m = yeni MyObject(); // derlemez. m nihai olduğundan yeniden atanamaz

İlkel sarmalayıcılar (Tamsayı, Uzun, Kısa, Çift, Yüzer, Karakter, Bayt, Boole) ayrıca hepsi değişmezdir. Değişmez sınıflar, birkaç basit yönergeyi izleyerek uygulanabilir.[8]

Perl

İçinde Perl Moo kütüphanesi ile tüm öznitelikleri salt okunur olarak ilan ederek değişmez bir sınıf oluşturabilirsiniz:

paket Değişmez;kullanım Moo;vardır değer => (    dır-dir      => 'ro',   # Sadece oku    varsayılan => 'veri', # kurucuya aşağıdakiler sağlanarak geçersiz kılınabilir                       # bir değer: Değişmez-> yeni (değer => 'başka bir şey'););1;

İki adım gerektirmek için kullanılan değişmez bir sınıf oluşturmak: birincisi, nesne özniteliklerinin değiştirilmesini önleyen erişimciler oluşturmak (otomatik veya manuel olarak) ve ikincisi, bu sınıfın örneklerinin örnek verilerinin doğrudan değiştirilmesini önlemek (bu genellikle bir karma referans ve Hash :: Util'in lock_hash işlevi ile kilitlenebilir):

paket Değişmez;kullanım katı;kullanım uyarılar;kullanım temel qw (Sınıf :: Erişimci);# salt okunur erişimciler oluştur__PAKET__->mk_ro_accessors(qw (değer));kullanım Hash :: Util 'lock_hash';alt yeni {    benim $ sınıf = vardiya;    dönüş $ sınıf Eğer ref($ sınıf);    ölmek "Yeni bağımsız değişkenler anahtar => değer çifti olmalıdır  n"        sürece (@_ % 2 == 0);    benim % varsayılanlar = (        değer => 'veri',    );    benim $ obj = {        % varsayılanlar,        @_,    };    kutsamak $ obj, $ sınıf;    # nesne verilerinin değiştirilmesini önleyin    lock_hash % $ obj;}1;

Veya manuel olarak yazılmış bir erişimci ile:

paket Değişmez;kullanım katı;kullanım uyarılar;kullanım Hash :: Util 'lock_hash';alt yeni {    benim $ sınıf = vardiya;    dönüş $ sınıf Eğer ref($ sınıf);    ölmek "Yeni bağımsız değişkenler anahtar => değer çifti olmalıdır  n"        sürece (@_ % 2 == 0);    benim % varsayılanlar = (        değer => 'veri',    );    benim $ obj = {        % varsayılanlar,        @_,    };    kutsamak $ obj, $ sınıf;    # nesne verilerinin değiştirilmesini önleyin    lock_hash % $ obj;}# salt okunur erişimcialt değer {    benim $ self = vardiya;    Eğer (benim $ yeni_değer = vardiya) {        # yeni bir değer belirlemeye çalışmak        ölmek "Bu nesne değiştirilemez  n";    } Başka {        dönüş $ self->{değer}    }}1;

Python

İçinde Python bazı yerleşik türler (sayılar, mantıksal değerler, dizeler, başlıklar, frozensetler) değişmezdir, ancak özel sınıflar genellikle değiştirilebilir. Bir sınıftaki değişmezliği simüle etmek için, istisnaları artırmak için öznitelik ayarını ve silmeyi geçersiz kılabilir:

sınıf ImmutablePoint:    "" "İki özniteliğe sahip 'x' ve 'y' olan değişmez bir sınıf." ""    __yuvalar__ = ['x', "y"]    def __setattr__(kendini, *argümanlar):        yükseltmek TypeError("Değişmez örnek değiştirilemez.")    __delattr__ = __setattr__    def __içinde__(kendini, x, y):        # Örnek verilerini depolamak için artık self.value = değer kullanamayız        # bu yüzden açıkça süper sınıfı çağırmalıyız        Süper().__setattr__('x', x)        Süper().__setattr__("y", y)

Standart kütüphane yardımcıları collections.namedtuple ve typing.NamedTuple Python 3.6'dan itibaren mevcut olan, basit değişmez sınıflar oluşturun. Aşağıdaki örnek kabaca yukarıdakilere ve ayrıca bazı demet benzeri özellikler ile eşdeğerdir:

itibaren yazıyor ithalat NamedTupleithalat koleksiyonlarNokta = koleksiyonlar.adlı çift('Nokta', ['x', "y"])# aşağıdaki, yukarıdakine benzer bir adlandırılmış çift oluşturursınıf Nokta(NamedTuple):    x: int    y: int

Python 3.7'de sunulan, veri sınıfları geliştiricilerin değişmezliği taklit etmelerine izin verin donmuş örnekler. Dondurulmuş bir veri sınıfı oluşturulmuşsa, veri sınıfları geçersiz kılacak __setattr __ () ve __delattr __ () yükseltmek FrozenInstanceError çağrılırsa.

itibaren veri sınıfları ithalat veri sınıfı@dataclass(dondurulmuş=Doğru)sınıf Nokta:    x: int    y: int

JavaScript

İçinde JavaScript, tüm ilkel türler (Tanımsız, Null, Boolean, Number, BigInt, String, Symbol) değişmez, ancak özel nesneler genellikle değiştirilebilir.

işlevi bir şey yap(x) { / * burada x'i değiştirmek orijinali değiştirir mi? * / };var str = 'dizi';var obj = { bir: 'nesne' };bir şey yap(str);         // dizeler, sayılar ve bool türleri değişmez, işlev bir kopyasını alırbir şey yap(obj);         // nesneler referans olarak aktarılır ve işlev içinde değiştirilebilirdoAnotherThing(str, obj); // `str` değişmedi, ancak` obj` değişmiş olabilir.

Bir nesnede değişmezliği simüle etmek için, özellikler salt okunur (yazılabilir: yanlış) olarak tanımlanabilir.

var obj = {};Nesne.defineProperty(obj, 'foo', { değer: 'bar', yazılabilir: yanlış });obj.foo = "bar2"; // sessizce yok sayıldı

Ancak, yukarıdaki yaklaşım yine de yeni özelliklerin eklenmesine izin verir. Alternatif olarak, biri kullanılabilir Object.freeze var olan nesneleri değiştirilemez hale getirmek için.

var obj = { foo: 'bar' };Nesne.donmak(obj);obj.foo = 'Barlar'; // mülk düzenlenemez, sessizce yok sayılırobj.foo2 = "bar2"; // özellik eklenemez, sessizce yok sayılır

Uygulanması ile ECMA262 JavaScript, yeniden atanamayan değişmez referanslar oluşturma yeteneğine sahiptir. Ancak, bir sabit bildirim salt okunur referansın değerinin değişmez olduğu anlamına gelmez, sadece adın yeni bir değere atanamayacağı anlamına gelir.

sabit HER ZAMAN_IMMUTABLE = doğru;Deneyin {  HER ZAMAN_IMMUTABLE = yanlış;} tutmak (hata) {  konsol.günlük("Değişmez bir referans yeniden atanamaz.");}sabit arr = [1, 2, 3];arr.it(4);konsol.günlük(arr); // [1, 2, 3, 4]

Değişmez durum kullanımı, JavaScript'in tanıtımından bu yana yükselen bir trend haline geldi. Tepki gibi Flux benzeri durum yönetimi modellerini destekleyen Redux.[9]

Raket

Raket önemli ölçüde diğerinden farklıdır Şema çekirdek çifti türünü ("eksiler hücreleri") değiştirilemez hale getirerek gerçekleştirmeler. Bunun yerine, bir paralel değişken çift türü sağlar. mcons, mcar, set-mcar! vb. Buna ek olarak, birçok değişmez tür, örneğin, değişmez dizgiler ve vektörler desteklenir ve bunlar yaygın olarak kullanılır. Yeni yapılar, bir alan özel olarak değiştirilebilir olarak bildirilmediği sürece varsayılan olarak değişmezdir veya tüm yapı:

(yapı foo1 (x y))             ; tüm alanlar değişmez(yapı foo2 (x [y #: değiştirilebilir])) ; tek değiştirilebilir alan(yapı foo3 (x y) #: değiştirilebilir)   ; tüm alanlar değiştirilebilir

Dil ayrıca, işlevsel olarak uygulanan ve değişmez sözlükleri, değişmez hash tablolarını destekler.

Pas, paslanma

Rust's mülkiyet sistem, geliştiricilerin değişmez değişkenler bildirmesine ve değişmez referanslar iletmesine izin verir. Varsayılan olarak, tüm değişkenler ve referanslar değişmezdir. Değişken değişkenler ve referanslar, mut anahtar kelime.

Sabit öğeler Rust'ta her zaman değişmez.

// sabit öğeler her zaman değişmezdirsabitHER ZAMAN_IMMUTABLE: bool =doğru;yapı Nesne{x: kullanmak,y: kullanmak,}fn ana(){// değiştirilebilir bir değişkeni açıkça beyan etİzin Vermekmutmutable_obj=Nesne{x: 1,y: 2};mutable_obj.x=3;// tamamİzin Vermekmutable_ref=&mutmutable_obj;mutable_ref.x=1;// tamamİzin Vermekimmutable_ref=&mutable_obj;immutable_ref.x=3;// hata E0594// varsayılan olarak değişkenler değişmezdirİzin Vermekimmutable_obj=Nesne{x: 4,y: 5};immutable_obj.x=6;// hata E0596İzin Vermekmutable_ref2=&mutimmutable_obj;// hata E0596İzin Vermekimmutable_ref2=&immutable_obj;immutable_ref2.x=6;// hata E0594}

Scala

İçinde Scala, herhangi bir varlık (dar anlamda, bir bağlayıcı) değiştirilebilir veya değişmez olarak tanımlanabilir: bildirimde biri kullanılabilir val (değer) değişmez varlıklar için ve var değişebilir olanlar için (değişken). Değişmez bir bağlama yeniden atanamasa bile, yine de değiştirilebilir bir nesneye başvurabilir ve bu nesnede mutasyon yöntemlerini çağırmanın hala mümkün olduğunu unutmayın: bağlayıcı değişmez, ancak temelde nesne değişebilir olabilir.

Örneğin, aşağıdaki kod parçacığı:

val maksimum değer = 100var Mevcut değer = 1

değişmez bir varlığı tanımlar maksimum değer (tamsayı türü derleme sırasında çıkarılır) ve adında değiştirilebilir bir varlık Mevcut değer.

Varsayılan olarak, aşağıdaki gibi koleksiyon sınıfları Liste ve Harita değişmezdir, bu nedenle güncelleme yöntemleri, mevcut bir örneği değiştirmek yerine yeni bir örnek döndürür. Bu verimsiz görünse de, bu sınıfların uygulanması ve bunların değişmezlik garantileri, yeni örneğin mevcut düğümleri yeniden kullanabileceği anlamına gelir; bu, özellikle kopya oluşturma durumunda çok verimli olur.[10][daha iyi kaynak gerekli ]

Ayrıca bakınız

Referanslar

Bu makale, Perl Tasarım Modelleri Kitabı

  1. ^ "immutable sıfat - Tanım, resimler, telaffuz ve kullanım notları - OxfordLearnersDictionaries.com'da Oxford Gelişmiş Öğrenci Sözlüğü". www.oxfordlearnersdictionaries.com.
  2. ^ a b c Goetz vd. Pratikte Java Eş Zamanlılığı. Addison Wesley Professional, 2006, Bölüm 3.4. Değişmezlik
  3. ^ David O'Meara (Nisan 2003). "Değişken ve Değişmez Nesneler: Yöntemlerin geçersiz kılınamayacağından emin olun". Java Çiftliği. Alındı 2012-05-14. Tercih edilen yol, sınıfı final yapmaktır. Bu bazen "Güçlü Değişmezlik" olarak adlandırılır. Herhangi birinin sınıfınızı genişletmesini ve yanlışlıkla veya kasıtlı olarak onu değişken hale getirmesini engeller.
  4. ^ "Yerleşik İşlevler - Python v3.0 belgeleri". docs.python.org.
  5. ^ a b D Dil Belirtimi § 18
  6. ^ D Dil Spesifikasyonu § 12.16 (Şartlar dizi ve dilim birbirinin yerine kullanılır.)
  7. ^ "Java'da Değişmez Sınıf ve Nesne nasıl oluşturulur - Eğitim Örneği". Javarevisited.blogspot.co.uk. 2013-03-04. Alındı 2014-04-14.
  8. ^ "Değişmez nesneler". javapractices.com. Alındı 15 Kasım 2012.
  9. ^ "JavaScript'te Değişmezlik: Aykırı Bir Görünüm". Desalasworks.
  10. ^ "Scala 2.8 Collections API - Concrete Immutable Collection Classes". Scala-lang.org. Alındı 2014-04-14.

Dış bağlantılar