Devlet, Değişken Devlet ve Gerçekleştirilebilir Devlet Nedir?


32

Bu acemi bir soru, ancak Google'da yeterince acemi kanıtlayan bir cevap bulamadım.

Genel olarak programlamada ve özellikle de OO programlamada 'devlet' derken insanlar ne anlama geliyor?

Ayrıca, değişken ve değişmez durum nedir - yine, genel olarak programlamada ve ayrıca özellikle OOP'ta?


4
Araştırmanızı paylaşmak herkese yardımcı olur . Bize ne denediğinizi ve neden ihtiyaçlarınızı karşılamadığını söyleyin. Bu, kendinize yardım etmek için zaman harcadığınızı, bariz cevapları tekrar etmemizi önlediğini ve hepsinden daha belirgin ve alakalı bir cevap almanıza yardımcı olduğunu gösteriyor. Ayrıca Nasıl
Sorulur

Yanıtlar:


46

Değerleri (sayılar, dizeler, karmaşık veri yapıları) bir kimliğe ve zaman içindeki bir noktaya ilişkilendirirken durumunuz vardır.

Örneğin, 10 sayısı kendi başına herhangi bir durumu temsil etmez: sadece iyi tanımlanmış bir sayıdır ve her zaman kendisi olacaktır: doğal sayı 10 Tamamı içerdiği karakterlerle ve göründükleri diziyle tanımlanır. Bundan beş milyon yıl sonra, "HELLO" dizisi hala "HELLO" dizisi olacak: saf bir değer.

Devlete sahip olmak için, bu saf değerlerin kimliğe sahip bazı tür varlıklarla ilişkili olduğu bir dünyayı düşünmelisiniz . Kimlik ilkel bir fikirdir: Bu, sahip oldukları diğer özelliklerden bağımsız olarak iki şeyi ayırt edebileceğiniz anlamına gelir. Örneğin, aynı modeldeki iki araba, aynı renk, ... iki farklı araba.

Bu şeyleri kimlik ile verince, onlara saf değerlerle tanımlanan özellikleri ekleyebilirsiniz. Örneğin, arabamın mavi olma özelliği var. Bu gerçeği çifti ilişkilendirerek tanımlayabilirsiniz.

("colour", "blue")

Arabama Çift ("renk", "mavi"), o otomobilin durumunu tanımlayan saf bir değerdir .

Devlet sadece belirli bir varlık ile değil, zaman içindeki belirli bir noktayla da ilişkilidir. Yani, bugün söyleyebilirim, arabamın devleti var.

("colour", "blue")

Yarın siyaha boyanacağım ve yeni devlet olacak

("colour", "black")

Bir işletmenin durumunun değişebileceğini, ancak kimliğinin tanım gereği değişmediğini unutmayın . Tabii ki, varlık olduğu sürece, elbette: bir araba yaratılıp imha edilebilir, ancak kimliğini ömrü boyunca koruyacaktır. Henüz var olmayan bir şeyin kimliği hakkında konuşmak hiç mantıklı gelmiyor.

Belirli bir işletmeye eklenen özelliklerin değerleri zaman içinde değişirse, söz konusu işletmenin durumunun değişken olduğunu söylersiniz . Aksi takdirde, devletin değişmez olduğunu söylüyorsunuz .

En yaygın uygulama, varlığın durumunu bazı değişkenlerde (global değişkenler, nesne üyesi değişkenler) depolamak, yani bir durumun mevcut anlık görüntüsünü saklamaktır . Değişken durum atama kullanılarak uygulanır: her atama işlemi önceki anlık görüntüyü yenisiyle değiştirir. Bu çözüm normalde mevcut anlık görüntüyü saklamak için bellek konumlarını kullanır. Bellek konumunun üzerine yazmak, anlık görüntüyü yenisiyle değiştiren yıkıcı bir işlemdir. ( Burada bu yer odaklı programlama yaklaşımı hakkında ilginç bir konuşma bulabilirsiniz .)

Bir alternatif, bir varlığın müteakip durumlarını (tarihçesini) bir değer akışı (muhtemelen sonsuz dizi) olarak görmektir, bakınız örneğin SICP'nin 3. Bölümü . Bu durumda, her anlık görüntü farklı bir hafıza konumunda saklanır ve program aynı anda farklı anlık görüntüleri inceleyebilir. Kullanılmayan anlık görüntüler, artık gerekmediğinde çöp toplanabilir.

İki yaklaşımın avantajları / dezavantajları

  • Yaklaşım 1, daha az bellek tüketir ve kopyalama gerektirmediğinden yeni bir anlık görüntü oluşturmayı daha verimli bir şekilde sağlar.
  • Yaklaşım 1, dolaylı olarak yeni durumu, kendisine referans veren bir programın tüm parçalarına iter, yaklaşım 2, gözlemcilere örneğin bir olay şeklinde anlık bir görüntü vermek için bir mekanizmaya ihtiyaç duyar.
  • Yaklaşım 2, tutarsız durum hatalarının önlenmesine yardımcı olabilir (örneğin kısmi durum güncellemeleri): yeni bir durum ortaya çıkaran eski bir durumdan açık bir fonksiyon tanımlayarak, zamanın farklı noktalarında üretilen anlık görüntüleri ayırt etmek daha kolaydır.
  • Yaklaşım 2, durumdan bağımsız olan durum hakkında, örneğin mapve gibi daha üst düzey işlevler kullanarak kolayca görüş üretilmesine izin vermesi bakımından daha modülerdir filter.

1
Nesnelerin yalnızca durumu olan şeyler olmadığını unutmayın. Bir program (değişken) global değişkenler kullanıyorsa, programın kendisinin durumu olduğu söylenir. Benzer şekilde, bir fonksiyonun fonksiyon çağrıları arasındaki değerleri hatırlayan bir değişkeni varsa, fonksiyon durumludur.
Doval

2
@Doval: Küresel devleti, küresel bir dünya nesnesinin durumu olarak düşünebilirsiniz. Bildiğim kadarıyla bu görüş, örneğin Ruby'de kullanılıyor. Durumu hatırlayan bir işlev, yalnızca bir yöntemle bir nesneye izomorfiktir. Ortak temel fikir, değerleri kimlikleri veya yerlerle ilişkilendirmenizdir, yani bazı şeylerin değerleri tutabileceği (muhtemelen değiştirilebilir değer) ancak kimliğini koruyacağınızdır.
Giorgio,

3
Tabii, prensipte katılıyorum. Sadece Prog'un durumsallığın OOP'a özgü bir şey olmadığını anladığından emin oluyorum. Bence "her şey bir nesnedir" düşüncesi doğal olarak gelir.
Doval,

@Doval: Farklı çağrılardaki değerleri hatırlayan durumlu işlevlerden bahsettiniz. Düşünebileceğim bir örnek, C'deki statik yerel değişkenler. Başka bir örnek ise kapanışlardır (bağlamlarında tanımlanan değişkenleri yakalayan işlevler). Kapanışlar nesnelere göre biraz fazladır: Kapanış, tam olarak bir metodu olan bir objedir, oysaki obje, aynı değişkenler üzerinde tanımlanan bir kapamalar topluluğudur. Muhtemelen bütün bunları biliyorsun ama burada özetlemek istedim. Genel olarak, durumu bazı bellek konumlarında saklayabilir ve belirttiğiniz gibi farklı mekanizmalar kullanarak erişebilirsiniz.
Giorgio,

11

Devlet sadece bellekte tutulan bir şey hakkında bilgidir.

Nesne yönelimli basit bir alıştırma olarak, bir sınıfı bir kesici kesici olarak ve kurabiyeleri nesne olarak düşünün. Çerez kesici (sınıf) kullanarak bir çerez oluşturabilirsiniz (bir nesneyi başlat). Çerezin özelliklerinden birinin rengi olduğunu söyleyelim (gıda boyası kullanılarak değiştirilebilir). Çerezin rengi, diğer özellikler gibi durumunun bir parçasıdır.

Değişken durum, nesneyi (tanımlama bilgisi) yaptıktan sonra değiştirilebilecek durumdur. Değiştirilemez durum değiştirilemez durumdur.

Eşzamanlılıkla uğraşırken, değişmeyen nesneler ( devletin hiçbiri değiştirilemez) , bilgisayarınızda birden fazla işlemcinin bu nesnede aynı anda çalışabilme becerisi olduğunda önem kazanır . Taklit edilebilirlik, nesnenin ömrü boyunca kararlı ve geçerli olması için devlete güvenebileceğinizi garanti eder.

Genel olarak, bir nesnenin durumu "özel veya üye değişkenlerde" tutulur ve "özellikler" veya alıcı / ayarlayıcı yöntemleriyle erişilebilir.


3
Prog'un yararına, bir değerin asla değişmemesi de önemlidir, çünkü bunun sebebi çok daha kolaydır. İstediğiniz sayıda fonksiyonda / yöntemde kullanılabilir ve onların değiştiremeyeceğini bilirsiniz. Değişken durumla, o nesnenin şimdi değerinin ne olduğunu bulmak için nasıl kullanıldığının tarihçesini izlemelisiniz . Değişmez yapmak ise gereksiz zihinsel ek yük programı zorlaştırmaz.
Doval

Cevapladığınız için teşekkürler. Yani, temelde, OOP'da, birisi 'devlet' derken, genellikle "nesnenin üye değişkenleri" anlamına mı geliyor? Öyleyse, 'değişken durum' genel değişkenler veya daha fazla OOP'de belirleyici yöntemlerle değiştirilebilen özel değişkenlerdir - 'değişmeyen durum' sadece özel üye değişkenleri iken?
Aviv Cohn,

1
İmkansızlık, bir nesnenin özel üyelerine asla başlangıç ​​değerleri ile doldurulduktan sonra asla yazılmaksızın taklit edilebilir . Değiştirilemezlik edilebilir uygulanan bir ayarlayıcı yöntem sağlayarak değil, vb sabitleri kullanılarak, fonksiyonel bir tarzda, yazı yapıcı parametresi kullanılarak ayarlanması başlangıç değeri gerektiren: bir dizi yöntem kullanılarak
Robert Harvey

1
Devleti, bir varlığın mülkünün değeri olarak düşünüyorum. "Gönderildi" bir devlettir. "Vergi Oranı" da öyle. Bir şeyin ağırlığı bir durumdur. Şu anda uyanık veya uykuda olup olmadığınız bir durumdur. Bir şeyin rengi bir durumdur. Bir çeşit bilgisayar hafızasında tutulan bir şey hakkında anlamlı bilgi.
Robert Harvey,

1
Birçok dilde değişkenlik, üye değişkenleri "const" veya "final" olarak bildirerek uygulanabilir. Bu değişkenler sadece kurucu tarafından başlatılabilir. Özel değişkenlerin değişmez olduğunu varsaymayın - yine de sınıfın kendi üye işlevleri (yöntemler) tarafından değiştirilebilirler.
Simon B

7

Ben "devlet" teriminin ("üye değişken" gibi somut bir devlet türünün aksine), durum bilgisi olmayan bir API'yi durumsuz olan ile karşılaştırırken en faydalı olduğunu düşünüyorum. API'lerden bahsetmeden "durumu" tanımlamaya çalışmak, programlama değişkenlerinden bahsetmeden "değişken" veya "işlev" tanımlamaya çalışmak gibidir; Doğru cevapların çoğu sadece kelimelerin ne anlama geldiğini bilen insanlara mantıklı geliyor.

Devletsiz vs devletsiz

  • Durum bilgisi olan bir API, şu ana kadar hangi işlevi çağırdığınızı ve hangi argümanlarla ne çağırdığınızı "hatırlayan" bir terimdir , bu yüzden bir dahaki sefere bir işlev çağırdığınızda bu bilgiyi kullanacaktır. "Hatırlama" kısmı genellikle üye değişkenlerle birlikte uygulanır, ancak tek yol bu değildir.
  • Bir Vatansız API her işlev çağrısı sadece kendisine iletilen argümanlar bağlıdır ve başka bir şey biridir.

Örneğin, OpenGL muhtemelen bildiğim en durumsal API'dir. Bir an için gülünç derecede basitleştirebilirsem, bunun gibi göründüğünü söyleyebiliriz:

glSetCurrentVertexBufferArray(vba1);
glSetCurrentVertexBufferObject(vbo1);
glSetCurrentVertexShader(vert1);
glSetCurrentFragmentShader(frag1);
// a dozen other things
glActuallyDrawStuffWithCurrentState(GL_TRIANGLES);

