Kısa cevap: Tutarlılık
Sorunuzu doğru bir şekilde cevaplamak için, geriye doğru bir adım atıp, eşitliğin bir programlama dilinde ne anlama geldiğine bakmayı öneriyorum . Çeşitli dillerde kullanılan en az ÜÇ farklı olasılık vardır:
- Referans eşitliği : a ve b aynı nesneye başvurursa, a = b'nin doğru olduğu anlamına gelir. A ve b'nin, a ve b'nin tüm özellikleri aynı olsa bile, farklı nesnelere gönderme yapması doğru olmaz.
- Sığ eşitlik : a ve b'nin başvurduğu nesnelerin tüm özellikleri aynı olduğunda, a = b'nin gerçek olduğu anlamına gelir. Sığ eşitlik, iki nesneyi temsil eden bellek alanının bitsel olarak karşılaştırılmasıyla kolayca uygulanabilir. Lütfen referans eşitliği için sığ eşitliği ima ettiğini unutmayın.
- Derin eşitlik : a ve b'deki her bir özellik aynı veya derinlemesine eşit ise, a = b'nin gerçek olduğu anlamına gelir. Lütfen derin eşitliğin hem referans eşitliği hem de sığ eşitlikten kaynaklandığını unutmayın. Bu anlamda, derin eşitlik en zayıf eşitlik şeklidir ve referans eşitlik en güçlü olanıdır.
Bu üç eşitlik türü sıklıkla kullanılırlar çünkü sıkça kullanılırlar: üç eşitlik kontrolünün tümü bir derleyici tarafından kolayca oluşturulabilir (derin eşitlik durumunda, derleyicinin bir yapının sınırsız döngüleri önlemek için etiket bitlerini kullanması gerekebilir). karşılaştırılabilir dairesel referanslara sahiptir). Ancak başka bir sorun var: bunların hiçbiri uygun olmayabilir.
Önemsiz olmayan sistemlerde, nesnelerin eşitliği genellikle derin ve referans eşitliği arasında bir şey olarak tanımlanır. İki nesneyi belirli bir bağlamda eşit olarak görmek isteyip istemediğimizi kontrol etmek için, bazı özelliklerin tamamen farklı bir şey olmasına izin verilebilirken, bazı özelliklerin hafızada ve diğerlerinde derin eşitlikle karşılaştırılması gerekebilir. Gerçekten seveceğimiz şey, genellikle literatürde semantik eşitlik olarak adlandırılan, gerçekten hoş bir diğeri olan “ileri bir eşitlik türüdür” . Etki alanımızdaki şeyler eşitse eşittir. =)
Böylece sorunuza geri dönebiliriz:
Bunu kabul etmemin bazı önemli yararları basitçe eksik olduğumu mu yoksa varsayılan davranışın mantıksal eşitlik olması gerektiği ve sınıf için mantıksal bir eşitlik yoksa referans eşitliğine geri dönülmesi makul görünüyor mu?
Herhangi bir dilde 'a == b' yazarken ne demek istiyoruz? İdeal olarak, her zaman aynı olmalıdır: Anlamsal eşitlik. Ama bu mümkün değil.
Ana düşüncelerden biri, en azından sayılar gibi basit tipler için, aynı değerin atanmasından sonra iki değişkenin eşit olmasını beklememizdir. Aşağıya bakınız:
var a = 1;
var b = a;
if (a == b){
...
}
a = 3;
b = 3;
if (a == b) {
...
}
Bu durumda, her iki ifadede de “eşittir b” olmasını bekliyoruz. Başka bir şey delilik olurdu. Dillerin çoğu (tümü değilse) bu sözleşmeyi izler. Dolayısıyla basit tiplerle (aka değerler) anlamsal eşitliği nasıl elde edeceğimizi biliyoruz. Nesnelerle, tamamen farklı bir şey olabilir. Aşağıya bakınız:
var a = new Something(1);
var b = a;
if (a == b){
...
}
b = new Something(1);
a.DoSomething();
b.DoSomething();
if (a == b) {
...
}
Biz ilk 'eğer' her zaman doğru olacağını bekliyoruz. Ama ikinci “eğer” de ne bekliyorsunuz? Bu gerçekten bağlıdır. 'Bir şey mi' a ve b'nin (anlamsal) eşitliğini değiştirebilir mi?
Anlamsal eşitlikle ilgili sorun, derleyici tarafından nesneler için otomatik olarak oluşturulamaması veya yapılan ödevlerden açıkça anlaşılmamasıdır . Kullanıcının anlamsal eşitliği tanımlaması için bir mekanizma sağlanmalıdır. Nesne yönelimli dillerde, bu mekanizma kalıtsal bir yöntemdir: eşittir . Bir parça OO kodu okuduğumuzda, tüm sınıflarda aynı yöntemi uygulayacak bir yöntem beklemiyoruz. Kalıtım ve aşırı yüke alışkınız.
Operatörler ile aynı davranışı bekliyoruz. 'A == b' gördüğünüzde, her durumda aynı eşitlik türünü beklemelisiniz (yukarıdaki 4'ten). Bu nedenle, tutarlılığı hedefleyen dil tasarımcıları her tür için referans eşitliği kullanmıştır. Bir programcının bir yöntemi geçersiz kılmamasına veya değiştirmemesine bağlı olmamalıdır.
Not: Dee dili Java ve C # 'dan biraz farklıdır: eşittir operatörü basit tipler için sığ eşitlik ve kullanıcı tanımlı sınıflar için semantik eşitlik anlamına gelir (= kullanıcıyla birlikte yatan işlemin uygulanması sorumluluğundadır - varsayılan ayar yoktur). Basit tipler için, sığ eşitlik her zaman anlamsal eşitlik olduğundan, dil tutarlıdır. Yine de ödediği bedel, eşittir operatörünün varsayılan olarak kullanıcı tanımlı türler için tanımsız olmasıdır. Bunu uygulamak zorundasın. Ve bazen bu çok sıkıcı.