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
map
ve gibi daha üst düzey işlevler kullanarak kolayca görüş üretilmesine izin vermesi bakımından daha modülerdir filter
.