稍微吐槽一下ObjC的函数调用

2013-10-08 16:20:38 +08:00
 Ricepig
ObjC的方法调用(消息传递)的写法首先是类/对象,然后是消息,然后是参数。这别扭的地方在于函数名和后面的参数名并列。举个栗子:

[UIColor colorWithRed:134/255.0f green:198/255.0f blue:124/255.0f alpha:1.0]

这尼玛是不是还有

[UIColor colorWithBlue:134/255.0f green:98/255.0f blue:124/255.0f alpha:1.0]



[UIColor colorWithGreen:134/255.0f red:198/255.0f blue:124/255.0f alpha:1.0]

方法的第一个参数参数名默认,第二个开始指定参数名,怎么写怎么觉得有点奇怪。
7005 次点击
所在节点    程序员
82 条回复
66450146
2013-10-08 19:53:42 +08:00
@Ricepig 其实只是习惯的不同

比如 new UIColor(134/255.0f, 198/255.0f, 124/255.0f, 1.0) 这样的语法应该更容易习惯(照顾 C++ 选手),也更贴近操作系统,但是可读性恐怕就差一点了

至于如果有人命名糟糕,这个无论是什么语言都难以避免,只能说,Obj-C 用这种方式,尽量的让程序员有可能能写出可以直接用英语读出就可以理解的代码


从一种代码风格转向另一种不总是容易的,尤其是像 Obj-C 这种设计一开始就比较奇葩的语言,多写点代码,多读点英语,自然就习惯了
otakustay
2013-10-08 19:55:42 +08:00
@dorentus 正如你摘录的,签名包含“方法关键字(objc里是中括号?),返回值,一个或多个签名关键字,参数类型,参数名称。很明显,colorWithRed:green:blue不包含上面说到的全部,因此叫签名我认为是不合理的
otakustay
2013-10-08 19:56:37 +08:00
@66450146 让我想起strcpy(a, b)函数……每次都要查下文档才知道哪个是from,哪个是to,真心痛苦……
blahnice
2013-10-08 20:55:04 +08:00
@otakustay 你怎么也来了 lili ,ObjC新手请退散好么
xuzhe
2013-10-08 21:48:32 +08:00
按楼主你从别的语言里学来的“函数签名”理论,你觉得以下两个方法放一起能编译过么?


- (BOOL)test1:(NSString *)test1 test2:(NSString *)test2 {

}

- (void)test1:(NSInteger)test1 test2:(NSInteger)test2 {

}
Ricepig
2013-10-08 21:49:52 +08:00
@xuzhe 为啥不能过?
biaobiaoqi
2013-10-08 22:15:23 +08:00
说实在的,lz的思路之前也有过。不过后来习惯了-,-

没什么语言能满足所有人的偏好,或者完美的合理吧。

一定要讨论个objc当初的设计为何是这样子,个人不觉得有意义。倒是觉得这个看法本身是不错的,我也这么想过,这就是我的第一反应『它看起来比较奇怪,第一个参数和方法名混在一起了』。或许将来某种新语言中会有更好的实现呢-,-
amoblin
2013-10-08 22:43:40 +08:00
楼主的逻辑其实很正确,理论上,应该是这样的函数:

[UIColor colorWith red:0.5f green:0.5f blue:0.5f alpha:1.0f];

其中colorWith表达整个函数名的作用(是生成color用滴),统领后面的参数:red,green,blue,alpha

然而实际使用时,colorWith和red有一个空格,浪费空间和时间(maybe),于是合在一起写了,类似于文字的连写

理想化的东西和现实总是有差距的,类似这样的问题其实有很多的。

楼主是一个完美主义者/理想主义者。
nil
2013-10-08 23:19:58 +08:00
刚开始看不懂楼主想说什么,后来看了@amoblin 的回复,才觉得刚开始学习语法的时候也有和楼主类似的困惑,不过后来这都不是重点了。。。
有人说lisp最优雅的部分是S表达式,
我觉得smalltalk最优雅的地方应该就是named parameters了,这么点语法糖给可读性带来质的飞跃,主流的编程语言中该特性支持最好的应该就是objc了,再加上xcode的智能补全,这货分明就应该统治世界,而不是java,javascript之流。
Ricepig
2013-10-08 23:23:19 +08:00
@nil 苹果出产的技术类产品,尤其是面向Geek和码农的产品,统治世界的可能性很小。
nil
2013-10-08 23:30:21 +08:00
@Ricepig 嗯,伪果粉的一点小想法,优雅之处还是在的~
chchwy
2013-10-08 23:31:59 +08:00
可惜上次GNUStep的募資沒有成功,錯失了一次把Objective-C推出Win/Linux的機會。
Ricepig
2013-10-08 23:43:10 +08:00
@chchwy Objective-C个人感觉在语言层面上并没有太多亮点,可能特性比C多一点,所谓可读性好一点吧。个人的感官来说,即使结合了Xcode,ObjC仍旧显得比较繁琐,生产效率不太高。它在保留大部分性能的情况下,比C/C++是强了不少,但是这一步仍旧稍显不够大,尤其在这个时代。
anson0370
2013-10-08 23:48:37 +08:00
难道不是这样么?

+ (CIColor *)colorWithRed:(CGFloat)r green:(CGFloat)g blue:(CGFloat)b; 这玩意儿是方法签名(包含返回类型、方法名、参数列表)

colorWithRed:green:blue: 这玩意儿是方法名

r, g, b 这三个才是参数名而不是 green 和 blue,并且参数类型都是 CGFloat

调用时参数的插入位置被放到了方法名中间,和绝大部分语言的直觉不符,但这也说得通嘛
mingming
2013-10-08 23:50:18 +08:00
我觉得如果是这样的话就顺眼多了。
[UIColor colorWithRed:134/255.0f colorWithGreen:198/255.0f colorWithBlue:124/255.0f alpha:1.0]
nil
2013-10-08 23:59:24 +08:00
@mingming 这个是高级黑?
clippit
2013-10-09 00:05:06 +08:00
楼主的两枚吐槽帖纷纷雄踞热门排行榜,功力深厚啊!
so898
2013-10-09 02:57:52 +08:00
与其吐槽赚分不如多写点代码
想当年因为我对于UIColor的CGFloat的憎恨,直接导致了一套专门写给这货,使得我不用每次除以255的代码的出现……之后的生活,风调雨顺……
alexrezit
2013-10-09 09:12:08 +08:00
@so898
弱爆了
+colorWithHex:
chchwy
2013-10-09 09:59:37 +08:00
@Ricepig
如果你想想Objc的出生時間是1983年,比Java、Ruby、Python等等語言都大了五歲到十歲,
你就不會意外它的語法設計如此了。Objc的老語法也是到了近兩年(2011年左右),Apple開始投入Clang項目之後,才慢慢有一些改良與演進。

Objc的亮點是在Objc Runtime,比方說可以透過
[myObject responseToselector:@selector(myMethod:)];
來判別對象是否能回應消息,這可是動態語言才有的特性阿,C/C++是連想都不敢想的。

Objc有動態語言的特性,強型別,同時完全兼容C語言,其實想想也明白它是一個妥協之下的產物。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://yangjunhui.monster/t/84873

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX