【问题标题】:Using a BOOL to replace verbose code使用 BOOL 替换冗长的代码
【发布时间】:2015-12-26 09:56:00
【问题描述】:

我有一行可怕的代码,它是一个巨大的 PITA,可以反复输入和阅读。我试图用我班级中一个漂亮、整洁的 BOOL 属性和相应的方法来替换它,但它是“flakey”(而且它不会崩溃)。我想用更整洁的东西来代替这个可怕的怪物。这是我到目前为止所做的。

这是可行的...

    if (self.stretchSideMultiplierCount < [[[NSUserDefaults standardUserDefaults]valueForKey:@"stretchMultiplier"]integerValue] * self.currentStretch.sideMultiplier.integerValue) {
        // blah blah blah
    }

...但它看起来很可怕,所以我试图通过在实现中创建一个 BOOL 属性来摆脱它:

@property (nonatomic, assign) BOOL lastRoundOfCurrentStretch;

...以及下面的方法...

- (BOOL) lastRoundOfCurrentStretch {
    if (self.currentStretch.sideMultiplier.intValue * [[[NSUserDefaults standardUserDefaults]valueForKey:@"defaultStretchRepetition"]intValue] == self.stretchSideMultiplierCount) {
        NSLog(@"** LAST ROUND **");
        return YES;
    } else {
        return NO;
    }
}

完成后,我希望能够使用此 BOOL 作为在查询顶部键入可怕的代码行的替代方法。

if (self.lastRoundOfCurrentStretch == NO) {
    // blah blah blah
}

在我进行更改后,该课程并没有像“过去”那样工作,但它并没有崩溃。我敢肯定这归结为我这方面令人吃惊的愚蠢的用户错误,但我很快就会在这里找到答案。这与我得到的答案一样接近,适用于我正在尝试做的事情。

Using a BOOL property

【问题讨论】:

  • 如果您要删除难以阅读的内容,首先尝试在每一行上只执行一个操作。取值、乘法和比较 = 三个操作。使用变量将长行拆分为较小的操作。另外,永远不要与NO比较,使用逻辑运算(if (!self.lastRoundOfCurrentStretch) {)。

标签: ios objective-c if-statement boolean


【解决方案1】:

在第一行代码中您使用的是&lt;,而在更新后的代码中您使用的是==,我怀疑这会导致不良行为?

【讨论】:

    【解决方案2】:

    您在属性的 getter 中使用 '==' 而不是 '

    【讨论】:

      【解决方案3】:

      你的原始代码可以改写为

      NSInteger stretchMultiplier = [[[NSUserDefaults standardUserDefaults]valueForKey:@"stretchMultiplier"]integerValue];
      NSInteger sideMultiplier = self.currentStretch.sideMultiplier.integerValue;
      if (self.stretchSideMultiplierCount < stretchMultiplier * sideMultiplier) {
        // blah blah blah
      }
      

      您的属性 getter 可以重写为:

      - (BOOL) lastRoundOfCurrentStretch {
          NSInteger defaultStretchRepetition = [[[NSUserDefaults standardUserDefaults]valueForKey:@"defaultStretchRepetition"]integerValue];
          NSInteger sideMultiplier = self.currentStretch.sideMultiplier.integerValue;
      
          return (defaultStretchRepetition * sideMultiplier == self.stretchSideMultiplierCount);
      }
      

      你现在能看出区别了吗?您正在加载与用户默认值不同的变量。一旦您使代码更具可读性,这一点就很明显了。

      【讨论】:

      • 非常感谢!这对我来说澄清了很多事情。一个细节问题。这是在实现中声明属性的正确方法吗? @property (nonatomic, assign) BOOL lastRoundOfCurrentStretch;
      • @AdrianB 你可以在类延续中声明它,但是在实现中声明它甚至根本不将它声明为属性都没有问题。你不需要一个属性,你只需要方法。
      • 对我来说,这是我在 StackOverflow 上得到的最棒的答案。然而,对你来说,这可能是你回答过的最愚蠢的问题。我将基于此重构一堆东西。再次感谢您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-07
      • 2011-12-26
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多