Objective-C에서 소위 "클래스 클러스터"는 정확히 무엇입니까?


91

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


죄송합니다. 다음에 해당 용어에 대한 링크를 추가 할 생각입니다. 이전 질문에 대한 답변에 대해 언급했다면 거기에 응답했을 것입니다.
Georg Fritzsche

2
FWIW : 최근 (2013 년 12 월) Apple은 iOS 7을 사용하는 동안 iOS 6에 대한 하위 호환성을 처리하는 방법으로 Class Clusters를 사용할 것을 권장했습니다. 이것은 Apple Tech Talks 2013 / Berlin에서 "Architecting Modern Apps, Part 2"세션에서 진행되었습니다. 애플은 마지막 행사 (12 월 17 일) 직후 세션 영상을 게시 할 것이라고 밝혔다. 따라서 이것은 iOS 6/7 변경의 실제 컨텍스트 내에서 클래스 클러스터를 이해하는 데 도움이 될 것입니다.
brainray

답변:


42

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

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


1
roflmao. 감사. 다음에 구글에 올거야. 내 뚱뚱한 책이 아니라면, 그것은 당신의 머리에만있을 수 있다고 생각했습니다;)
openfrog 2009

1
이 링크에서 누락 된 한 가지는 ARC 구현을 가장 잘 변경하는 방법에 대한 설명입니다.
Hyperbole

193

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

24
다른 답변은 문서 및 도서 링크를 제공하는 것이 좋지만 실제로 이것을 수행하는 방법을 쉽고 간단하게 볼 수 있기 때문에 좋아합니다. 감사합니다
jamone 2011

이 예제는 좋지만 일반적인 Factory 패턴에서는 하위 클래스가 공용입니다. 클래스 클러스터에서 하위 클래스는 비공개입니다. developer.apple.com/library/ios/documentation/general/…
maxpower

1
@ AdriàNavarro .NET Framework에서 선언되었으므로 외부에서 볼 수 없습니다 .m-file.
hfossli 2014 년

4
(1)init 메서드 에서 자신을 해제 하고 다른 것을 반환 하는 것이 얼마나 안전 합니까? 이 작업을 수행하는 Apple의 코드 예제가 있습니까? (2) 또한 아마도 [[Laugh alloc] initWithLaughter:kLaughWithGiggle]. Laugh이 호출 직후에 해제되므로 불필요하게 할당되는 방법을 확인 하십시오. [Laugh laughWithLaughter:kLaughWithGiggle]위의 문제 1 및 2를 피하면서 개인 하위 클래스의 모든 이점을 제공 하는 클래스 메서드를 만들 수 있는데 왜 이런 식으로 수행 합니까?
Senseful 2014-06-26

1
@Senseful 당신이 맞아요. 실생활 +alloc에서 다양한 -initWith:메서드 를 구현하는 단일 팩토리 클래스를 반환 합니다. 공장 클래스의 -initWith:방법이 필요한 경우, 지정된 메소드 매개 변수를 기반으로 구체적인 서브 클래스를 할당하고 초기화에 대한 책임, 또는 어떤 경우에는 모든 (예에서 아무것도를 할당 할 수 있습니다 -[NSString initWithString:]). 당신의 반환 값에 검사하여 시도 할 수 있습니다 +[NSString alloc], +[NSArray alloc]
대런

25

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

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


5
+1 Objective-C 책, 특히 원래 질문에서 답을 인용합니다. 그것도 좋은 책입니다.
Quinn Taylor

(+1) 뛰어난 정의. 이것을 "Factory"패턴이라고 부르는 문제는 그러한 이름 이 추상 슈퍼 클래스에 의해 관리되는 개인 서브 클래스의 내부 상호 작용이 아니라 객체 생성 에만 초점을 맞추는 것입니다 . 실제로이 수퍼 클래스를 "추상"이라고 부르는 것조차도 실제로는 자체 서브 클래스에 상당히 (내부적으로) 의존하기 때문에 오해의 소지가 있으며, 따라서 일반적으로 서브 클래스에 대해 전혀 알지 못하는 일반 추상 클래스가 아닙니다.
devios1

18

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

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

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

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

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

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

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

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

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


7

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

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


6
아이러니하게도 실제로 클러스터 당 하나의 구체적인 클래스 (NSCF {Array | String | Number}) 만 더 이상 사용되며 구현 변경 사항은 해당 클래스 내부에 있습니다. 어쨌든 그것은 내가 아는 한입니다. NSArray 및 NSMutableArray 인스턴스도 동일한 클래스를 표시합니다.

1
@ 척-어떻게 이럴 수 있나요? NSMutableArray와 NSArray가 같은 클래스라고보고하면 [myArray isKindOfClass:[NSMutableArray class]]YES를 반환 하지 않더라도 YES를 반환하지 않습니까?
로버트

1
@Robert : 그리고 실제로 제 의견을들을 때 그랬습니다. 요즘 Apple은 NSCFArray를 __NSArrayM 및 __NSArrayI로 대체했기 때문에 더 이상 그렇지 않다고 생각하지만 항상 다시 변경할 수 있기 때문에 여전히 편안하지 않을 것입니다.
Chuck
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.