Objective-C杂谈【1】

ObjC(Objective-C)进入人们的视野,主要源自MacOSX的Cocoa。
人们即使是开发着更多关注的也是Cocoa靓丽的外表,对支撑起Cocoa的ObjC确一直缺乏深入了解。

ObjC给人深刻印象的无异于它与传统基于“.”的面向对象语言语法的完全不同的调用或者消息传递语法。
例:[object doSomethingWithParameter:A paramter:B paramter:C]
习惯传统面向对象语言语法的用户对此非议颇多,最核心的就是:啰嗦!!
然而这种语法并非ObjC的独创,它借鉴自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。
而第一种形式依旧清晰的标注了所有参数的“含义”。
如果这些被调用的函数变得更加通用一些:

  [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))

现在,还能看出第二种形式调用(消息发送)中的参数的含义么?当然不能了。
也许你会说,做好命名呗,有啥大不了的,(ˉ▽ ̄~) 切~~

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

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

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

posted @   applesnake  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
点击右上角即可分享
微信分享提示