编辑: 我不是阿L | 2014-03-18 |
11 尤达表达式 类似于 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 类型. nil 和 BOOL 检查 禅与 Objective-C 编程艺术
12 nil 和 BOOL 检查 在使用条件语句编程时,代码的左边距应该是一条 黄金 或者 快乐 的大道. 也就是说,不要嵌套 if 语句.使用多个 return 可以避免增加循环的复杂度,并提高代码的可读性.因为方法的重要部分没有嵌套在分支里面,并且你可以很清楚地找到相 关的代码. 推荐: - (void)someMethod { if (![someOther boolValue]) { return;
} //Do something important } 不推荐: - (void)someMethod { if ([someOther boolValue]) { //Do something important } } 黄金大道 禅与 Objective-C 编程艺术
13 黄金大道 当你有一个复杂的 if 子句的时候,你应该把它们提取出来赋给一个 BOOL 变量,这样可以让逻辑更清楚,而且让每个子句的 意义体现出来. BOOL nameContainsSwift = [sessionName containsString:@ Swift ];
BOOL isCurrentYear sessionDateCompontents year] == 2014;
BOOL isSwiftSession = nameContainsSwift &
&
isCurrentYear;
if (isSwiftSession) { // Do something very cool } 复杂的表达式 禅与 Objective-C 编程艺术
14 复杂的表达式 三元运算符 ? 应该只用在它能让代码更加清楚的地方. 一个条件语句的所有的变量应该是已经被求值了的.类似 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];
三元运算符 禅与 Objective-C 编程艺术
15 三元运算符 有些方法通通过参数返回 error 的引用,使用这样的方法时应当检查方法的返回值,而非 error 的引用. 推荐: NSError *error = nil;
if (![self trySomethingWithError:&
error]) ........