【问题标题】:How to reduce high cyclomatic complexity while initializing from NSUserDefaults如何在从 NSUserDefaults 初始化时降低高圈复杂度
【发布时间】:2016-03-16 17:59:03
【问题描述】:

我有一个对象的初始化器:

-(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 分析时就不会收到这些警告?

谢谢!

【问题讨论】:

    标签: objective-c optimization static-analysis lint oclint


    【解决方案1】:

    所有实例变量都初始化为0;这意味着BOOLs 被初始化为NO。因此效果如下:

    if([[NSUserDefaults standardUserDefaults] objectForKey:kTermsAccepted] != nil){
        _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
    }
    

    ... 是:如果有存储值,则将_termsAccepted 设置为它。否则_termsAccepted 将是NO

    boolForKey: 的记录返回值为:

    如果布尔值与用户中的 defaultName 相关联 默认值,该值被返回。否则,返回NO

    所以比较和对比一下:

    _termsAccepted = [[NSUserDefaults standardUserDefaults] boolForKey:kTermsAccepted];
    

    ... 在这种情况下,最终结果将是:如果有存储值,则将 _termsAccepted 设置为它。否则_termsAccepted 将是NO

    因此,为了降低圈复杂度,请删除 if 语句。他们什么也没添加。

    编辑:正确地指出我错过了BOOLs 并非专门使用的事实。

    使用-[NSUserDefaults registerDefaults:] 建立您的后备值。一旦设置,它们就会保存在内存中,但不会写入存储。然后用户默认自己将处理所有类型对象的“如果没有存储值,使用这个值”的情况。

    【讨论】:

    • 好的,也许我的问题不清楚。或者也许是。但是在它说“/50 其他 if 语句”的地方还有其他类型的变量,而不仅仅是 BOOL。我有 NSStrings、NSMutableArrays、NSDate 等。直接赋值是否适用于任何类型?
    • 我实际上添加了一种情况,我想用默认值初始化,以防 NSUserDefaults 不存在...
    • 我可能低估了这个问题。我的错。编辑后,尝试使用 -[NSUserDefaults registerDefaults:] 来设置 NSUserDefaults 在未找到值时应返回的值。它们从不覆盖实际存储的信息,并且它们本身也从不写入存储。这只是内存中的后备。
    • 很棒的汤米,非常感谢。如果一切正常(我认为应该这样做!),我会尝试一下,稍后再回来选择已接受。谢谢
    • 我支持使用registerDefaults: 的建议。我在这个答案中展示了一个例子:stackoverflow.com/a/4530149/277952
    猜你喜欢
    • 2020-06-13
    • 2020-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多