Objective-C'deki sözde "Sınıf Kümesi" tam olarak nedir?


91

NSArray'in böyle bir şey olduğunu okuyordum. Kulağa ağır geliyor. Masamda Objective-C, Cocoa ve C hakkında 7 tane gerçekten şişman kitap var. Hiçbiri Sınıf Kümesi'nden hiç bahsetmiyor, en azından kitapların arkasındaki Dizinde bulamıyorum. Peki bu nedir?


Oops, bir dahaki sefere bu terim için bir bağlantı eklemeyi düşüneceğim. Önceki sorunun cevabına yorum yapacak olsaydın, orada cevap verirdim.
Georg Fritzsche

2
FWIW: yakın zamanda (Aralık 2013) Apple, iOS 7'yi kullanırken iOS 6 ile geriye dönük uyumluluğun üstesinden gelmenin bir yolu olarak Sınıf Kümelerinin kullanılmasını önerdi. Bu, "Modern Uygulamaları Tasarlamak, Bölüm 2" oturumundaki Apple Tech Talks 2013 / Berlin'deydi. Apple, son etkinlikten (17 Aralık) kısa bir süre sonra oturumların videolarını paylaşacaklarını söyledi. Belki de bu, iOS 6/7 değişikliklerinin gerçek bağlamında Sınıf Kümelerini anlamaya yardımcı olabilir.
brainray

Yanıtlar:


43

Apple'ın dokümanlardan ... . Kısacası, Foundation çerçevesinde kullanılan bir tasarım kalıbı, muhtemelen bu yüzden ObjC kitaplarında bahsedilmiyor.

Sınıf kümesi, bir dizi özel, somut alt sınıfı herkese açık, soyut bir üst sınıf altında gruplayan bir mimaridir. Sınıfların bu şekilde gruplandırılması, yalnızca herkesin görebileceği mimariyi gören kullanıcıya basitleştirilmiş bir arayüz sağlar.


1
roflmao. Teşekkürler. bir dahaki sefere google'layacağım. diye düşündüm şişman kitaplarımda değilse, sadece
kafanızda olabilir

1
Bu bağlantının eksik olduğu tek şey, ARC için uygulamanın en iyi şekilde nasıl değiştirileceğine dair bir açıklamadır.
Hyperbole

193

Steve'in başvurduğu CDP'de ne olduğunu bilmiyorum ama temelde Objective-C Sınıfı Küme, soyut Fabrika modelini uygulamayı destekleyen bir yapıdır .

Fikir basittir : Bir Fabrikası sağlamak istiyoruz (Cluster) arayüzü minimum bilgi ile, üreten ve duruma göre bir fabrika Nesne belirli somut örneği, o tatmin Fabrikası (Cluster) arayüzü tarafından açıklanan küme ailesinin davranışı.

Basit bir somut örnek : Bu örnek, belirli kahkaha türlerinden (örneğin Guffaw, Giggle) somut sınıflar üreten bir Laugh fabrikası sunar. Laugh initWithLaughter: yöntemine dikkat edin .

Laugh.h'de:

#define kLaughWithGuffaw  1
#define kLaughWithGiggle  2

@interface Laugh: NSObject {}
- (Laugh *) initWithLaughter:(NSUInteger) laughterType;
- (void) laugh;
@end

Laugh. M'de:

@interface Guffaws:Laugh {}
- (void) laugh;
@end

@interface Giggles:Laugh {}
- (void) laugh;
@end

@implementation Laugh
- (Laugh *) initWithLaughter:(NSUInteger) laugherType {
    id instanceReturn=nil;
    ; // Removed for ARC [self release]
    if ( laughterType == kLaughWithGuffaw )
        instanceReturn = [[Guffaws alloc]init];
    else if( laughterType == kLaughWithGiggle )
        instanceReturn = [[Giggles alloc]init];
    else
        ; // deal with this
    return instanceReturn;
}

- (void) laugh {
    NSLog(@"Humbug");
}
@end

@implementation Guffaws
    - (void) laugh {
        NSLog(@"OH HA HA HOWAH HA HA HA");
    }
@end

@implementation Giggles
    - (void) laugh {
        NSLog(@"Tee hee");
    }
@end

24
Diğer cevaplar belge ve kitap bağlantıları sağlamak için iyi olsa da, bunu sevdim çünkü bunun nasıl yapılacağını görmeyi güzel ve basit hale getiriyor. Teşekkürler
jamone

Bu örnek iyidir ancak tipik bir Fabrika modelinde alt sınıflar herkese açıktır. Bir Sınıf kümesinde alt sınıflar özeldir. developer.apple.com/library/ios/documentation/general/…
maxpower

1
@ AdriàNavarro. 'Da ilan edildikleri için dışarıdan görünmezler .m-file.
hfossli

4
(1) Bir inityöntemde kendini bırakıp başka bir şeyi iade etmek ne kadar güvenli ? Apple'dan bunu yaptıkları herhangi bir kod örneği var mı? (2) Ayrıca, muhtemelen gibi bir kodla bir örnek oluşturuyorsunuz [[Laugh alloc] initWithLaughter:kLaughWithGiggle]. LaughBu aramadan hemen sonra serbest bırakılacağı için, gereksiz yere nasıl tahsis edildiğine dikkat edin . [Laugh laughWithLaughter:kLaughWithGiggle]Yukarıdaki 1. ve 2. sorunlardan kaçınırken size özel alt sınıfların tüm avantajlarını sağlayan bir sınıf yöntemi oluşturabilirken bunu neden bu şekilde yapasınız?
Duyarlı

