Objective-C 的一些函數名爲什麼都這麼長?

原文來自知乎:

Objective-C 的一些函數名爲什麼都這麼長,有些長的甚至不可思議,某些方法的函數名帶個參數的話甚至超過一行!爲什麼不能像 C 語言那樣多一些成員函數的包涵,使得程序員能輕易的記住並通過.name的提示方法簡單的找到?


可讀性。
比如你設計一個邀請朋友參加聚會的方法,除了指定姓名外,還可選擇是否提前預約:

public void inviteFriend(String name, boolean appointment);
然後別人調用起來是這樣的:
somebody.inviteFriend("LiLei", true);
問題就來了,寫程序時即便不會搞錯,等到閱讀這段代碼的時候,這個布爾參數的理解就非常有歧義,除了「是否預約」之外,還可能理解爲「是否貴賓待遇」,「是否接送」,「是否發請帖」……。如果不看文檔中參數的描述,根本就無法理解正確。
所以爲什麼有人提倡不建議使用布爾參數,就是因爲可讀性麻煩,一種解決方案是用枚舉:
public void inviteFriend(String name, Appointment appointment);
但引入了新的類型,似乎更麻煩了……來看看 Objective C 是怎樣的:
-(void) inviteFriend:(NSString *)name appointment:(BOOL)appoint;
看起來挺麻煩的,但調用起來呢?
[someBody inviteFriend:@"LiLei" appointment:YES];
看起來是不是既方便,又一目瞭然?

------------

更新回答,也是對@朱衆 方案的迴應。
如果看到這樣一個方法:
dongxin.send("iPhone 5s", zhuzhong, 2, "順豐快遞", 20, 20, true, false, true)
不看文檔的話,前面估計還能猜出來是 dongxin 給 zhuzhong 用順豐發了兩部 iPhone 5s,但後面那些玩意呢?
而 Objective C 的代碼:
[dongxin send:@"iPhone 5s" toContacts:zhuzhong,
                           quantity:2,
                           expressCompany:@"順豐快遞",
                           insureValue:20,
                           freight:20,
                           atDestination:YES,
                           shippingNotice:NO,
                           arrivalNotice:YES];                          
你很容易就能知道,這是在說,dongxin 給 zhuzhong 用順豐快遞發了兩部 iPhone 5s,並且保價費用20,運費20到付,沒有發貨通知,最後要求收到手機時打個招呼(自動略去英文水平吧)。
很顯然這個方法非常長……不過個人認爲,在編寫程序基本不受影響(有完善的自動補全)的前提下,可讀性應該儘可能的好。
在這樣的場合,分拆方法基本上行不通,太複雜了。至於爲什麼不使用命名參數,因爲和文檔一樣,都不是強制性的要求,而且命名參數在代碼編寫時恐怕不是很方便,可能會被偷懶的人自動略過。而 Objective C 是真正把可讀性要求寫進了語法裏,而不是文檔裏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章