Objective-C杂谈【1】

ObjC(Objective-C)进入人们的视野源自MacOSX的Cocoa。
然而开发者更多关注的也是Cocoa靓丽的外表,对支撑起Cocoa的ObjC却缺乏深入了解。

ObjC给人深刻印象的,是与传统使用“.”的面向对象语言语法的完全不同的,调用或消息传递语法。
例:[object doSomethingWithParameter:A paramter:B paramter:C]
习惯传统面向对象语言语法的用户对此非议颇多:啰嗦!!
不过这种语法来自于Smalltalk,并非ObjC的独创。

面向对象语言中,消息通常由消息本体和参数构成,发送消息就是将消息连同参数通知给目标并取得结果。
例:Object.doSomethingWithParamters(A, B, C)
粗看之下,一般认为后者更“好”——更为简洁直接。
但这种“简洁”存在不小的副作用。
例:

[list findStringsWithPrefix:p
                      suffix:s
                  matchRegex:r]
 list.findStrings(prefix, suffix, matchRegex)

第二种形式,为了说明参数的用途用而特地将变量命名为prefix,suffix和matchRegex。
这种“简洁”形式还比第一种更为“优雅”。
但如果是这样:

[list findStringsWithPrefix:get_filename_prefix_from_config(config)
                       suffix:get_filename_ext_from_config(config)
                   matchRegex:get_filename_pattern_from_config(config)]

  list.findStrings(get_filename_prefix_from_config(config),
                   get_filename_ext_from_config(config),
                   get_filename_pattern_from_config(config))

在这里传统形式的参数“含义”已经开始变得模糊了,第二第三参数的函数名字中不再包含suffix和matchRegex。
而ObjC的语法依旧提供了依旧清晰的标注。
当被调用的参数获取函数变得更加通用一些:

  [list findStringsWithPrefix:get_str1_from_config(config)
                       suffix:get_str2_from_config(config)
                   matchRegex:get_str3_from_config(config)]

  list.findStrings(get_str1_from_config(config),
                   get_str2_from_config(config),
                   get_str3_from_config(config))

传统调用(消息发送)中的参数的含义已经不可知,除非看头文件或者IDE提示,再或者你的记忆力超群。
也许你会不屑一顾:做好命名呗,有啥大不了的,(ˉ▽ ̄~) 切~~

命名可以解决一些问题但不能解决所有问题。如果传统形式的调用发生在另一个函数内,要保证prefix、suffix、matchRegex的“含义”(用途)被传导到最终的findStrings函数,就要求上层调用在调用findStrings时使用含有这些“含义”(用途)的单词去命名变量或者函数。如果输入来自更上层呢?那么这个命名要求就会层层上传,就像“传染病”一样污染变量和函数的命名空间(个人称为:命名污染)。

ObjC或者说Smalltalk的这种方法调用(消息传递)形式则能很好的解决命名污染的问题。变量或其他函数或方法并不需要标明值的具体含义,它们所在的位置就能描述其用途。

命名污染在大型的复杂程序中显得尤为明显,命名困难症往往并不是真正的不会取名字,而是为了在名字上携带的足够的信息让代码具有可读性而抓狂。
“啰嗦”也有“啰嗦”的好处。😄

posted @ 2024-01-28 12:15  applesnake  阅读(49)  评论(0)    收藏  举报