[Objective-C]編程藝術 筆記整理

看了《禪與 Objective-C 編程藝術》,發現不少平時不注意的或注意但沒有系統總結的東西,特此記錄一下。

這次沒有整理完,后續更新會結合手里的一些其他資料整理。

新博客wossoneri.com傳送門

完整的介紹看這兩個鏈接
Google開源項目風格指南
禪與 Objective-C 編程藝術 (Zen and the Art of the Objective-C Craftsmanship 中文翻譯)

本文的意義就是找出一些我自己平時不注意的知識點進行總結,同時提出一些自己的觀點,然后自己沒事看看總結,提高編碼質量。

條件語句

條件語句體應該總是被大括號包圍。

我經常為了讓代碼看起來干凈一些,所以對于條件語句體內只有一行代碼的時候,我就會省去大括號以減少代碼行數。
像這樣:

if (!error)return success;
//or    
if (!error) return success;

這樣寫很容易帶來隱患,比如增加一行代碼時,就容易對這行代碼是在語句體內還是外產生誤解導致錯誤。注釋一行代碼容易使后面一行代碼成為語句體內的內容。

所以老老實實把代碼寫規范了:

if (!error) {return success;
}

尤達表達式

星球大戰中尤達大師的講話方式,總是用倒裝的語序

文章不建議使用尤達表達式,即不要使用常量和變量比較的方式。

比如:

