Değişmez nedir?


130

Kelime bir dizi bağlamda kullanılıyor gibi görünüyor. Anlayabildiğim en iyi şey, değişemeyen bir değişken anlamına gelmeleri. Sabitlerin / finallerin (Java'ya lanet olsun!) Bunun için değil mi?


Belki de buna değişken olmayan demelilerdi?
johnny

Yanıtlar:


189

Bir değişmez, bir değişkenden daha "kavramsaldır". Genel olarak, her zaman doğru olan program durumunun bir özelliğidir. Değişmez tutmaların değişmezi koruduğu söylenen bir işlev veya yöntem.

Örneğin, bir ikili arama ağacı, her düğüm için düğümün sol çocuğunun anahtarının düğümün kendi anahtarından daha az olduğu değişmezine sahip olabilir. Bu ağaç için doğru yazılmış bir ekleme işlevi bu değişmezi koruyacaktır.

Anlayabileceğiniz gibi, bu bir değişkende saklayabileceğiniz türden bir şey değil: bu daha çok program hakkında bir ifadedir . Programınızın ne tür değişmezler içermesi gerektiğini bulup ardından bu değişmezleri gerçekten koruduğundan emin olmak için kodunuzu gözden geçirerek, kodunuzdaki mantıksal hataları önleyebilirsiniz.


1
Bu harika örnek, cero'nun cevabını wikipedia bağlantısıyla içerse daha iyi olur.
ablarg

2
Bir ebeveynin yaşı, biyolojik çocuklarının yaşından daha büyüktür. Çevreleyen bağlam değişecek, ancak değişmez asla değişmeyecek. Örneğin, 2 çocuğu olan Smith ailesi olabilir. Veya herhangi bir memelinin başka türlerinde olabilir. Bağlam değişir, ancak değişmez değişmez.
truthadjustr

1
"... her zaman doğru olan bir program durumunun özelliği ..." - @jacob baskin - iyi yazılmış ve bunun için teşekkürler.
twknab

"... her zaman doğru olan bir program durumunun özelliği ..." - İyi yazıldığını kabul ediyorum, ancak yanıltıcı da olabilir. İlk önce bunu boolean doğru olarak anladım, ancak "... her zaman sabittir" anlamına geldiğinden oldukça eminim (ama belki de sadece ingilizce benim ilk dilim olmadığı için)
dev-null

29

Bu, mantığınızda belirli bir yerde her zaman doğru olduğunu bildiğiniz bir durumdur ve neyin yanlış gittiğini anlamak için hata ayıklarken kontrol edebilirsiniz.


17

Genelde onları algoritmalar veya yapılar açısından görüyorum.

Örneğin, her yinelemenin başında veya sonunda her zaman doğru olan, iddia edilebilecek bir döngü değişmezine sahip olabilirsiniz. Yani, döngünüzün bir yığından diğerine bir nesne koleksiyonunu işlemesi gerekiyorsa, döngünün üstünde veya altında | stack1 | + | stack2 | = c diyebilirsiniz.

Değişmez kontrol başarısız olursa, bir şeylerin ters gittiğini gösterir. Bu örnekte, işlenmiş öğeyi son yığına itmeyi unuttuğunuz anlamına gelebilir.


17

Wikipedia'nın büyüsü: Değişmez (bilgisayar bilimi)

Bilgisayar biliminde, eğer doğruysa, belirli bir işlem dizisi boyunca doğru kalacak olan bir yüklem, bu diziye (an) değişmez olarak adlandırılır.


2
Bağlantılar? Teknik dil? OKUMA? WTF ? ;) Cidden, iyi bir bağlantı, ancak küçük bir özet güzel olurdu.
Dustman

10

Bu satırın da belirttiği gibi:

Bilgisayar biliminde, eğer doğruysa, belirli bir işlem dizisi boyunca doğru kalacak olan bir yüklem, bu diziye (an) değişmez olarak adlandırılır.

