“懒惰”用于两种不同的上下文。
第一个,当批评一个类的设计时,认为一个类是无效的——它没有做足够的事情来证明它的存在。人们也称这种类为“薄”。 这可能不是你在这里的意思。
其次,惰性求值和惰性实例化意味着类仅在实际需要时才执行评估属性或初始化自身的工作。
例如,假设我们有一个创建 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;
}
如果我们实例化一个 Employee 只是为了确定他们是否是 Founder,我们根本不需要查找他们的记录!
.....
if ([thisEmployee isFounder]) {
[self sendCandyTo: thisEmployee.identification];
}
另一方面,有时我们需要它们:
- (NSArray*) payments
{
return [self.records retrievePayStubs];
}
因此,如果我们构建一个 Employee 只是为了 call isFounder
,我们就浪费了数据库查找。但是我们不能跳过它,因为payments
需要它。
我们所做的是将数据库查找从构造函数中取出并将其放入load
方法中。
- (void) load
{
if (records) return;
self.records=[self retrieveEmployeeRecordsFor: ident];
}
- (NSArray*) payments
{
[self load];
return [self.records retrievePayStubs];
}
现在,我们只在实际需要时才加载员工记录。如果它们已经被加载,我们不会做任何额外的工作(除了一个方法调用)。如果我们从不需要付款记录,那么我们根本不需要做这项工作。
该课程仅在必要时才起作用——并等到最后一分钟才开始工作。这是“懒惰”!