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的这种方法调用(消息传递)形式则能很好的解决命名污染的问题。变量或其他函数或方法并不需要标明内容或返回值的具体含义,它们所在的位置就有含义(用途)的描述。
命名污染在大型的复杂程序中显得尤为明显,命名困难症往往并不是真正的不会取名字,而是为了在名字上携带的足够的信息让代码具有可读性而抓狂。
也许,“啰嗦”有“啰嗦”的好处。😄
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了