Bu daha iyi anlamak için C ++ 'daki bu örneğin yardımcı olacağını umuyoruz.

Bazı değerleri almanız ve bunların toplam sayısını as adlı bir değişkende almanız ve bunları olarak adlandırılan bir değişkene counteklemeniz gereken bir senaryo düşünün .sum

Değişmez (yine daha çok bir kavram gibi):

// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades

Yukarıdakinin kodu şuna benzer bir şey olacaktır,

int count=0;
double sum=0,x=0;
while (cin >> x) {
++count;
sum+=x;
}

Yukarıdaki kod ne işe yarar?

1) Girdiyi okur cinve içine koyarx

2) Başarılı bir okumadan sonra, artırın countvesum = sum + x

3) Okuma durana kadar 1-2'yi tekrarlayın (yani ctrl + D)

Döngü değişmezi:

Değişmez HER ZAMAN Doğru olmalıdır . Yani başlangıçta kodunuzu sadece bununla başlatırsınız

while(cin>>x){
  }

Bu döngü, verileri standart girişten okur ve x'te depolar. İyi ve güzel. Ancak değişmez , yanlış olur çünkü bizim değişmezimizin ilk kısmı takip edilmemiştir (veya doğru tutulmamıştır).

// we have read count grades so far, and

Değişmezi nasıl doğru tutabiliriz?

Basit! artış sayısı.

Yani ++count;iyi olur !. Şimdi kodumuz böyle bir şeye dönüşüyor,

while(cin>>x){
 ++count; 
 }

Fakat

Şu anda bile bizim değişmez şimdi ikinci bölümünü tatmin etmedi çünkü (DOĞRU olması gereken bir kavram) False bizim değişmez.

// sum is the sum of the first count grades

Peki şimdi ne yapmalı?

Ekle xiçin sumve depolamak sum( sum+=x) ve bir dahaki sefere cin>>xx içine yeni bir değer okuyacaktır.

Şimdi kodumuz böyle bir şeye dönüşüyor,

while(cin>>x){
 ++count; 
 sum+=x;
 }

Hadi kontrol edelim

Kodun değişmezimizle eşleşip eşleşmediği

// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades

kod:

while(cin>>x){
 ++count; 
 sum+=x;
 }

Ah!. Artık döngü değişmezi her zaman Doğru'dur ve kod iyi çalışır.

Yukarıdaki örnek Andrew-koening ve Barbara-E'nin Accelerated C ++ kitabından alınmış ve değiştirilmiştir.


4

Bir kod bloğu içinde değişmeyen bir şey


2

Öyle dan ne ardından, değişmezler değişmezler mevcut olması gereken kavramsal bilerek beri, temiz kod yazmak oldukça faydalıdır içinde kodunuzu kolayca bu amaçlara ulaşmak için kodunuzu nasıl düzenleneceğine karar verir. Daha önce de belirtildiği gibi, bunlar hata ayıklamada da yararlıdır, çünkü değişmezin korunup korunmadığını kontrol etmek, gerçekleştirmeye çalıştığınız herhangi bir manipülasyonun gerçekten istediğiniz şeyi yapıp yapmadığını görmenin iyi bir yoludur.


2

Tipik olarak belirli matematiksel işlemler altında değişmeyen bir niceliktir. Bir örnek , rotasyonlarda değişmeyen bir skalerdir. Örneğin manyetik rezonans görüntülemede, bir doku özelliğini rotasyonel bir değişmez ile karakterize etmek faydalıdır, çünkü bu durumda tahmini ideal olarak tarayıcıdaki gövdenin yönüne bağlı değildir.


2

Bu cevap 5 yaşındaki çocuğum için. Bir değişmezi sabit veya sabit bir sayısal değer olarak düşünmeyin. Ama olabilir. Ancak bundan daha fazlasıdır.