if (5 == count) { ...
//or
if ([@42 isEqual:myValue]) { ...

建議寫成:

if (count == 5) { ...
//or
if ([myValue isEqual:@42]) { ...

對于這一點,我有一些異議。因為對于第一種寫法,寫成5 == count可以避免把==寫成=,如果按照不用尤達的寫法,當我把比較寫成賦值時count = 5,編譯器是無法檢測出我的失誤的,而且對于這類失誤,自己debug的時候也很難發現。而對于第二種寫法使用isEqual方法就不存在這種問題。

所以這一點見仁見智吧。面對if (5 == count)這類條件語句,我還是偏向用尤達表達式的。

nil 和 BOOL 的檢查

因為 nil 是 解釋到 NO,所以沒必要在條件語句里面把它和其他值比較。同時,不要直接把它和 YES 比較,因為 YES 的定義是 1, 而 BOOL 是 8 bit的,實際上是 char 類型。

這一點很重要,不要在條件語句內出現YES或者NO,多使用非運算符。

不推薦:

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

推薦:

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

黃金大道

在使用條件語句編程時,代碼的左邊距應該是一條“黃金”或者“快樂”的大道。

也就是說,不要嵌套 if 語句。使用多個 return 可以避免增加循環的復雜度,并提高代碼的可讀性。

這一點我深有感觸,在以往編碼的時候,我都很耿直的把一些方法寫到嵌套分支里。這樣寫的容易,但改代碼邏輯的時候就麻煩了。

比如:

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

這種情況下,一個是代碼看起來很復雜,另一個是改邏輯的時候,blablabla的內容都要拷貝出來,放在新修改的邏輯中去。

所以直到有一次思考優化代碼的時候,我才想起來用相反的邏輯去處理它,即使用 return。比如:

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

把邏輯判斷單獨擇出來,處理代碼就直接放在函數里。不符合邏輯的 return 掉,符合邏輯的直接就會運行到處理代碼處。而且這樣寫代碼層次很清晰。

Case 語句

除非編譯器強制要求,括號在 case 語句里面是不必要的。但是當一個 case 包含了多行語句的時候,需要加上括號。

個人經驗,好像在 case 中創建實例的時候,編譯器會提醒你要為這個 case 加上括號。

switch (condition) {case 1:// ...break;case 2: {// ...// Multi-line example using bracesbreak;}case 3:// ...break;default:// ...break;
}

常量使用、枚舉和命名規范

見這篇博客:Objective-C 常量和枚舉

方法

方法名與方法類型 (-/+ 符號)之間應該以空格間隔。方法段之間也應該以空格間隔(以符合 Apple 風格)。參數前應該總是有一個描述性的關鍵詞。

這里要注意的一點是盡量少用 and 這個詞。我因為入門的時候看的書經常用 and ,感覺這樣閱讀起來比較連貫,所以也養成了寫 and 的習慣。后來感覺加 and 的確不是很好。關于看書命名這一塊推薦看一下 Swift 的函數命名,因為 Swift 設計的時候一部分考慮到了 OC 當前的設計思想,同時對舊設計思想有了一些優化。看完你就會有自己的一套理解了。

不推薦寫法:

- (void)setT:(NSString *)text i:(UIImage *)image;
- (void)sendAction:(SEL)aSelector :(id)anObject :(BOOL)flag;
- (id)taggedView:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width andHeight:(CGFloat)height;
- (instancetype)initWith:(int)width and:(int)height;  // Never do this.

推薦寫法:

- (void)setExampleText:(NSString *)text image:(UIImage *)image;
- (void)sendAction:(SEL)aSelector to:(id)anObject forAllCells:(BOOL)flag;
- (id)viewWithTag:(NSInteger)tag;
- (instancetype)initWithWidth:(CGFloat)width height:(CGFloat)height;

美化代碼

空格

  • 縮進使用 4 個空格。 永遠不要使用 tab。可以在 Xcode 中設置按 tab 插入 4 個空格。
  • 方法的大括號和其他的大括號(if/else/switch/while 等) 總是在同一行開始,在新起一行結束。

第一點就不說了,前段時間看文章說還有人用 3 個空格,8 個空格的。個人還是覺得 4 空格比較舒服。

第二點是要注意的,可能以前看的初級書都是這樣寫:

if (user.isHappy)
{//Do something
} else {//Do something else
}

但分開寫的話代碼層次關系會更明顯:

if (user.isHappy) {//Do something
}
else {//Do something else
}
  • 方法之間應該要有一個空行來幫助代碼看起來清晰且有組織。 方法內的空格應該用來分離功能,但是通常不同的功能應該用新的方法來定義。
  • 優先使用 auto-synthesis。但是如果必要的話, @synthesize and @dynamic
  • 在實現文件中的聲明應該新起一行。
  • 應該總是讓冒號對齊。有一些方法簽名可能超過三個冒號,用冒號對齊可以讓代碼更具有可讀性。即使有代碼塊存在,也應該用冒號對齊方法。

這幾點 Xcode 會幫你做一部分,比如說冒號對齊在 Xcode 里就是自動的。但還是注意一下吧。

不推薦:

[UIView animateWithDuration:1.0 animations:^{// something
} completion:^(BOOL finished) {// something
}];

推薦:

[UIView animateWithDuration:1.0animations:^{// something}completion:^(BOOL finished) {// something}];

換行

之前看過一個建議,就是一行代碼保持在 80 個字符。
后來在不同的 IDE 下編碼,發現不同的 IDE 在這一點上是一致的,就是可以設置一個字符長度的標志線,來提示代碼長度。默認長度都是在 80 個字符。這個 Xcode 好像是默認不開啟的,可以設置一下讓那條線顯示出來。

舉例:

self.productsRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:productIdentifiers];

一個像上面的長行的代碼在第二行以一個間隔(2個空格)延續

self.productsRequest = [[SKProductsRequest alloc]initWithProductIdentifiers:productIdentifiers];

括號

在以下的地方使用 Egyptian風格 括號 (譯者注:又稱 K&R 風格,代碼段括號的開始位于一行的末尾,而不是另外起一行的風格。關于為什么叫做 Egyptian Brackets,可以參考 http://blog.codinghorror.com/new-programming-jargon/ )

  • 控制語句 (if-else, for, switch)

非 Egyptian 括號可以用在:

  • 類的實現(如果存在)
  • 方法的實現

看完就不要糾結 Java 風格 or C++ 風格了...

未完...
很多內容在整理...

轉載于:https://www.cnblogs.com/rossoneri/p/5624806.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/457697.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/457697.shtml
英文地址,請注明出處:http://en.pswp.cn/news/457697.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python大數據工程師 培訓_大數據工程師學習之路

大數據的作用:發現過去事件的特征預測未來最優化選擇職位劃分:數據產品經理數據分析師->商業敏感性,產品經理的助手數據研發工程師數據挖掘工程師/數據科學家需要準備的技術知識:Linux操作系統與網絡編程:進程/線程…

python序列

python序列 列表 python變量不存放值,之存放值的引用,所以列表中元素可以是不同類型 1.常用方法 1.1 增加元素 append,在末尾插入元素 extend,將一個列表整體插入到尾部 insert,將某個元素插入到特定位 /*,拼合…

前端資源(11)

移動端API 地址99移動端知識集合 https://github.com/jtyjty99999/mobileTech移動端前端開發知識庫 https://github.com/AlloyTeam/Mars移動前端的一些坑和解決方法(外觀表現) http://caibaojian.com/mobile-web-bug.html【原】移動web資源整理 http://w…

win10使用Composer-Setup安裝Composer以及使用Composer安裝Yii2最新版

1:下載 ca-bundle.crt和cacert.pem(見導航欄——文件) 將這兩個文件放在php目錄下 2:php.ini中添加上述兩個文件的路徑 curl.cainfoC:/xampp/php/ca-bundle.crtopenssl.cafileC:/xampp/php/ca-bundle.crt 寫到最后一行就可以 3:下載Composer-Setup.exe h…

python離群點檢測方法分幾類_數據分析 第五篇:離群點檢測

離群點(outlier)是指和其他觀測點偏離非常大的數據點,離群點是異常的數據點,但是不一定是錯誤的數據點。確定離群點對于數據分析會帶來不利的影響,比如,增大錯誤方差、影響預測和影響正態性。從散點圖上可以直觀地看到離群點&…

計算機網絡TCP/IP

TCP/IP原理 看《圖解TCP/IP》時做的筆記,記錄一些感覺重要的東西…還沒完,正在學,慢慢寫 1.計算機網絡的發展 2.OSI參考模型 3.傳輸方式分類 4.地址及網絡的構成 5.TCP/IP協議的出現 6.TCP/IP分層模型及通信示例 7.數據鏈路層1 8.數…

hive求差集和交集

2019獨角獸企業重金招聘Python工程師標準>>> 用的要求總數和統計數: 總數的概念是利用安卓ID,就以為這把兩個月前的安卓ID統統的統計一遍,如果沒有出現,恰好在今天出現了,那么當前的這個用戶就是新增的…

python靜態方法可以被繼承嗎_python 類的繼承 實例方法.靜態方法.類方法的代碼解析...

這篇文章主要介紹了python 類的繼承 實例方法.靜態方法.類方法的代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下dt{}class Denglu:def register(self,name,psd):if name.isalnum() and psd.isalnum():i…

漸變色--瀏覽器兼容性

說明&#xff1a; 1.360兼容模式效果不好 2.可以直接用不同瀏覽器打開這個頁面查看效果 <!DOCTYPE html><html><head lang"en"> <meta charset"UTF-8"> <title></title> <style> body{ …

如何學習前端 轉載

作者&#xff1a;小不了鏈接&#xff1a;https://zhuanlan.zhihu.com/p/23265155來源&#xff1a;知乎著作權歸作者所有。商業轉載請聯系作者獲得授權&#xff0c;非商業轉載請注明出處。 鑒于時不時&#xff0c;有同學私信問我&#xff08;老姚&#xff0c;下同&#xff09;怎…

tcp前4字節消息長度_網絡基礎篇之TCP

?網絡分層什么是 TCP TCP 是面向連接的、可靠的、基于字節流的傳輸層通信協議。- 面向連接&#xff1a;通過三次握手建立一對一的連接&#xff08; UDP 協議 可以一個主機同時向多個主機發送消息&#xff0c;即一對多&#xff09;&#xff1b;- 可靠的&#xff1a;通過序號、校…

使用Servlet實現用戶注冊

1、用戶注冊頁面代碼 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&q…

年輕人的第一篇V語言筆記

V語言極限學習 我聽說V語言看文檔半小時就能完全掌握&#xff1f;&#xff1f;&#xff1f;&#xff1f;以我的智商一小時掌握不了我就給各位科普一下廣告法&#xff1f;&#xff1f;&#xff1f; 宇宙慣例hello world // first v code fn main(){printIn("hello world…

android studio運行手機時出錯怎么解決_小程序 android ios h5解決方案

你現在開發android,ios,小程序用什么工具&#xff0c;怎么開發的&#xff1f;還在單個端的開發嗎&#xff1f;今天我們主要討論的是一次開發多端使用的技術&#xff0c;也是這兩年比較流行的開發方向。現在的終端太多了&#xff0c;app兩個端android和ios,小程序有微信&#xf…

Android SDK上手指南:應用程序數據

版權聲明&#xff1a;本文為博主原創文章&#xff0c;轉載請標明出處。 https://blog.csdn.net/chaoyu168/article/details/52996965 在本系列教程當中&#xff0c;我們將學習如何從零開始進行Android SDK開發。我們已經熟悉了Android應用程序的結構與基本組成元素&#xff0c;…

設計微服務架構需要解決的問題

問題&#xff1a; 劃分服務的原則是什么服務之間選擇何種輕量級的通信協議如何做到服務的獨立部署如何確定使用何種編程語言?控制多語言帶來的復雜度如何做到服務的去中心化如何解決大量微服務引入的運維成本轉載于:https://www.cnblogs.com/fight-tao/p/5641286.html

Django Model設計詳解

Django Model 設計 Django Model設計是Django五項基礎核心設計之一&#xff08;Model設計&#xff0c;URL配置&#xff0c;View編寫&#xff0c;Template設計&#xff0c;From使用&#xff09;&#xff0c;也是MVC模式中重要的環節。 如果圖片無法訪問&#xff0c;大家可以移…

python設置全局變量失敗_Python全局變量與global關鍵字常見錯誤解決方案

在Python的變量使用中&#xff0c;經常會遇到這樣的錯誤:local variable a referenced before assignment它的意思是&#xff1a;局部變量“a”在賦值前就被引用了。比如運行下面的代碼就會出現這樣的問題&#xff1a;a 3def Fuc():print (a)a a 1Fuc()? 但是如果把 a a …

Atititi tesseract使用總結

Atititi tesseract使用總結 消除bug&#xff0c;優化&#xff0c;重新發布。當前版本為3.02 項目下載地址為&#xff1a;http://code.google.com/p/tesseract-ocr。 Windows cmd命令行使用Tesseract-OCR引擎識別驗證碼: 1、下載安裝Tesseract-OCR引擎(3.0版本才支持中文識別) t…

Javascipt數組去重的幾種方式

方法一 function unique(arr) {var retArr [];for (var i 0; i < arr.length; i) {(retArr.indexOf(arr[i]) -1) && retArr.push(arr[i]);}return retArr; } 方法二 function unique(arr) {return arr.filter(function(item, index, array) {return array.indexO…