(18) [OC 고효율 시리즈] 가급적 불변 대상을 사용한다

1711 단어
1. 대상의 가변 내용을 최대한 줄인다
(8) [OC 고효율 시리즈] 이해 대상 등 동성 중의 6조에서 보듯이 가변 내용을 콜렉션에 넣은 다음에 그 내용을 바꾸면 set의 내부 구조가 파괴될 수 있다.그래서 대상의 가변적인 내용을 최대한 줄인다.
2.readonly,readwrite
만약 하나의 속성이 대외적으로 읽을 수 있고, 대내적으로 읽을 수 있다면, 이 클래스의 공공 인터페이스에서readonly를 설명하고, 클래스 확장에서readwrite로 다시 설명해야 한다. 예를 들어 아래의 클래스와 같다.
@interface Person : NSObject

@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int  age;
@property (nonatomic,strong) NSDate *birthday;
@property (nonatomic,readonly) NSArray *friends;
- (void)addFriend:(Person *)person;
- (void)removeFriend:(Person *)person;
@end

@interface Person ()
@property (nonatomic,readwrite,strong) NSMutableArray *friends;
@end
@implementation Person
- (instancetype)init
{
    self = [super init];
    if (self) {
        _friends = [NSMutableArray array];
    }
    return self;
}
- (void)addFriend:(Person *)friend{
    if(friend){
        [_friends addObject:friend];
    }
}
- (void)removeFriend:(Person *)friend{
    if(friend){
        [_friends removeObject:friend];
    }
}
@end

이렇게 하면 사용자가 만약에 프렌드를 추가하거나 프렌드를 삭제하려면 반드시 개인 대상 자체를 통과해야 한다. 이렇게 하면 내부 데이터의 통일성을 유지하기 쉽다. 만약에 프렌드를 직접 노출시키면 프렌드의 수정 대상 자체가 모르기 때문에 버그가 발생하기 쉽다.
3. 가변적인 콜렉션 속성을 그대로 드러내지 마라
위의 코드는 어느 정도 문제가 있다. 비록 공공 성명에서 프렌즈는 NSArray이고 변할 수 없는 대상이지만 실제 되돌아오는 대상은 여전히 NSMutable Array이기 때문에 사용자는 강제 전환을 통해 수정할 수 있다.그래서 저희가 여자친구의 Getter 방법을 덮어쓸 수 있어요.
- (NSArray *)friends{
    return [_friends copy];
}

copy에 관해서는 (6)[OC 고효율 시리즈]에서 속성에 대한 소개도 있습니다.
물론 너도 이 방법을 다시 쓰지 않을 수 있다. 왜냐하면 복제도 약간의 성능을 소모해야 하기 때문이다.
따라서 다른 사람의 클래스나 라이브러리를 사용할 때 클래스 자체가 제공한 속성에 대한 설정 방법을 최대한 사용하고 이런 방법을 빙빙 돌려서는 안 된다. 그렇지 않으면 데이터가 일치하지 않을 수 있다.

좋은 웹페이지 즐겨찾기