做iOS開發, 難免會接手別人碰過的程式碼, 之前做過一些外包專案, 是別人已經完成了前期的功能, 然後到我這裡就需要接著之前的任務繼續開發, 相信很多在上班的朋友也一樣, 總是會接著寫別人的程式碼, 然後每次, 我相信你肯定會和我一樣, 看著看著, 心中一萬條草泥馬
~~~飄過, 然後不得不默默的填坑. 當然你寫的程式碼同樣的以後可能會被其他人看到, 所以我每次看到以下幾種類似的程式碼, 必定會痛罵一番, 如果你希望你寫的程式碼以後少被人罵, 至少不要寫出下面的程式碼吧… 前方高能~~~
- 專案中到處引用第三方庫– 比如 AFN
我們在專案中, 肯定不可避免的會使用到第三方庫. 第三方的開源貢獻者為我們做了很多的工作了, 感謝他們吧. 但是使用第三方庫帶來的另外一點小的隱患就是, 可能隨著專案的開發我們會遇到更換第三方庫的需求, 那麼如果你之前整個專案到處都依賴(引入第三方庫)第三方庫的話, 對於更換第三方庫的代價就是巨大的.
最常見的是專案中的網路請求使用AFN來完成, 你說使用這個第三方庫來完成網路請求肯定是比較正確的選擇吧, 但是…… 網路請求基本上就傳送,GET,POST請求
,下載檔案, 上傳檔案
這麼四個常見的需求, 你使用AFN難道就不能自己封裝幾個介面出來, 然後專案中的網路請求都使用自己封裝的這幾個介面, 以後在更換網路請求庫的時候直接更改這幾個介面不就好了, 而不需要再所有專案中用到網路請求的地方都挨著挨著改一遍(基本是沒辦法改的, 不是到現在為止很多專案還使用著ASIHTTPRequest麼),我見過整個專案使用swift來開發的, 然後網路請求庫使用的是AFN, 專案中所有的網路請求都是直接使用AFN的介面來完成的, 結果後來專案決定需要更換為Alamofire, 然後… 你懂的
@interface ZJHttpTool : NSObject
/**
* 傳送一個GET請求
*
* @param url 請求路徑
* @param params 請求引數
* @param success 請求成功後的回撥(請將請求成功後想做的事情寫到這個block中)
* @param failure 請求失敗後的回撥(請將請求失敗後想做的事情寫到這個block中)
*/
+ (void)get:(NSString *)url params:(NSDictionary *)params success:(void (^)(id responseObj))success failure:(void (^)(NSError *error))failure;
+ (void)post:(NSString *)url params:(NSDictionary *)params success:(void (^)(id responseObj))success failure:(void (^)(NSError *error))failure;
...
@end複製程式碼
- 命名規範
聽說過OC中類命名要加字首嗎?
嗯隨手一寫, 習慣了自己每個專案中都定義一個全域性的常量檔案 命名為constant.h
吧… 能不能加個類字首, 雖然這種對專案中整體的影響不大(衝突了會報錯, 你總會修改了吧), 但是這種不符合規則的類命名真的讓人很不爽
聽說過變數名使用英文變數命名嗎?
你說這個計算機的世界是英語的世界都是事實, 大家都提倡變數命名使用英文來命名. 所以那些使用拼音來命名的愛國者是怎麼想的, 見過一大堆的youxiangzhanghao, banjibianhao, xingmin, xingbie ...
, 你說這些常見的名詞的英文你寫個拼音真是讓人無法直視啊, 只能讓我開罵—一定是個英語弱爆了的傻X寫的程式碼…
好吧還有一種人是這樣的, 真是嚴格遵守命名規範, 於是專案中的變數名都使用英文的, 不過啊不過啊, 對於我這種六級飄過的學渣而言, 看你們這些大神高階的命名全靠詞典啊, (電腦常備有道沒有錯)
anticoagulant (抗凝劑), tranquilizer(鎮定劑)... 總之一堆一堆的藥名和專業名詞
這些東西簡直不能忍啊, 看程式碼就是查字典去了, 這裡我希望用拼音, 哪怕別人罵我是用拼音的傻逼… - 程式碼量多到難以閱讀的class檔案
這個真的是遇到的非常非常多的了, 一個controller開啟, 見過最多的接近4000行, 我的天, 這讓人怎麼活, 最坑爹的是, 橫下心去看看—- 一個viewDidLoad裡面2000多行程式碼…… 只看到大括號開頭啊
還有人專案中將使用到的常量放在一個檔案中來管理是個好習慣, 但是, 你這一個檔案中放了幾千個常量… 真的是欲哭無淚啊… - 到處都是通知
iOS開發中, 通知真的很好用啊, 跨介面傳值, 同時可以傳值給多個物件. 但是, 也不帶這樣來使用的啊, 所有的頁面反向傳值, 感覺通知最方便了, 一個post就釋出一條通知, 然後專案中到處註冊通知來監聽, 不知道這些人是怎麼做到的正確的移除通知監聽者… 更無語的是, 釋出的通知的命名那都是隨手一寫… 通知雖然好用, 但要注意使用的場所啊 - 到處都是神奇數字
專案中見過到處都是的, 最常見的是在設定frame的時候, 也許正如註釋的那樣, 所有的數字都是這位開發者, 寫程式碼的時候感覺這些數字比較合理// 高度為44看上去更合適 self.searchBar.frame = CGRectMake(0, 22, 320, 44);複製程式碼
- 到處都是代理
上面剛說了有人到處使用通知的, 這裡也有人到處使用代理的, 凡是需要反向傳值或者響應某些操作的, 通通先寫一個協議, 然後實現一個代理, 我有見過一個標頭檔案上面遵守十多個協議的, 然後這些協議裡面基本上只有一個代理方法, 還有一種更可惡的是, 一個協議包含很多很多的代理方法, 全部標記為optional …, 然後在需要的地方直接呼叫
像這種, 在controller中遵守了許多個協議, 很多方法都不知道是那些協議裡面的, 至少你也要加個註釋什麼的吧 ...
- (void)saveBtnDidTouched {
// 代理一...
}
- (void)sexDidChanged {
//代理二...
}
- (void)downloadDidFinished {
//代理三...
}複製程式碼
- 隨便引用第三方庫– 然後自己修改其中的一些地方, 這個時候你還敢不敢pod update
- 關於跨頁面傳值
見過有人的專案中所有的跨頁面反向傳值, 全部使用單例來傳遞, 然後許多個地方都在修改和獲取這個單例物件的同樣的屬性, 當你接手這樣程式碼的時候, 哭吧… 你根本不知道這個值在那些地方會被修改. 另外有一種噁心的傳值, 這種人也是無語了, 需要的跨頁面傳值統統寫入本地檔案中, 然後在其他頁面直接讀取檔案中的值… 天才啊 - 一個class實現很多個頁面的功能
有些人程式碼複用的觀念真的是太強了, 不想多寫一點程式碼, 於是, 一個自定義的UITableViewCell裡面各種判斷, 來實現很多的控制元件的隱藏和位置調整… 明明看上去不是很像的各種cell, 硬是被他放到了同一個cell檔案裡面來管理… - 盡全力使用黑魔法到處+load
這種人, 不知道是為了顯示自己多有學問還是什麼, 專案中一有機會, 直接寫個系統類的擴充套件, 然後重寫+load方法, 繼續高能, 使用黑魔法交換系統的方法… 當你發現自己明明是繼承自系統的控制元件來寫的程式碼, 為什麼為什麼, 效果很是古怪, 然後你就開始懷疑人生了. 我曾經在一個專案中使用UINavigationController的時候, 因為自定義了返回按鈕, 然後側滑手勢失效了, 於是像以前那樣解決, 更改手勢的代理(具體方法百度吧),發現不管怎樣都不會向以前那樣有效, 最終很長時間的檢查才發現, 在以前的某個檔案中有人使用runtime更改了手勢的代理, 用於實現全屏滑動返回的效果…
本來是用來吐槽最近見到的奇葩程式碼的, 不過寫著寫著就不想繼續吐槽了, 反正最終還是要繼續填坑, 不過, 希望你不會再寫出這麼詭異的程式碼出來了, 因為—–真的是會被罵的