[objective-c] Objective-C에서 소위 “클래스 클러스터”는 정확히 무엇입니까?

NSArray가 바로 그런 것임을 읽었습니다. 무겁게 들립니다. 저는 Objective-C, Cocoa, C에 관한 7 권의 책을 책상에 가지고 있습니다. 그들 중 누구도 Class Cluster를 전혀 언급하지 않았습니다. 적어도 책 뒷면의 Index에서는 찾을 수 없습니다. 그래서 그것은 무엇입니까?



답변

애플의 문서에서 … . 간단히 말해 Foundation 프레임 워크에서 사용되는 디자인 패턴이므로 ObjC 책에서 언급되지 않은 것 같습니다.

클래스 클러스터는 공용 추상 슈퍼 클래스 아래에 여러 개인의 구체적인 하위 클래스를 그룹화하는 아키텍처입니다. 이러한 방식으로 클래스를 그룹화하면 공개적으로 표시되는 아키텍처 만 보는 사용자에게 단순화 된 인터페이스가 제공됩니다.


답변

Steve가 참조한 CDP에 무엇이 있는지 모르겠지만 기본적으로 Objective-C Class Cluster는 추상 팩토리 패턴 구현을 지원하는 구성입니다 .

아이디어는 간단하다 : 당신은 공장을 제공 할 (클러스터) 인터페이스 최소한의 설명과 함께, 제조 및 반환 팩토리 객체의 특정의 구체적인 인스턴스 것을 만족 공장 (클러스터) 인터페이스에 의해 기술 클러스터 가족의 동작.

간단한 구체적인 예 :이 예는 특정 웃음 유형 (예 : Guffaw, Giggle)의 구체적인 클래스를 생성하는 Laugh 팩토리를 제공합니다. Laugh initWithLaughter : 메소드에 주의하십시오 .

Laugh.h에서 :

#define kLaughWithGuffaw  1
#define kLaughWithGiggle  2

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

Laugh.m에서 :

@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


답변

용어집의 498 페이지에있는 Stephen Kochan의 목표 c 프로그래밍에서 클러스터 :

추상 클래스를 통해 사용자에게 단순화 된 인터페이스를 제공하는 개인용 구체적인 하위 클래스 집합을 그룹화하는 추상 클래스입니다.


답변

클래스 클러스터는 구체적인 개인 서브 클래스 구현 그룹에 단일 공용 인터페이스를 제공합니다. Objective-c 프로그래머는 클래스 클러스터를 자주 사용하고 거의 인식하지 못합니다. 이것이 클래스 클러스터의 전체 요점입니다. 클래스 클러스터의 역할은 공용 인터페이스 뒤에 구현 세부 사항의 복잡성을 숨기는 것입니다.

많은 Foundation 클래스는 NSString, NSArray, NSDictionary 및 NSNumber와 같은 클래스 클러스터입니다. [NSString stringWithFormat:]클래스 클러스터 를 호출 하면 NSString인터페이스 를 구현하는 구체적인 클래스가 제공 됩니다. 그것은이 될 수있다 NSConcreteString, NSCFString, NSFooBarString, 등 어떤 클래스 클러스터가 생성자에 따라 또는 호출하고 인수하는 초기화되어 있습니다.

이 때문에 클래스 클러스터는 Objective-C 프로그래밍에서 가장 강력한 개념 중 하나입니다.

  • 구현하기 매우 쉬움
  • 이를 호출하는 코드를 변경하지 않고도 기본 구현을 쉽게 변경할 수 있습니다.
  • 런타임에 다른 구체적인 구현을 쉽게 제공 (예 : 테스트 리소스 또는 모의 객체)
  • 위의 이유로 테스트 및 리팩터링이 쉽습니다.

다른 언어에서 온 경우 Gang of Four 패턴에 익숙 할 것입니다. 클래스 클러스터에는 추상 팩토리와 파사드 패턴 모두의 요소가 있습니다.

Apple의 공개 문서는 클래스 클러스터 (및이를 구현하고 확장하는 방법)를 상당히 광범위하게 다룹니다. 불행히도 많은 iOS 개발자들에게이 패턴과 다른 Cocoa 특정 패턴은 사각 지대라는 것을 알게되었습니다.

Cocoa 핵심 역량 : 클래스 클러스터

Cocoa 기초 가이드 : 클래스 클러스터

자체 클래스 클러스터를 구현하는 방법의 예는 GitHub에서 제공됩니다.


답변

NSArray 클래스 클러스터는 “무거운”것이 아니며, 코드가 특정 구현을 인식하거나 신경 쓰지 않고도 배열 클래스의 여러 구현을 사용할 수있는 방법입니다. 내부적으로는 대규모, 희소 배열 또는 컴파일 시간에 알려진 특정 수의 요소를 포함하는 배열과 같은 다양한 사용 사례에 적합한 NSArray의 구체적인 하위 클래스가 있습니다.

NSArray, NSString 및 NSNumber는 가장 자주 접하게되는 클래스 클러스터입니다.


답변