Tersine, bir değişmez, değişen varlıklar arasındaki sabit bir ilişkiye benzer. Örneğin, yaşınız her zaman biyolojik ebeveynlerinize kıyasla daha küçük olacaktır. Hem yaşınız hem de ebeveyninizin yaşı zamanla değişir, ancak yukarıda bahsettiğim ilişki değişmez.

Bir değişmez, sayısal bir sabit de olabilir. Örneğin, değeri pi, dairenin çevresi ile çapı arasında değişmeyen bir orandır. Çember ne kadar büyük ya da küçük olursa olsun, bu oran her zaman olacaktır pi.


1

ADT değişmezi, herhangi bir örnek yönteminin yürütülmesinden önce ve sonra her zaman doğru olması gereken veri alanları (örnek değişkenleri) arasındaki ilişkileri belirtir.


0

Java Concurrency in Practice kitabında değişmezliğe ve neden önemli olduğuna dair mükemmel bir örnek var .

Java merkezli olmasına rağmen, örnek, sağlanan bir tamsayının faktörlerini hesaplamaktan sorumlu bazı kodları açıklamaktadır. Örnek kod, sağlanan son sayıyı ve performansı artırmak için hesaplanan faktörleri önbelleğe almaya çalışır. Bu senaryoda, eşzamanlı bir senaryoda kodu yarış koşullarına duyarlı hale getiren örnek kodda hesaba katılmayan bir değişmez vardır.

görüntü açıklamasını buraya girin


0

Buradaki tüm cevaplar harika, ancak konuya daha fazla ışık tutabileceğimi hissettim:

Dil açısından değişmezlik, asla değişmeyen bir şey anlamına gelir. Kavram aslında matematikten gelse de, tümevarımla birleştirildiğinde popüler ispat tekniklerinden biridir.

İşte bir kanıt şu şekildedir: Eğer başlangıç ​​durumunda olan bir değişmez bulabilirseniz ve bu değişmezin, devlete uygulanan herhangi bir [yasal] dönüşümden bağımsız olarak devam ederse, o zaman kanıtlayabilirsiniz eğer belirli bir devlet buna sahip değilse değişmez ise, başlangıç ​​durumuna hangi dönüşüm dizisi uygulanırsa uygulansın, asla gerçekleşemez.

Şimdi, önceki düşünme biçimi (yine tümevarımla birleştirildiğinde), bilgisayar yazılımının mantığını tahmin etmeyi mümkün kılar. Yürütme, belirli bir döngünün belirli bir sonuç vereceğini veya bir programın durumunu asla belirli bir şekilde değiştirmeyeceğini kanıtlamak için bir değişmezin kullanılabildiği döngüler halinde gittiğinde özellikle önemlidir.

Bir döngü mantığını tahmin etmek için değişmez kullanıldığında, döngü değişmezi denir . Döngülerin dışında kullanılabilir, ancak döngüler için gerçekten önemlidir, çünkü çoğu zaman birçok olasılığa veya sonsuz sayıda olasılığa sahip olursunuz.

Bir bilgisayar yazılımının mantığını "yüklem" kelimesini kullandığıma ve kanıtlamadığıma dikkat edin. Ve bunun nedeni, matematik değişmezken bir kanıt olarak kullanılabilmesine rağmen, yazılımın birçok soyutlamanın üstüne çalıştırıldığı ve asla kanıtlanamayacağı için bilgisayar yazılımının çalıştırıldığında bekleneni vereceğini asla kanıtlayamaz. Bekleneni vereceklerini (örneğin, donanım soyutlamasını düşünün).

Son olarak, yazılım mantığını teorik ve titiz bir şekilde tahmin etmek yalnızca Tıbbi ve Askeri uygulamalar gibi yüksek kritik uygulamalar için önemlidir. Değişmezlik, hata ayıklama sırasında tipik programcıya yardımcı olmak için hala kullanılabilir. Belli bir yerde nerede olduğunu bilmek için kullanılabilir Program, belirli bir değişmezi koruyamadığı için başarısız oldu - çoğumuz onu yine de düşünmeden kullanıyoruz.

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.