Yanıtlar:
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.
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.
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.
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.
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 count
eklemeniz gereken bir senaryo düşünün .sum
// 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 cin
ve içine koyarx
2) Başarılı bir okumadan sonra, artırın count
vesum = sum + x
3) Okuma durana kadar 1-2'yi tekrarlayın (yani ctrl + D)
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
Basit! artış sayısı.
Yani ++count;
iyi olur !. Şimdi kodumuz böyle bir şeye dönüşüyor,
while(cin>>x){
++count;
}
Ş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 x
için sum
ve depolamak sum
( sum+=x
) ve bir dahaki sefere
cin>>x
x içine yeni bir değer okuyacaktır.
Şimdi kodumuz böyle bir şeye dönüşüyor,
while(cin>>x){
++count;
sum+=x;
}
// 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.
Ö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.
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.
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
.
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.
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.
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.