相關閱讀 |
>>> 技術話題—商業文明的嶄新時代 >>> | 簡體 傳統 |
英文原文:Why Objective-C Is Hard To Learn
作為一個網絡上的活躍分子,使用 Objective-C 的開發者,我收到了許多圍繞 Objective-C 的提問。這些問題在人們學習 Objective-C 或者嘗試開發 app 的時候會不斷跳出來,而且其中的某些問題可能籠統如“Objective-C 看起來太難了”也會細致若“那個‘-’是干嘛用的啊?”。我要說的是這些其實都是好問題,那么接下來我就和大家探討一下:相對于 Ruby 或 Java,為什么某些程序員對轉投 iOS 或者 OS X 開發會心存畏懼。
語法
先說說編程語言是什么。所謂編程語言就是一種人可以讀得懂的程序代碼。一門編程語言通常包含一系列內容:語法(語句書寫和聲明的規則)和語義(以達成某些任務為目標,把語句和聲明有效的結合起來)。
大部分(通常情況下)編程語言在方法調用上都是類似C語言的風格,訪問類成員采用.語法。(也就是C中的 structs)。雖然這些語言一般都有各自己定義類的方式(Java 和 C# 或 C++ 還是不大相同的),但是追究到語言的諸多細節還都是很相似的。每當人們開始接觸一門新的編程語言的時候,如果它的語法看起來很似曾相識,會讓學習者覺得很舒服。像大多數人都是有C語法背景的,所以要學習一門類C語法的語言的話,第一觀感會很親切。
單從語法角度來看,Objective-C 可謂**別具一格**。它的語法太特別了,礙于它語法的另類,很多人沒有耐心去深究它的語義,而它的語義恰恰與C++,Java 等語言沒什么區別。
像 Python 和 Ruby 這些所謂”古怪”的語言都更容易上手,僅僅是因為它們可以通過.語法來進行方法調用和訪問類成員。而且人們通常能夠迅速習慣用縮進來代替花括號。
當我向別人介紹 Objective-C 的時候,一般情況下,我會拿它和某個 OOP(面向對象編程)語言來對比說明。
目前來看還 OK。也許他們之前知道 lisp 吧,所以不難理解這句語法。
到這句,人們普遍覺得比較難接受,情況也變得不那么樂觀了。
這句可以直接讓人們崩潰了。
那些冒號是啥?太嚇人了!隨后冒出一堆問題:方法是怎么調用的?是通過 performAction 還是什么別的方式?方法怎么重載?
要知道,我們沒有在討論方法,我們說的是消息(messages)(我也不會去討論他們之間的區別)和 selectors,好比上文所呈現的 performAction:withTwoParameters。但是,大家已經懶得去了解了。
Objective-C 是C的超集,它其實是一門很 cool 的編程語言,但是由于其自身的某些特點,相較于其他現代編程語言,人們會覺得 Objective-C 很古老。作為C的超集,Objectivec-C 在C的基礎上擴展了一系列非常規的特性,這恰恰增加了 Objective-C 的復雜度。
Objective-C 是一門大型語言。下此定義的出發點是:它的語法十分繁復。實際上,蘋果已經在加大對 Objective-C 瘦身的力度,比如說,雖然速度緩慢但是終究還是完成了頭文件去標準C風格的過渡。而且,蘋果還為 Objective-C 做了不少改進,增加了許多新特性,使得 Objective-C 的代碼更加簡練,比如:
所以,雖然語言變得越來越龐大,但是開發編寫代碼的復雜度反而降低了。
Runtime
Objective-C 是動態運行的,可能單單從其與C的淵源這個角度來看這個特性并不那么直觀。由于不需要直接編寫匯編碼,C語言自身是一門變化較低的語言,鑒于 Objective-C 是C的超集,我們很容易將 Objective-C 的穩定性趨向于C,但現實際上,Objective-C 是動態運行的且靈活性相當高的語言。Objective-C 支持函數柯里化(function currying),支持反射機制,可以在運行時動態地為類添加或移除方法。
除非你之前有接觸過類似 Objectivec-C 這些特性的編程語言,比如說 Ruby 或 Lisp,否則一時間很難適應 Objective-C。但是無需担憂!有些東西,外表看起來神秘可怕其實本質沒那么復雜。
Framework
使用 Objective-C 構建 apps 完全離不開 Cocoa/Cocoa Touch 框架。就好像用 Ruby 開發 web 應用離不開 Rails 一樣。
經過經年累月的發展,Cocoa 已經變得非常的厚重。不過如前文所說,蘋果最近正在逐漸的為常規 iOS 開發所依賴的 Cocoa Touch 框架進行減肥,以降低它的復雜度。即便如此,哪怕要開發的 app 極其簡單,也還是有許多東西要學,像蘋果的官方文檔還有已暴露的各種頭文件都是很好的學習資源。就拿 UIView 中的 contentStretch 屬性為例,頭文件的定義和說明如下:
@property (nonatomic) CGRect contentStretch
__OSX_AVAILABLE_STARTING (__MAC_NA,__IPHONE_3_0);
// animatable. default is unit rectangle {{0,0} {1,1}}
這到底是什么意思呢?按照我的理解,這個屬性是用來描述可伸縮區域的大小。但是怎么實現的呢?這個區域是指一個矩形嗎?也許你永遠都不會和這個屬性打交道,但是假如在開發過程中的某個時點和場景下使用這個屬性能夠輕松解決你的問題,那個時候你會知道它的存在并能正確的使用它嗎?
Cocoa/Cocoa-Touch 是龐大的框架。要真正的駕馭它就只能靠熟能生巧了。但這個熟悉它的過程常常使很多新的學習者退縮。
History
一直以來,蘋果都在不停的推動著圍繞 Objective-C 語言開發體系的進步,像 Objective-C runtime,Cocoa/Cocoa Touch 框架以及針對 Objective-C 的編譯器等一系列更高層面設計的交叉重疊使得 Objective-C 不僅僅是一個語言這么簡單。
所以當學習 Objective-C 的時候,不能孤立的去學習這門語言、某些框架、它的運行機制或編譯器,而是要把他們融會貫通。比如說現在 Objective-C 集成的 ARC (Automatic Reference Counting)機制就涉及到了語義(不需要顯示調用 dealloc 了)層面、編譯器層面(顯而易見)、以及對 Cocoa/Cocoa Touch 框架的命名約定等內容。
上文所提到的圍繞 Objective-C 的一些列緊密關聯的設計算是其獨有的特點。其他的語言或多或少都會依賴于別的的語言或平臺來運行,比如基于 .net 運行的 Iron Python,不是 Java 但是卻依賴 JVM 的 Clojure,甚至 Ruby 和 Rails 其實都有各自相對獨立的實體和工程。唯一一個比較知名的受 Cocoa/Cocoa Touch 和 Objective-C runtime 支撐運行的 Mac Ruby,后來也被蘋果停掉后了后續支持。
Objective-C 和相關的框架、runtime 以及編譯器等等這個體系對其他開發者社區而言是又幾乎是封閉的。
未來
從目前掌握的信息來看,過去的四年來蘋果一直在嘗試降低 Objective-C 語言的復雜度。淘汰手動內存管理以及C標準頭文件,引入更符合當下編程語言潮流的 ARC 機制,還有通過.語法來訪問屬性的 getter/setter 方法等等都是為了降低 Objective-C 的學習成本。但是即便如此,Objective-C 仍然是具備一定學習門檻的開發語言,它的熱度完全那些基于 Objective-C 編寫的熱門 iOS 應用帶起來的。
翻譯: 伯樂在線 - sunset
譯文鏈接: http://blog.jobbole.com/73146/
伯樂在線 2014-07-15 11:28:29
稱謂:
内容: