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 是真正把可读性要求写进了语法里,而不是文档里。

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