Hemen hemen her fonksiyon sadece OpenGL'in hatırlaması gereken bazı durumlardan geçmek için kullanılır, sonra sonunda tüm çizimleri yapmak için basit bir basitlik karşıtı basit bir fonksiyon çağırırsınız.

OpenGL'nin (aşırı basitleştirilmiş) durumsuz bir sürümü muhtemelen şöyle görünecektir:

glActuallyDrawStuff(vba1, vbo1, vert1, frag1, /* a dozen other things */, GL_TRIANGLES);

Çoğu zaman kişilerin daha az durumdaki API’lerin nedeninin daha kolay olduğunu söylediğini duyacaksınız. Eğer argüman sayısını kontrol altında tutabilirseniz, genellikle buna katılıyorum.

Değişken vs Değiştirilemez

Bildiğim kadarıyla, bu ayrım ancak ilk durumu belirleyebiliyorsanız anlamlıdır . Örneğin, C ++ yapıcılarını kullanarak:

// immutable state
ImmutableWindow windowA = new ImmutableWindow(600, 400);
windowA = new ImmutableWindow(800, 600); // to change the size, I need a whole new window

// mutable state
MutableWindow windowB = new MutableWindow(600, 400);
windowB.width = 800; // to change the size, I just alter the existing object
windowB.height = 600;

Hangi boyutta olduğunu "hatırlamayan" bir pencere sınıfı uygulamak zor olabilir, ancak kullanıcının bir pencerenin boyutunu oluşturduktan sonra değiştirip değiştiremeyeceğine karar verebilirsiniz.

PS OOP'ta "durum" un genellikle "üye değişkenler" anlamına geldiği doğrudur , ancak bundan çok daha fazlası olabilir. Örneğin, C ++ 'da, bir yöntem statik bir değişkene sahip olabilir ve lambdalar değişkenleri yakalayarak kapanabilir. Her iki durumda da, bu değişkenler işleve yapılan birden çok çağrı boyunca devam eder ve bu nedenle muhtemelen durum olarak nitelendirilir. Düzenli bir fonksiyondaki yerel değişkenler, nasıl kullanıldığına bağlı olarak durum olarak da düşünülebilir (main'te (benim çoğunlukla var).


Müthiş cevap. Çok teşekkür ederim, bunu hızlı bir şekilde almama yardım ettin. Çok az şey biliyordum, uzun zamandır bununla çalışıyorum ve ne dendiğini bilmiyordum.
the_endian

2

Layman sözleriyle

Sözlük devletler:

a. Koşullarla ilgili olarak bir koşul ya da olma şekli.

  1. devlet - bir şeyin ana niteliklerine göre olması;

Bir şeyin durumu, niteliklerinin herhangi bir anda sahip olduğu değerler kümesidir.

OOP'da bir nesnenin durumu, niteliklerinin değerlerinin herhangi bir anda ne olduğuna dair bir anlık görüntüdür.

Thing t = new Thing();
t.setColor("blue");
t.setPrice(100)
t.setSize("small");

Durumu rengi mavi, fiyatı 100, boyutu küçük.

Daha sonra yaparsanız:

t.setColor("red");

Özniteliklerinden birini değiştiriyorsunuz, ancak nesne artık eskisi gibi olmadığından, durumu bir bütün olarak değiştirdiniz.

Bazen sınıflar, özelliklerinin değerleri oluşturulduktan sonra değiştirilemeyecek şekilde tasarlanır. Özelliklerinin tüm değerleri yapıcıya iletilir veya bir veritabanı veya dosya gibi bir kaynaktan okunur, ancak bu değerleri değiştirmenin hiçbir yolu yoktur, çünkü "ayarlayıcı" yöntemleri veya başka bir yöntem yoktur. nesnenin içindeki değerleri değiştirerek.

Thing t = new Thing("red",100,"small");
t.setColor("blue") -->> ERROR, the programmer didn't provide a setter or any other way to change the properties values after initialization.

Buna mutasyona uğramadan değiştirilemeyecek bir devlet denir. Yapabileceğiniz tek şey nesneyi imha etmek, yeni bir tane oluşturmak ve aynı referans veya değişkene bağlamaktır.

Thing t = new Thing("red",100,"small");
t = new Thing("blue",100,"small");
// I had to create a new Thing with another color since this thing is inmutable.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.