如何在从 NSUserDefaults 初始化时降低高圈复杂度
How to reduce high cyclomatic complexity while initializing from NSUserDefaults
我有一个对象的初始值设定项:
-(id)init
{
self = [super init];
if (self) {
if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
}
if([[NSUserDefaults standardUserDefaults] objectForKey:kInitialSetupCompleted] != nil){
_initialSetupCompleted = [[NSUserDefaults standardUserDefaults] boolForKey:kInitialSetupCompleted];
}
if([[NSUserDefaults standardUserDefaults] objectForKey:kDashboardMessage] != nil){
_dashboardMessage = [[NSUserDefaults standardUserDefaults] objectForKey:kDashboardMessage];
} else{
_dashboardMessage = [[NSBundle mainBundle] localizedStringForKey:kDMDefaultDashboardMessage value:kDMDefaultDashboardMessage table:nil];
}
//50 other if statements
}
return self;
}
执行此操作的更好方法是什么,这样我在进行 OCLint 分析时就不会收到这些警告?
谢谢!
所有实例变量初始化为0;这意味着 BOOL
被初始化为 NO
。因此效果为:
if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
}
... 是:如果有存储值,则将 _termsAccepted
设置为它。否则 _termsAccepted
将是 NO
.
boolForKey:
记录的 return 值为:
If a boolean value is associated with defaultName in the user
defaults, that value is returned. Otherwise, NO
is returned.
所以比较和对比只是:
_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
... 在这种情况下,最终结果将是:如果存在存储值,则将 _termsAccepted
设置为它。否则 _termsAccepted
将是 NO
.
因此,为了降低圈复杂度,删除 if
语句。他们什么都不加。
编辑:有人正确地指出我错过了 BOOL
并非专门使用的事实。
使用 -[NSUserDefaults registerDefaults:]
建立您的后备值。这些一旦设置就保存在内存中,但不会写入商店。然后用户默认自己将处理所有类型对象的 "if no value stored, use this value" 情况。
我有一个对象的初始值设定项:
-(id)init
{
self = [super init];
if (self) {
if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
}
if([[NSUserDefaults standardUserDefaults] objectForKey:kInitialSetupCompleted] != nil){
_initialSetupCompleted = [[NSUserDefaults standardUserDefaults] boolForKey:kInitialSetupCompleted];
}
if([[NSUserDefaults standardUserDefaults] objectForKey:kDashboardMessage] != nil){
_dashboardMessage = [[NSUserDefaults standardUserDefaults] objectForKey:kDashboardMessage];
} else{
_dashboardMessage = [[NSBundle mainBundle] localizedStringForKey:kDMDefaultDashboardMessage value:kDMDefaultDashboardMessage table:nil];
}
//50 other if statements
}
return self;
}
执行此操作的更好方法是什么,这样我在进行 OCLint 分析时就不会收到这些警告?
谢谢!
所有实例变量初始化为0;这意味着 BOOL
被初始化为 NO
。因此效果为:
if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
}
... 是:如果有存储值,则将 _termsAccepted
设置为它。否则 _termsAccepted
将是 NO
.
boolForKey:
记录的 return 值为:
If a boolean value is associated with defaultName in the user defaults, that value is returned. Otherwise,
NO
is returned.
所以比较和对比只是:
_termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
... 在这种情况下,最终结果将是:如果存在存储值,则将 _termsAccepted
设置为它。否则 _termsAccepted
将是 NO
.
因此,为了降低圈复杂度,删除 if
语句。他们什么都不加。
编辑:有人正确地指出我错过了 BOOL
并非专门使用的事实。
使用 -[NSUserDefaults registerDefaults:]
建立您的后备值。这些一旦设置就保存在内存中,但不会写入商店。然后用户默认自己将处理所有类型对象的 "if no value stored, use this value" 情况。