稍微吐槽一下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]

方法的第一个参数参数名默认,第二个开始指定参数名,怎么写怎么觉得有点奇怪。
6827 次点击
所在节点    程序员
82 条回复
chchwy
2013-10-08 17:44:35 +08:00
@Ricepic
不太明白你說的「第一个参数隐含了名字,造成第一个参数非常特殊」是什麼意思。

這四個參數有什麼不一樣嗎? ...可否麻煩您說的清楚些?
Ricepig
2013-10-08 17:48:08 +08:00
@PrideChung 请问写成Color.Create(red:255,blue:255,green:255,alpha:1.0)是不是感觉更加清楚一点呢?
Ricepig
2013-10-08 17:57:17 +08:00
@txx
@fgwww
@elden
@chchwy

请教一个问题,ColorWithRed这个部分,是表示一个动作(消息),还是表示一个动作(消息)加一个参数?为什么要把消息设计得这么纠结?每个部分我认为担负一种责任就够了,但是这里负责了两种,首先它表达了要干什么(动作),其次它表示了第一个参数是什么。

这种语法在只有唯一参数的方法或函数调用时是比较简洁的,一旦参数超过一个,就显得有些诡异。

正如我举的例子,为啥就有colorWithRed,没有colorWithBlue,colorWithGreen?

当然,可以说,这是一个习惯问题。这么说的话,如果当年ObjC设计成[UIColor colorWithBlueNRed:255,255 green:255 alpha:1.0]也完全没有问题。
chchwy
2013-10-08 17:57:48 +08:00
我懂你的意思了。

其實還是一句老話,整句都是函數名字。
不要理解為前半段是函數名字,後半段是參數名字,不是這樣的。

colorWithRed:green:blue:alpha: <= 這整個都是函數名字。

只是這個函數名字中間有挖些洞,可以填入參數值。
Ricepig
2013-10-08 18:00:17 +08:00
@chchwy 你说的“整句都是函数名字”,在一般书籍中指的是函数“签名”(Signature),它包含函数名、参数列表、返回类型等。

或者,用你的概念来说,为什么函数名字不是createColor:red:green:blue:alpha?
ritksm
2013-10-08 18:04:58 +08:00
没看懂LZ想表达什么
大家都说了colorWithRed:green:blue:alpha:这一个才是函数名
不是你所谓的签名
函数名懂么?
def foo(bar):
pass
等同foo
chchwy
2013-10-08 18:05:03 +08:00
我可以舉個例子說明

比方說複製檔案的函數是
NSFileManager copyItemAtPath:toPath:error:

具體用法是
[myFileManager copyItemAtPath:@"FileA" toPath:@"FileB" error:nil];

你能說消息名是copyItemAtPath:
第一個參數名字叫Path 第二個叫toPath嗎?

當然不是的。

copyItemAtPath:toPath:error: <=這整個都是消息的名字,只是消息名稱中間可以填洞。

整句代碼就像是英文句子一樣,後半段你可以為了清晰而寫明參數名,但是不寫也是可以的。

像是有的數值運算庫 就用 [Fraction set:1 over:2] 來表達1/2的概念。
Ricepig
2013-10-08 18:09:50 +08:00
@chchwy 我不认为copyItemAtPath:toPath:error比copy(from:xxx, to:xxx, err:xxx)要清晰。
Ricepig
2013-10-08 18:14:42 +08:00
@chchwy @ritksm 另外我明白你还有很多人说的NSFileManager copyItemAtPath:toPath:error:是“消息名”

但是这是苹果的叫法,在其它几乎所有语言中,这种包含名字、参数列表和返回类型的东西都叫做签名。

所以不要觉得它叫这个而不叫那个,它就是对的。

从我说的例子来说,UIColor后接的那一部分(我认为用空格分开的称为“部分”),不但表达了动作(消息),还表示了第一个参数是什么,而后每一个参数都与这个不同,这种不一致让我觉得怪异。
chchwy
2013-10-08 18:17:55 +08:00
牽扯到清晰就跑題了,大哥。

我只是說明這樣的函數名並沒有任何的邏輯衝突之處。清晰與否則是個人主觀。

你喜歡用括號就用括號表達參數名,你當然可以認為這樣比較好,只可惜Objc並沒有參數名,也沒有用括號。

Objc的前身Smalltalk也不是用括號。
Ricepig
2013-10-08 18:18:15 +08:00
@chchwy 另外,从[Fraction set:1 over:2]来看,我不认为分子比分母有更大的重要性,为何分母就需要用over标识,而分子直接跟着set就可以?

另外,如果方法的编写者在命名的时候出于某种原因,没有包含"AtPath","withRed",方法调用者是不是要去猜第一个参数该是啥?
Ricepig
2013-10-08 18:19:34 +08:00
@chchwy 不是说括号,简单来说,我是对“colorWithRed”中color和red不分开表示无法理解,既然green和blue都是分开的。至于用空格,还是用括号分开,见仁见智。
ritksm
2013-10-08 18:21:01 +08:00
@Ricepig 为何要以其他所有的语言的叫法来说吗objc的概念

难不成类C语言里要花括号,不用花括号的语言就是错的?就是不合理的?

难道这不是个人喜好问题?按你的意思就说成是真理性的问题了?
PrideChung
2013-10-08 18:23:10 +08:00
@Ricepig 我不认为 copy(from:xxx, to:xxx, err:xxx) 比 copyItemAtPath:toPath:error 要清晰。
goodan
2013-10-08 18:24:35 +08:00
卤煮偏离轨道了。围观中~~
chchwy
2013-10-08 18:27:48 +08:00
原來如此,那這個就是語法設計議題了。
要不要把名字和參數名切開只能說是當初語言設計者的喜好問題了。

我可以說說objc的背景

這種參數可以穿插在名字中間的寫法是從Smalltalk來的,Objc精神上是繼承自Smalltalk,Smalltalk 並非 C-like的語言。

只是迫於現實的緣故,Objc設計之初需要相容於C語言。所以用C的語法來思考,可能不夠妥當。

看看Wiki的Smalltalk條目,看看他的語法,或許你比較可以理解
https://en.wikipedia.org/wiki/Smalltalk
Ricepig
2013-10-08 18:27:53 +08:00
@ritksm 括号不括号没问题的,是不是用空格分隔token也没问题

只是觉得语言应当简洁、一致。而ObjC中这种“函数名”对第一个参数和后面其他参数有点儿区别感到怪异。


@PrideChung 你的这个调用,我可以问一下,为什么不写成copyItemToPath:atPath:error呢?
alexrezit
2013-10-08 18:28:15 +08:00
@Ricepig
首先那个不叫 "函数" (function), 叫做 "method". 而且那个就是 method 名, 它跟其他语言是不一样的, 它相当于 ColorWithRedGreenBlueAlpha(red, green, blue, alpha), 而不是 Color(Red:red, Green:green, Blue:blue, Alpha: alpha). 你根本就是自以为是地把它和一个毫不相干的东西联系起来.
alexrezit
2013-10-08 18:29:25 +08:00
@Ricepig
顺序是定义的时候规定的, 后面的参数相当于 arr 而不是 dict.
Ricepig
2013-10-08 18:30:03 +08:00
@PrideChung 或者函数设计者写成了copyItem:atPath:error,还能理解吗?

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

https://www.v2ex.com/t/84873

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

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

© 2021 V2EX