친애하는 모든 : 미리 시간을내어 고맙습니다.재귀 클래스 디자인 패턴 : 옵션 및 모범 사례
최근에 Objective-C (저는 오랫동안 C 해커였습니다)와 Kochan의 아름다운 텍스트를 읽고 Apple 설명서를 읽은 후에도 재귀 클래스 (즉, ivar의 타입이 동일한 클래스 인 인 클래스). 구체성을 위해 이진 트리 클래스를 구현한다고 가정 해 봅시다.
@interface MMNode : NSObject {
NSString *label;
}
이제 우리는 두 가지 방법으로 우리의 트리를 구현할 수 있습니다 : 먼저 우리는 I가 단순화 기본적인 노드 클래스를 가지고있다. 첫 번째 (그리고 좀 더 분명한 접근법으로 생각하는) 클래스 자체에 재귀를 배치하고 있습니다. 다음
@interface MMTree : NSObject {
MMNode *root;
MMTree *leftTree;
MMTree *rightTree;
}
@property (nonatomic, copy) MMNode *root;
@property (nonatomic, retain) MMTree *leftTree;
@property (nonatomic, retain) MMTree *rightTree;
훌륭한 CHDataStructures.framework에 이용되는 제 2 방법은 데이터 구조를 구현한다
여기typedef struct MMTreeNode {
MMNode *node;
// union {
// struct {
struct MMTreeNode *leftTree;
struct MMTreeNode *rightTree;
// };
// };
} MMTreeNode;
@interface MMTreeStruct : NSObject {
MMTreeNode *root;
}
용액은 재귀보다 "포인터 riffic"인 구조로 에 밀어 넣습니다. 주석에서 언급했듯이 익명 구조와 노동 조합은 필요하지 않지만 많은 응용 프로그램에서는 각 노드에 추가 정보가 필요하기 때문에 코드를 그대로 두겠습니다.
두 가지 솔루션을 모두 구현했으며 제대로 작동합니다. 전자는 더 직관적 인 것처럼 보입니다. 후자는 약간 더 복잡한 소스가있는 "C 중심"입니다.
후자의 기술이 선호됩니까? 그렇다면 객관적인 이유는 무엇입니까? 내가 결정할 수있는 것은 아마 구조가 고정 된 크기를 가지기 때문에 후자가 더 많은 메모리 친화적 인 것일 것이다.
다시 말씀 드리지만 StackOverflow와 CocoaHeads에 감사드립니다.
업데이트 : 추가해야, 그것은 CoreFoundation에서 객체 CFTree 비슷한 구조 구현을 사용하는 것 같다.
CFTree는 'binary'일 필요는 없습니다. http://www.opensource.apple.com/source/CF/CF-635/CFTree.c에서 소스 코드를 볼 수 있습니다. 죄송합니다. 여기에 물어봐서 미안합니다. 어떤 분이 와트 목적을 말해 주시겠습니까?이 CFTree는 NSDictionary와 NSArray를 사용하여 수행 할 수 없습니다. – Tatvamasi