생성기 모드의 학습

2860 단어

생성기 모드의 학습


전언


이전에 만약에 한 대상에 여러 개의 파라미터가 있다면 내가 구축할 때 항상 완전 초기화 방법과 유사한 것을 썼을 것이다. 최근에 <>라는 책을 보고 생성기 모드라는 서브시스템을 이용하여 대상을 생성하는 방식도 매우 공교롭다는 것을 발견했다. 다음에 소개하자.
예를 들어 하나의 수요, 요구구조 라는 대상은 , , 등의 속성을 가지고 있다. 그러면 우리는 어떻게 확장과 외부에 대한 영향을 줄이는 데 있어서 그를 설계할 것인가?먼저 일반적인 조작이 어떻게 되는지 봅시다.

전체 초기화 모드

- (instancetype)initWithFirstname:(NSString *)firstName lastName:(NSString *)lastName age:(NSInteger)age;

사실 수요를 충족시키고 데이터에 대해 필터를 할 수도 있지만 만약에 우리가 나중에 Person대상의 속성을 확장한다면 공유api를 변경해야 한다. 이것은 매우 번거로운 일이고 방법명도 길어져 10분의 1이 골치 아프다.그러나 상대적으로 좋은 점도 있다. 예를 들어 공공방법명이 바뀔 때 컴파일러가 컴파일되지 않아 개발자에게 업데이트가 필요하다고 제시한다.

생성기 모드


소스 코드 주소Person 클래스의 헤더 파일
#import 
#import "PersonBuilder.h"

@interface Person : NSObject

// , 
@property (copy, nonatomic) NSString *firstName;
@property (copy, nonatomic) NSString *lastName;
@property (assign, nonatomic) NSInteger age;

+ (instancetype)personWithBlock:(void (^)(PersonBuilder *))block;
- (instancetype)initWithBuilder:(PersonBuilder *)builder;

@end
Person 클래스의 구현 파일
#import "Person.h"
#define FY_SAFE_BLOCK(BlockName, ...) ({ !BlockName ? nil : BlockName(__VA_ARGS__); })
@implementation Person

- (instancetype)initWithBuilder:(PersonBuilder *)builder{
    if (self = [super init]) {
        // 
        self.firstName = builder.firstName;
        self.lastName = builder.lastName;
        self.age = builder.age;
    }
    return self;
}

+ (instancetype)personWithBlock:(void (^)(PersonBuilder *))block{
    PersonBuilder *builder = [[PersonBuilder alloc] init];
    // 
    FY_SAFE_BLOCK(block,builder);
    return [builder build];
}
@end
PersonBuilder의 헤더 파일
#import 

@class Person;
@interface PersonBuilder : NSObject

@property (copy, nonatomic) NSString *firstName;
@property (copy, nonatomic) NSString *lastName;
@property (assign, nonatomic) NSInteger age;

- (Person *)build;
@end
PersonBuilder의 구현 파일
#import "PersonBuilder.h"
#import "Person.h"

@implementation PersonBuilder

- (Person *)build{
    return [[Person alloc] initWithBuilder:self];
}
@end

구조 방식
    Person *personA = [Person personWithBlock:^(PersonBuilder *builder) {
        builder.firstName = @" ";
        builder.lastName = @" ";
        builder.age = 18;
    }];

이런 생성기 모델의 장점은 바로 아래로 호환되고 과거에 생성된 대상을 겸용할 수 있는 동시에 이런 낡은 대상에 대해 조작을 할 수 있다는 것이다. 예를 들어 Person의 부족한 대상에 대해 구조기에서 builder에 대한 판단을 하고 비어 있으면 묵인치를 설정할 수 있다. 물론 이것도 단점이다. 우리가 만약에 전집덕처럼 변경하는 것도 쉽지 않다.

좋은 웹페이지 즐겨찾기