第一個公司的iOS項目總結
第一個正式的universal項目差不多快要結束,總結一下,分享給大家。因為可能我的比較具有代表性,如何從壓根不懂開始做起。(分享的另外一個目的也是希望大家提提建議,畢竟只有互相交流中才能更快成長)
-----------------------------------------------
做項目前:
零面向對象實際項目經驗,更不用說透徹理解design pattern
零iOS實際項目經驗
項目的情況:
做項目過程中,客戶需求變化極其頻繁和巨大,對代碼結構的robust是一大挑戰。雖然本人特別討厭需求變動,但是在外,身不由己
Universal項目,即是iPhone + iPad 的一個項目
基本上這個項目涉及到了iOS的方方面面,麻雀雖小,但是五臟俱全
關于程序結構設計
嘗試用面向對象的方式去設計結構,但設計的時候流于形式,根據現有的一些best practice依葫蘆畫瓢,但實際上只有實踐了才知道,比如:
1. 屬性: 什么時候用和為什么用屬性、如何保持屬性私有、self.的使用,屬性的內存釋放;
2. 成員變量和屬性的區別
3. 方法:什么時候用類方法和對象方法
4. 好的設計真的是“增之一分則太長,減之一分則太短”;好的設計關系到以后重構的方便性
5. 解耦設計:對象之間如何通訊,如何傳值,如何回傳,如何用好notification、delegate、KVO;如何保持對象的純潔(不受玷污)
6. MVC中的M和C分離,一直覺得自己做的項目是小項目,而且一直認為過于注重結構,會增加代碼量,但是實際上項目不分大小,好的設計:
能隨時應對客戶的需求變化
能自己看得懂自己寫的代碼(改的多了,都看不懂自己的代碼了,這是最悲催)
回歸測試,一旦客戶需求改變,亂糟糟的代碼更加亂,這樣回歸基本上是需要全部。好的設計可以把客戶需求改變帶來的回歸測試降低到最低
關于面向對象設計
之前從沒有面向對象設計的經驗,所以第一次從這種角度去解決問題。“實踐出真理”,無論你平時看多少書,如果沒有實踐過,真的是無法體會面向對象設計的:
一切從面向對象出發設計:類、對象、(私有)方法、(私有)屬性
所謂面向對象,就是根據現實世界中客觀存在的事物(即對象)出發來構造軟件系統
只有真正從面向對象去設計,幾個月甚至幾年后,你才能復盤你的代碼。以前一直覺得代碼復盤如同圍棋復盤絕對是天才才有的本領,現在才明白,其實關鍵是:你要清楚的知道你的代碼用在了哪里,為什么用
從面向對象出發,不要覺得一個功能很簡單一個方法就搞定,盡量用面向對象去考慮。這是做項目過程中犯的最大的錯誤
關于ARC
我是項目做了1個月后,才決定把項目從MRC轉到ARC,現在回頭看看,當初真實明智,因為在第一個月,內存管理上的問題和處理讓我很頭疼也很花時間。關于ARC
沒有想象中的會比MRC性能差,ARC不是JAVA的垃圾回收,性能其實與MRC基本一致
ARC中沒有明確的release操作,這時更需要注意內存管理,比如在一個Controller中使用Gyro sensor的時候,這種操作是絕對不能賦值給局部變量的:[[CMMotionManager alloc]init]
雖然ARC似乎能為你做很多事,但是有些事情自己解決還是自己解決,比如當不需要用Gyro sensor時,_motionManager = nil(此時如果不設置,則startDeviceMotionUpdatesToQueue中的更新會一直進行);
總之,對于ARC,難得糊涂中要“時刻保持覺醒”
關于Perfomrance設計
Coding真的是一點都來不得馬虎,以前一直覺得iOS性能強大,無須擔心性能,但是項目做下來,一大痛苦之處就是性能不夠:
應用程序、UIViewController和UIView的生命周期的認識如果不十分清楚,就很容易造成性能瓶頸
大量的UIView插入移除操作會導致性能問題
UITableView和UIScrollView導致滑動不順暢的best practice
關于知識點
成為一名優秀Programmer需要豐富的經驗和知識面,但是知識永遠是學習不完的,所以要抓核心和基本,個人覺得以下幾個知識點是iOS開發必須的。至于有些比如CoreText、CoreImage等,其實等到需要用時再去學習也來得及。
內存管理,MRC和ARC
多線程,iOS下有多種多線程實現方式,什么都應該了解一下,但是除了dispatch需要精通,其它只需要看懂 (dispatch效率最高,使用最方便)
UIViewController、UITableViewController 和應用程序的生命周期
看似簡單但是很有深度的View之間的轉場處理,因為涉及到大量生命周期,如presentModalViewController, presentViewController, pushViewController, addSubview, removeFromSuperview, self.view....
網絡處理相關的,如何請求JSON數據,如何HTTP GET和POST
旋轉處理,特別是iOS4、iOS5、iOS6的不同處理
Debug的能力
基本的設計模式:MVC、delegate、notification、target-action
面向對象的核心思想,例如:不要以用戶無法使用或不感興趣的東西擾亂類的公有接口、類之間應該零耦合、把不相關的信息放在另一個類中
不重復造輪子
這個也不例外,iOS下的開源framework都太多了,基本上你需要的都能在Github或者Stackoverflow上找得到,所以平時:
不要做井底之蛙,平時多了解開源的框架
框架適合就行,就像爭論AFNetwork和ASIHttpNetwork更棒沒有意義的。寫程序的有兩類人,一類人追求技術極致,一類人技術只是實現產品的一種手段,我就是后面這個
關于開源框架的學習
這世界好的開源框架太多了,給我10年都看不完,所以需要選擇,就像讀書不在于都多,而在于讀精,個人推薦如下。
Three20 (其實我是不推薦的,因為它過時了,但是因為淘寶客戶端用到)
AFNetwork
MBProgressHUD
SDWebImage
關于Continuous Improvement
Six sigma中提到了持續改進,我們的能力提高也是這樣。通過讀好的開源框架是最好的進步方式。如何讀開源框架,我們讀開源框架的目的:
其中的花式寫法我們只是了解,不是我們的目的
了解作者寫框架的思路
對比自己現有的,求改進
關于設計模式
做項目前,把GOF的23種設計模式都看了一遍,項目做下了,體會到:
單看設計模式的書,純粹是無用;
設計模式的核心在于平時的有意無意的使用,因為它本身來源于實際;
能熟背23種設計模式固然是件好事,但是不能也不見得是壞事(反正我是記不住的)
欲速則不達
代碼之間往往只查一兩個字符,但性能和結局多半千差萬別,因為項目緊,壓力大,又是第一個項目,所以寫代碼的時候,追求:"meet requirement,先滿足功能,再考慮代碼結構",但是實際:
需求無論大小,代碼結構設計是必須的而且是第一位的,因為這關系到未來的改動,未來自己能否看懂;
欲速則不達,真是一個真理
關于Best Practice的重要
iOS已經很成熟了,基本上,所有問題都能找到答案,所有的需求都有現成的framework,或者只需要稍許改改。但是也正因為“萬能的internet”,所以很多答案或者很多framework都是有問題的,所以適時總結很重要:
把常用的代碼或者容易錯的代碼寫到Xcode的snippet中
要有自己的library,不是自己擺酷,而是知識需要積累,有些開發中經常會遇到的
用好的framework。不流行的框架要注意是否用了私有方法(蘋果 will reject it)
best practice,比如如何自定義TableCell,如何自定義Navigation bar
不玩花的,不玩偏門的,寫代碼就是規規矩矩,一切按照蘋果的best practice寫
面向對象的思想有很多概要,平時要時刻提醒自己
關于HTML5
iOS原生與HTML5 WEB APP天生就是一對敵人,做HTML5的可以不懂iOS開發,但是做iOS開發必須懂點HTML5:
iOS應用中一些“高度變化”或“性能要求不高”或“上線緊迫”的地方會用到UIWebView
iOS原生與UIWebView的之間交互其實也可以很棒,甚至JSP交互
HTML5是“可能”的未來,世界都在談論
HTML5看似只有一個知識點,但是其實要求比iOS原生開都高:一個典型的移動HTML5頁面 = JSP + HTML + CSS + JQuery + backbone.js?;蛘邔W習PhoneGap也是不錯的注意。
關于未來:
如何讓自己在最短的時間內成為優秀,這是每天都在思考的,因為對比別人_大學+工作下來的多年工作經驗,我是不懼任何優勢的,但是既然入行,就必須做優秀。所以選擇值得做的事尤其重要:
看書沒用,實踐和Coding是提高能力的唯一途徑;
做實際項目比自己玩玩靠譜十萬倍
壓力下工作成長更快,所以不斷挑戰自己,人的潛力是無限的
番茄工作法則比較適合我(每次集中做半個小時)
posted on 2014-08-12 09:33 順其自然EVO 閱讀(2935) 評論(1) 編輯 收藏 所屬分類: 測試學習專欄