1
@Senseful Haklısın. Gerçek hayatta, +allocçeşitli -initWith:yöntemleri uygulayan tek bir fabrika sınıfını döndürür . Fabrika sınıfının -initWith:yöntemleri daha sonra, gerekirse, verilen yöntem parametrelerine dayalı olarak somut bir alt sınıf tahsis etmekten ve başlatmaktan sorumludur veya bazı durumlarda hiçbir şey tahsis etmeyebilir (örneğin -[NSString initWithString:]). Sen dönüş değerinde inceleyerek deneyebilirsiniz +[NSString alloc], +[NSArray alloc]vb
Darren

25

Sözlüğün 498. sayfasındaki Stephen Kochan tarafından c hedefindeki programlamadan, küme:

Soyut sınıf aracılığıyla kullanıcıya basitleştirilmiş bir arayüz sağlayan, bir dizi özel somut alt sınıfı gruplayan soyut bir sınıf.


5
+1 Özellikle orijinal soru göz önüne alındığında, bir Objective-C kitabından bir cevap alıntılamak için. Bu da güzel bir kitap.
Quinn Taylor

(+1) mükemmel tanım için. Bunu bir "Fabrika" kalıbı olarak adlandırmakla karşılaştığım sorun, böyle bir ismin soyut üst sınıf tarafından yönetilen özel alt sınıfların başlık altı etkileşimlerine değil, yalnızca nesnelerin yaratılmasına odaklanmasıdır . Aslında, bu üst sınıfı "soyut" olarak adlandırmak bile, aslında kendi alt sınıflarına oldukça (dahili olarak) bağımlı olduğundan ve bu nedenle, genellikle alt sınıfları hakkında hiçbir şey bilmeyen normal bir soyut sınıf olmadığından yanıltıcı olabilir.
devios1

18

Sınıf kümeleri, bir grup somut, özel alt sınıf uygulamasına tek bir genel arabirim sağlar. Bir hedef-c programcısı, sınıf kümelerini sıklıkla kullanır ve nadiren fark eder - ve bu, bir sınıf kümesinin tüm noktasıdır. Bir sınıf kümesinin görevi, uygulama ayrıntılarının karmaşıklığını bir genel arabirimin arkasına gizlemektir.

Foundation sınıflarının çoğu, NSString, NSArray, NSDictionary ve NSNumber gibi sınıf kümeleridir. [NSString stringWithFormat:]Sınıfı aradığınızda , size NSStringarayüzü uygulayan somut bir sınıf verir . Bu bir olabilir NSConcreteString, NSCFString, NSFooBarStringvb hangi sınıf küme sen yapıcısı dayalı veya aradığınız ve argümanlar vardır başlatıcısı olduğunu verir.

Bu nedenle, sınıf kümeleri, Objective-C programlamadaki en güçlendirici kavramlardan biridir.

  • Uygulaması çok kolay
  • Onu çağıran kodu değiştirmeden temel uygulamayı değiştirmek kolaydır.
  • Çalışma zamanında farklı somut uygulamalar sağlamak kolaydır (yani test kaynakları veya sahte nesneler)
  • Yukarıdakilerden dolayı, test edilmesi ve yeniden düzenlenmesi kolaydır

Başka dillerden geliyorsanız, Dörtlü Çete modellerine aşina olabilirsiniz. Sınıf kümeleri hem soyut fabrikanın hem de cephe desenlerinin unsurlarına sahiptir.

Apple'ın genel belgeleri, sınıf kümelerini (ve bunların nasıl uygulanacağını ve genişletileceğini) oldukça kapsamlı bir şekilde kapsar. Ne yazık ki, birçok iOS geliştiricisi için bu ve diğer Cocoa'ya özgü kalıpların bir kör nokta olduğunu buldum.

Kakao Temel Yetkinlikleri: Sınıf kümesi

Kakao Temelleri Kılavuzu: Sınıf Kümeleri

Kendi sınıf kümelerinizi nasıl uygulayacağınıza dair örnekler GitHub'da mevcuttur


7

NSArray sınıf kümesi "ağır" değildir, bir dizi sınıfının herhangi bir sayıda uygulamasının kodunuz belirli bir uygulamayı bilmeden veya önemsemeden kullanmanın bir yoludur. Başlık altında, büyük, seyrek diziler veya derleme zamanında bilinen belirli sayıda öğe içeren diziler gibi farklı kullanım durumlarına uygun somut NSArray alt sınıfları vardır.

NSArray, NSString ve NSNumber, en sık karşılaşacağınız sınıf kümeleridir.


6
İronik olarak, pratikte artık küme başına yalnızca bir somut sınıf kullanılmaktadır - NSCF {Array | String | Number} - ve uygulama değişiklikleri bu sınıfın içindedir. En azından bildiğim kadarıyla bu. NSArray ve NSMutableArray örnekleri bile aynı sınıfı gösterir.
Chuck

1
@Chuck - bu nasıl olabilir? Bir NSMutableArray ve NSArray kendilerini aynı sınıf olarak bildirselerdi, olmaması gerekse [myArray isKindOfClass:[NSMutableArray class]]bile YES döndürmez miydi?
Robert

1
@Robert: Ve gerçekten de yorumum sırasında durum buydu. Bugünlerde Apple, NSCFArray'i __NSArrayM ve __NSArrayI ile değiştirdi, bu yüzden artık öyle olmadığını düşünüyorum, ancak yine de her zaman tekrar değiştirebilecekleri için buna bağlı olarak kendimi rahat hissetmem.
Chuck
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.