[5](2)学习《禅与 Objective-C 编程艺术》

黄金大道

在使用条件语句编程时,代码的左边距应该是一条“黄金”或者“快乐”的大道。 也就是说,不要嵌套 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://github.com/objc-zen/objc-zen-book

作者

Luca Bernardi

  • (http://lucabernardi.com
  • @luka_bernardi
  • http://github.com/lukabernardi

Alberto De Bortoli

  • http://albertodebortoli.com
  • @albertodebo
  • http://github.com/albertodebortoli

关于中文翻译

译者

林翔宇

庞博

Kevin.Xiao

GitBook 排版

Yourtion

你可能感兴趣的:([5](2)学习《禅与 Objective-C 编程艺术》)