「レイジー」は、2 つの異なるコンテキストで使用されます。
1つ目は、クラスの設計を批判するとき、クラスは効果がなく、その存在を正当化するのに十分ではないと主張します。この種のクラスは「シン」とも呼ばれます。 これはおそらくあなたがここで言っていることではありません。
第二に、遅延評価と遅延インスタンス化は、実際に必要なときにクラスがプロパティを評価するか、それ自体を初期化する作業のみを行うことを意味します。
たとえば、Employee オブジェクトを作成するクラスがあるとします。
@implementation Employee
- (id) initWithID: (IdentificationCode*) ident
{
self =[super init]
if (self) {
_records=[self retrieveEmployeeRecordsFor: ident];
_identification=ident;
}
return self;
}
これは問題ありませんが、データベースからすべてのレコードを取得すると時間がかかる場合があります。また、その作業を行う必要がない場合もあります。例えば:
- (BOOL) isFounder
{
if (indent.number<10) return YES;
return NO;
}
従業員がファウンダーかどうかを調べるためだけに従業員をインスタンス化する場合は、従業員のレコードを検索する必要はまったくありません。
.....
if ([thisEmployee isFounder]) {
[self sendCandyTo: thisEmployee.identification];
}
一方、時にはそれらが必要になります:
- (NSArray*) payments
{
return [self.records retrievePayStubs];
}
そのため、 を呼び出すためだけに Employee を構築している場合isFounder
、データベース ルックアップが無駄になります。しかし、それをスキップすることはできませんpayments
。
コンストラクターからデータベース ルックアップを取り出し、それをload
メソッドに入れます。
- (void) load
{
if (records) return;
self.records=[self retrieveEmployeeRecordsFor: ident];
}
- (NSArray*) payments
{
[self load];
return [self.records retrievePayStubs];
}
これで、実際に必要なときにのみ従業員レコードをロードします。それらがすでにロードされている場合、追加の作業は行いません (1 つのメソッド呼び出しを除いて)。支払い記録がまったく必要ない場合は、作業を行う必要はまったくありません。
クラスは、必要な場合にのみ機能し、最後の最後まで待機します。「怠け者だ!」です。