標籤:
雖然 Objective-C 的文法是如此的與眾不同,讓初學者如此的不爽,但是其實它還是有很多優點的(主要是對比 JAVA)。
協議 Protocal
其實也就是介面啦,不過由於 OC 在定義 class 的時候已經用了 interface 這個名字,所以這裡就叫 protocal 了。協議我覺得有兩大優點:
1. 允許非正式協議:讓我想起了前段時間看的 GO 語言的介面定義方式。就是說,當一個 class 並沒有顯式的聲明某個協議的時候,只要它實現了相應的方法,那麼就可以被當作相應的協議來用。
2. optional:在 JAVA 中,繼承一個 interface 的時候,必須要實現其所有的方法,但是在實際使用中,很多方法都並不是必須被實現的,因此會產生很多行無用的代碼。但是 oc 中允許標記協議的方法為 optional,這樣的話你就只需要實現自己需要的部分就可以了。
屬性(成員)的訪問(getter/setter)
這點其實不是 OC 專屬的,我只是想吐槽 JAVA。JAVA 裡面通常是建議類的屬性是不暴露出來,而通過方法來進行訪問,這樣的好處在於,如果需要在訪問屬性的時候增加某些邏輯處理非常的方便。但是,需要這種邏輯處理的時候並不多,因此,為所有的屬性寫 getter/setter,那簡直就是增加垃圾代碼。OC 的方式(C#也相同,其他的不太清楚)是在需要的時候寫 getter/setter 就可以了。如果同樣都實現了 getter/setter,那麼兩者的差別在於:
在 JAVA 中:
直接存取屬性:member = object.member; object.member = member;
通過getter/setter:member = object.getMember(); object.setMember(member);
OC 裡面統一是:
member = object.member; object.member = member;
區別在於,OC 中,你只在需要的時候去實現 getter/setter 的邏輯處理,而不需要改動其他地方的代碼。而 JAVA 中,如果你開始沒有寫 getter/setter,那麼後來你需要加入處理邏輯的時候,你需要改動所有訪問該屬性的地方,如果你一開始就寫了的話,那隻是增加了大量的垃圾代碼。
委託
這在C#中也有的東西。JAVA 中當然也可以實現委託模式,當然,是用介面,建立一個 listener 之類的東西。但是,其實很多時候你只是需要一個方法而已,你不需要一個 interface。雖然其並無實質差別,但是寫起來就是很不爽啊。而且你還要為你的 interface 想一個的名字,而且這名字通常都不短。如果定義委託,你只需要給方法想名字就 ok 了。
Category
這東西有兩點好處:
1. 可以把實現的邏輯分布到不同的檔案中,減小單個類檔案的大小
2. 可以根據需要,在不繼承的情況下也可以對原 class 進行擴充,非常的方便
C#中也是很早就有了類似的東西(果然我還是非常喜歡C#啊)。
NSDictionary
這東西也值得說一下。JAVA 中的集合類型,都要求集中中的資料是同一種類型(當然你也可以把集合聲明為 Object 集合……)。NSDictionary 中不要求資料是同一類型,這樣的話,用起來就會非常的靈活。
小小的總結一下:設計程式設計語言的時候,在考慮功能強大的同時,適當的加入文法糖也是非常有必要的,因為文法糖可以極大的簡化代碼,程式碼數變少了以後,很多問題都可以避免掉。其實要說的話,目前我可能最喜歡的還是C#,可惜微軟不給力啊。JAVA 雖然有很多讓我不爽的問題,但其實還是瑕不掩瑜的,只是 JAVA 的進步確實太慢了一點,而且一些比較基礎的東西其實是很難改進的。
Objective-C 的一些優點