SORU
10 Temmuz 2009, Cuma


-Karma / -ısequal uygulama: Objective-C koleksiyonlar için / -isEqualTo...:

Not:Soru aşağıdaki ilgili, ama ne onlar ne de bağlantılı kaynakları tam olarak sorularıma, özellikle için eşitlik testleri uygulamaya ilişkin cevap gibi görünüyornesnelerin koleksiyonları.

< / ^ hr .

Arka plan

NSObject sağlarvarsayılanuygulamaları -hash (döner adresi örneği, (NSUInteger)self) ve -isEqual: (döner NO sürece adreslerini alıcı ve parametre ile aynı). Bu yöntemleri gerektiği gibi geçersiz olacak şekilde tasarlanmıştır, ancak belgeler her iki ya da ne vermeniz gerektiğini açıkça ortaya koyuyor. -isEqual: iki nesne için YES verir daha sonra bu nesneleri için -hash sonucugerekiraynı olması. Değilse, sorunlar aynı — -compare: iki dize örnekleri gibi olması gereken nesneler döndüğünde doğmak NSOrderedSame — Kakao bir toplama eklenir veya doğrudan karşılaştırıldığında.

Bağlam

CHDataStructures.framework, Objective-C açık kaynak kodlu bir kütüphane veri yapıları geliştirmek. Koleksiyonları bir dizi hayata geçirdik, ve şu anda ve işlevlerini rafineri artırılması. Eklemek istediğim özelliklerden bir diğeri ile eşitliği koleksiyonları karşılaştırmak için yeteneğidir.

Sadece bellek adresleri karşılaştırmak yerine, bu karşılaştırmalar iki koleksiyon (varsa sipariş de dahil olmak üzere) gökcisimlerinin düşünmelisiniz. Bu yaklaşım, Kakao içinde tam bir emsal vardır, ve genellikle ayrı bir yöntem, aşağıdaki gibi kullanır:

Yapmak istiyorum benim özel koleksiyonlar sağlam testler eşitliği, yani onlar güvenli bir şekilde (ve tahmin) eklenen diğer koleksiyonları ve izin diğerleri (gibi bir NSSet) olup olmadığını belirlemek için iki koleksiyon olan eşit/eşdeğer/çoğaltır.

Sorunları

-isEqualTo...: yöntem iyi çalışıyor kendi kendine, ama sınıflar tanımlamak bu yöntemler genellikle de geçersiz kılmak -isEqual: çağırmak [self isEqualTo...:] eğer parametre aynı sınıf (ya da belki de alt sınıf olarak alıcı veya [super isEqual:] aksi. Bu sınıf da -hash aynı içeriğe sahip farklı örnekler için aynı değeri döndürür böyle tanımlamak gerekir.

Ayrıca, -hash Apple'ın dokümantasyonu aşağıdakileri öngörmektedir: (vurgu benim)

"Eğer bir değişken object eklenir koleksiyonu kullanan karma değerlerini belirlemek için nesnenin konumu koleksiyonu dönen değer olarak karma yöntemin nesne olmamalıdır değiştirirken nesne koleksiyonu. Bu nedenle,yakarma yöntem nesnenin iç durumu bilgileri dayanmaz gerekiryanesne toplama sırasında nesnenin iç durumu bilgileri değiştirmez emin olmalısınız. Böylece, örneğin, değişken bir sözlük karma bir tablo koyabilirsiniz ama orada olduğu sürece, bunu değiştirmek gerekir. (Ya da belirli bir nesne bir koleksiyon olup olmadığını bilmek zor olabilir unutmayın.)"

Düzenleme:Ben kesinlikle bu gerekli ve tamamen mantık katılıyorum neden burada ek bağlam sağlamak için bahsettiğim anlamak ve kısalık uğruna davayı neden konu etekli.

Benim koleksiyonları tüm değişken ve karma azından dikkate almak gerekirbazıiçeriğini, tek seçenek burada bir programlama hatası bir koleksiyon bir koleksiyonda saklı mutasyona ele almaktır. (Benim koleksiyonları NSDictionary gibi koleksiyonları başarıyla kopyalama gibi bir anahtar olarak kullanmak için yapabilirsiniz böylece NSCopying, kabul.)

Çok mantıklı bana uygulamak -isEqual: -hash beri (örneğin) bir dolaylı kullanıcı bir sınıfım olduğunu bilmiyor olabilir belirli -isEqualTo...: yöntem için çağrı, ya da umurunda bile olsa iki nesne örneklerinin aynı sınıf. Yazın herhangi bir değişken id -isEqual: -hash ve beklenen sonucu almak aramak gerekir.

-isEqual: iki örneği karşılaştırması, erişimi vardır), -hash "körü körüne", erişim ile belirli bir örnek içinde veri sadece. bir sonuca dönmek gerekir aksineKarma için kullanıldığını bilmek mümkün değil, sonuç için tutarlı olmalıdırtümeşit düşünülmesi gereken Olası örneklerini birebir aynı, ve her zaman -isEqual: ile kabul etmesi gerekir.(Edit: Bu cevaplar aşağıda çürütüldü, ve kesinlikle hayatı kolaylaştırır.)Ayrıca, iyi karma işlevler yazma önemsiz değil — teklik garanti özellikle sadece onu temsil etmek için bir NSUİnteger (32 veya 64-bit) bir sorundur.

Soru

  1. En iyi uygularken uygulamaları vardıreşitlik karşılaştırmaları31* *koleksiyonları için?
  2. Objective-C ve Kakao-esque koleksiyonları için plan için herhangi bir özellikleri var mı?
  3. Güven makul bir derecesi ile birim testi için herhangi bir iyi yaklaşımlar -hash var mı?
  4. Koleksiyon keyfi türdeki öğeleri içeren için -hash -isEqual: kabul için uygulama üzerinde herhangi bir öneriniz var mı? Tuzaklar ben. (Düzenleme:Ben ilk düşündüğüm kadar sorunlu değil@kperryuaçıkış noktaları, "-hash değerlerin eşitdeğil-isEqual: ima".)

< / ^ hr .

Düzenleme:Nasıl uygulanacağı hakkında kafam karışık değil-ısequal başınayken:- isEqualTo...: koleksiyon için, her şey ortada. Benim karışıklık ağırlıklı (yanlışlıkla)- karma farklı bir değeri varsa-ısequal dönmesi GEREKTİĞİNİ düşünüyor kaynaklanıyor sanırım: verir. Geçmişte şifreleme yapmış olan, farklı değerler için farklı sağlamalarının GEREKTİĞİNİ düşünüyordum. Ancak, cevabını bana fark ettirdi "iyi" karma işlevi gerçektenen aza indirmek-hash kullanan koleksiyonları için kova çarpışmalar ve zincirleme. Benzersiz sağlamalarının tercih ederken, kesin bir gereklilik değildir.

CEVAP
11 Temmuz 2009, CUMARTESİ


Koleksiyon için benzersiz hash değerleri üretecek, genellikle yararlı bazı hash fonksiyonu ile gelip çalışıyorum beyhude bir egzersiz olduğunu düşünüyorum. Tüm içeriğini sağlamalarının birleştirerek U62 önerisi hash fonksiyonu O(n) yapar gibi iyi ölçek değildir. Hash fonksiyonları gerçekten O olmalı(1) iyi performans sağlamak için, aksi takdirde karma amacı yendi. (Ortak Kakao sözlükler, diziler ve diğer sözlükler içeren olan plists,, reklam nauseum potansiyel olarak inşa düşünün. Büyük bir plist üst düzey sözlük karmasını almaya çalışan koleksiyonları' hash fonksiyonları(n).) Eğer dayanılmaz derecede yavaş olacaktır

Benim önerim bir koleksiyonun karma hakkında çok endişe etmeyin. Eğer belirtildiği gibi, -isEqual: ima -hash değerleri eşit. Diğer yandan -hash eşit değerlerdeğil-isEqual: anlamına gelmez. Bu aslında basit bir hash oluşturmak için rotadan bir sürü verir.

Eğer (ve kanıt var . ama çarpışmalar hakkında gerçekten merak ediyorsanız ^em>beton ölçümlerigerçek-dünya endişelenecek bir şey olduğunu teyit durumlar), hala bir dereceye kadar U62 tavsiyesi takip ediyor olabilir. Örneğin, diyelim ki, koleksiyonunda ilk ve/veya son öğe karma almak ve, diyelim ki, koleksiyon -count ile birleştirebilirsiniz. İyi bir karma sağlamak için yeterli olacaktır.

Bu sorulardan en az biri cevaplar umarım.

No. 1: -isEqual: Uygulama oldukça kesilmiş ve kuru. İçeriğini sıralamak ve ısequal kontrol: elementler. her

Bu koleksiyon için kararını etkileyebilir' -hash fonksiyonlar. en çok dikkat etmen gereken bir şey var Koleksiyonları müşterileri de kuralları -isEqual: -hash düzenleyen anlamak gerekir. İçeriğini siz' koleksiyonu -hash -hash, koleksiyonu içeriğini bozar' isEqual: ve -hash aynı fikirde değil. Müşterinin hatası değil elbette, ama bu ** 51 koleksiyonu içeriğini kapalı dayandırarak karşı başka bir argüman.

2 numara biraz muğlak. Tabii, önemli değil.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ChannelRichard

    ChannelRicha

    7 Kasım 2008
  • Rockstar Games

    Rockstar Gam

    17 ŞUBAT 2006
  • Triune Films

    Triune Films

    9 ŞUBAT 2006