「レイジー」は、2つの異なるコンテキストで使用されます。
クラスデザインを批評するとき、最初に、クラスは効果がない - その存在を正当化するのに十分ではないと主張します。人々はまた、この種のクラスを「薄い」と呼びます。 これはおそらくあなたがここで意味するものではありません。
第二に、遅延評価と怠惰なインスタンス化クラスは唯一のプロパティを評価したり、実際に必要なときに自分自身を初期化する作業を行うことを意味します。
たとえば、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];
}
我々だけisFounder
を呼び出すために従業員を構築しているのであれば、我々はデータベース検索を無駄に。しかし、それをスキップすることはできません。payments
が必要です。
私たちは、データベースの参照をコンストラクタから取り出し、load
メソッドに入れます。
- (void) load
{
if (records) return;
self.records=[self retrieveEmployeeRecordsFor: ident];
}
- (NSArray*) payments
{
[self load];
return [self.records retrievePayStubs];
}
従業員レコードは、実際に必要なときにのみ読み込まれます。それらが既にロードされている場合、私たちは余分な作業をしません(1つのメソッド呼び出しを除いて)。支払い記録が必要ない場合は、作業を一切行う必要はありません。
このクラスは、作業を行うために最後の1分を待つ必要があるときにのみ機能します。それは "怠け者!"
は、プラグインからロードされたクラスである可能性があります。プラグイン/ dyld /動的にロードされたコードのドキュメントをチェックしてください。 – nielsbot
クラスだけがリストではなく怠け者であることは確かですか? –
私は@ JoshCaswellと合意しています。後でランタイムソースには、クラスの遅延読み込みへの参照があります。それは、クラスが「怠け者」ではなく、リストをほぼ確実に指しています。 – lxt