【2021-07-08】
@tertio: 好久不编程了,这几天用python编了几个命令行程序做点课程文件的自动处理,省了一堆手动操作。python的工具箱的确全,写起来省事。顺便想起来一个例子,可以用来展示一种乾坤颠倒的编程方式,例子虽然非常小,但说明这个概念足够了。
假如我想调用一个函数,这个函数的作用是“计算一个列表的长度”,但是我不知道在哪个库里,也不知道叫啥名字,但是我可以定义它的功能:
LengthOfList([])->0
LengthOfList([a,b,c])->3
LengthOfList([1,34,8,9,0])->5
也就是说,我定义了一个名字,然后定义了它的输入-输出测试,然后系统通过一番测试,发现有这么个函数,可以实现这样的输入-输出,于是就给定位了。
然后呢?然后我就去用它了,而且按自己给的名字去用,而不是按它本来的名字,还有一种可能,这个函数并不存在,是系统自己凑出来的(至于凑的能力,一开始肯定很弱)
这里最有趣的一点就是,如果定位的是已经存在的库函数,而系统升级到某个版本之后,把库函数名字改掉了。那么我这段代码还能用吗?
居然还能用,因为定位的这个函数是系统自己测试出来的,而不是直接按名字匹配。
这种解耦已经非常彻底了。
如果系统升级到某个版本,库函数功能发生了变化,导致输入-输出不成立了,那么这段代码还能用吗?
还是能用。
因为系统是按输入-输出的功能去定位的,满足功能的才能定位,如果实在找不到,就是给出一个失败的结果。
有人也许说,有限的输入输出对,对功能的定义不完备,有可能出错。
这不是问题,编程的任何环节都可能出错,这种错误并不显得更突出。
@whigzhou: 我说不出为什么,但我的直觉是,这种方法会陷入类似于当年单层神经元网络曾陷入的困境
@whigzhou: 略微复杂一点的映射关系,恐怕都无法用少数几个输入输出对来表示
@whigzhou: 或许可以通过一组行为特征来表示某种模式,但那不是输入输出对
@whigzhou: 依我看,要实现这种解耦,不如把函数调用改为消息交换,想调用某个功能的地方,直接朝系统喊一声:我需要如此这般的帮助,谁来帮我啊
@tertio:最复杂的就是直接给出整个程序的需求,当然做不到,退而求其次,可以分解为更加简单的模块,降低复杂性,直到能猜出来为止。
@whigzhou: 你的思路,以我理解,其实就是想用摹状词代替专名来指称一种映射关系,但摹状的摹法有很多,输入输出对并不是好摹法
暂无评论
发表评论