美文网首页iOS
尤达表达式

尤达表达式

作者: 维维_iOS | 来源:发表于2016-11-23 14:46 被阅读153次

    不要使用尤达表达式。尤达表达式是指,拿一个常量去和变量比较而不是拿变量去和常量比较。它就像是在表达 “蓝色是不是天空的颜色” 或者 “高个是不是这个男人的属性” 而不是 “天空是不是蓝的” 或者 “这个男人是不是高个子的”
    推荐:

    if ([myValue isEqual:@42]) { ...
    

    不推荐:

    if ([@42 isEqual:myValue]) { ...
    

    nil 和 BOOL 检查


    类似于 Yoda 表达式,nil 检查的方式也是存在争议的。一些 notous 库像这样检查对象是否为 nil:

    if (nil == myValue) { ...
    

    或许有人会提出这是错的,因为在 nil 作为一个常量的情况下,这样做就像 Yoda 表达式了。 但是一些程序员这么做的原因是为了避免调试的困难,看下面的代码:

    if (myValue == nil) { ...
    

    如果程序员敲错成这样:

    if (myValue = nil) { ...
    

    这是合法的语句,但是即使你是一个丰富经验的程序员,即使盯着眼睛瞧上好多遍也很难调试出错误。但是如果把 nil 放在左边,因为它不能被赋值,所以就不会发生这样的错误。 如果程序员这样做,他/她就可以轻松检查出可能的原因,比一遍遍检查敲下的代码要好很多。

    为了避免这些奇怪的问题,可以用感叹号来作为运算符。因为 nil 是 解释到 NO,所以没必要在条件语句里面把它和其他值比较。同时,不要直接把它和 YES 比较,因为 YES 的定义是 1, 而 BOOL 是 8 bit的,实际上是 char 类型。
    推荐:

    if (someObject) { ...
    if (![someObject boolValue]) { ...
    if (!someObject) { ...
    

    不推荐:

    if (someObject == YES) { ... // Wrong
    if (myRawValue == YES) { ... // Never do this.
    if ([someObject boolValue] == NO) { ...
    

    同时这样也能提高一致性,以及提升可读性。

    黄金大道


    在使用条件语句编程时,代码的左边距应该是一条“黄金”或者“快乐”的大道。 也就是说,不要嵌套 if 语句。使用多个 return 可以避免增加循环的复杂度,并提高代码的可读性。因为方法的重要部分没有嵌套在分支里面,并且你可以很清楚地找到相关的代码。
    推荐:

    - (void)someMethod {
      if (![someOther boolValue]) {
        return;
      }
    
      //Do something important
    }
    

    不推荐:

    - (void)someMethod {
      if ([someOther boolValue]) {
      //Do something important
      }
    }
    

    复杂的表达式


    当你有一个复杂的 if 子句的时候,你应该把它们提取出来赋给一个 BOOL 变量,这样可以让逻辑更清楚,而且让每个子句的意义体现出来。

    BOOL nameContainsSwift = [sessionName containsString:@"Swift"];
    BOOL isCurrentYear     = [sessionDateCompontents year] == 2014;
    BOOL isSwiftSession    = nameContainsSwift && isCurrentYear;
    
    if (isSwiftSession) {
        // Do something very cool
    }
    

    三元运算符


    三元运算符 ? 应该只用在它能让代码更加清楚的地方。 一个条件语句的所有的变量应该是已经被求值了的。类似 if 语句,计算多个条件子句通常会让语句更加难以理解。或者可以把它们重构到实例变量里面。
    推荐:

    result = a > b ? x : y;
    

    不推荐:

    result = a > b ? x = c > d ? c : d : y;
    

    当三元运算符的第二个参数(if 分支)返回和条件语句中已经检查的对象一样的对象的时候,下面的表达方式更灵巧:
    推荐:

    result = object ? : [self createObject];
    

    不推荐:

    result = object ? object : [self createObject];
    

    错误处理


    有些方法通过参数返回 error 的引用,使用这样的方法时应当检查方法的返回值,而非 error 的引用。
    推荐:

    NSError *error = nil;
    if (![self trySomethingWithError:&error]) {
        // Handle Error
    }
    

    此外,一些苹果的 API 在成功的情况下会对 error 参数(如果它非 NULL)写入垃圾值(garbage values),所以如果检查 error 的值可能导致错误 (甚至崩溃)。

    相关文章

      网友评论

        本文标题:尤达表达式

        本文链接:https://www.haomeiwen.com/subject/pihvpttx.html