생성기 모드의 학습
생성기 모드의 학습
전언
이전에 만약에 한 대상에 여러 개의 파라미터가 있다면 내가 구축할 때 항상 완전 초기화 방법과 유사한 것을 썼을 것이다. 최근에 <>
라는 책을 보고 생성기 모드라는 서브시스템을 이용하여 대상을 생성하는 방식도 매우 공교롭다는 것을 발견했다. 다음에 소개하자.
예를 들어 하나의 수요, 요구구조
라는 대상은
,
,
등의 속성을 가지고 있다. 그러면 우리는 어떻게 확장과 외부에 대한 영향을 줄이는 데 있어서 그를 설계할 것인가?먼저 일반적인 조작이 어떻게 되는지 봅시다.
전체 초기화 모드
- (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
에 대한 판단을 하고 비어 있으면 묵인치를 설정할 수 있다. 물론 이것도 단점이다. 우리가 만약에 전집덕처럼 변경하는 것도 쉽지 않다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSON
JSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다.
그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다.
저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.
- (instancetype)initWithFirstname:(NSString *)firstName lastName:(NSString *)lastName age:(NSInteger)age;
#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
#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
#import
@class Person;
@interface PersonBuilder : NSObject
@property (copy, nonatomic) NSString *firstName;
@property (copy, nonatomic) NSString *lastName;
@property (assign, nonatomic) NSInteger age;
- (Person *)build;
@end
#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;
}];
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.