史 2024-3-3 11:51
"abcdefg"包含"bcd",一个字符串可以包含另一个字符串,能画成字符串之间的自反关联吗?
UMLChina潘加宇
抛开对象和值的区别不谈,假设我们把一切都看作对象,String存在包含(被包含)的自反关联吗?
这个问题看似简单,背后却是很多人并不清楚的问题:建模该建什么模。
世界上万事万物,只要我们乐意,都可以找出它们之间的关系。
但我们需要建模的,仅仅是等待着我们建立以解决问题的关系。
例如,我们做一个企业管理系统。
这个系统可能需要知道一个字符串是否包含另一个字符串,例如“马宝国”里面是否包含“马宝”?
这个问题已经被别人解决了,例如.NET中,s1.Contains(s2)。
这个系统可能要求整数的立方,例如,x=3,x的立方等于多少?
同样,这也已经被别人解决了。
而且,上面的Contains也好,求立方也好,它们的实现并不是先建立字符串之间的自反关联或整数之间的自反关联,如:
{(“马宝国”,“马”),(“马宝国”,“宝”),(“马宝国”,“国”),(“马宝国”,“马宝”),(“马宝国”,“马国”),……}
{(1,1),{2,8},(3,27),(4,64),……}
然后查询这些关联得到结果——不是这样,Contains们从来没有,也不需要建立和维护这样的“自反关联”。
结果是通过已经掌握的规律计算出来的。
这个系统可能还要知道,如果一名员工的工号是20249527,那么他的直接上级的工号是什么?
如果我们能够像上面的字符串包含和立方一样,找到“工号→直接上级工号”背后的计算规律,那就再好不过了。
例如,先判断工号的奇偶,如果是奇数,则乘以3再加1,如果是偶数,除以2,重复以上过程,直至得到1。把停止后得到的数字序列按照UTF-8编码转成字符串,即可得到直接上级工号。
可惜,目前并没有发现这样的规律。
这个时候,才需要我们建立关联来解决问题。
系统得老老实实维护“工号→工号”之间的“直接上级(直接下级)”关联,例如:
{(“20213488”,“20180189”),(“20230205”,“20150412”),(“20249527”,“20180102”),……}
然后在需要时查询。
(更常见的应该是员工之间的自反关联,此处简化为工号。)
我们要建模的内容,是当前无法计算的内容。
“工号→直接上级工号”有没有一个计算公式呢?也许是有的,如果我们宇宙是由神级文明创造和控制的,一切运行都有其规律,可惜,目前我们掌握的仅仅是少数。
★友情警告:
根据获得银河奖和星云奖的科幻小说《我们生活在南京》,银河系神级文明的农用收割机将于2024年(今年!)收割地球这个农场上的果实——人类,人类最后只剩两名女性在南京逃过收割——“老师”和幼儿“半夏”。
“老师”在教育和抚养“半夏”长大后死亡。2040年,少女“半夏”通过短波电台联系到了2019年同一位置的少年“白杨”。
咦?这不是《黑洞频率》、《信号》嘛?不是,作者写出了新的高度,很优秀的故事。
还有人专门打卡了书中提到的地点:
=====扩展=====
以下图片内容来自国内领域驱动设计圈子的某本著作:
作者说,add1()函数是把每个数和它的后继做模式匹配。
这看起来类似于给“整数”建立一个名为“后继(或add1)”的自反关联。
但是这个add1()函数,其定义域和值域都是整数,是一个无限集合,代码是这样干的吗,这样干行吗?
另外,既然名为“模式匹配”,“模式”这个词蕴含把许许多多个例归纳或分类的意思。模式的个数应该是少量的,例如,一个枚举“商品类型”。
图片中的内容却是把每一个整数做模式匹配,岂不是有无限个模式?
不过倒是符合投资少、见效快、产量高、门槛低、仪式感十足的特点。
我不是函数式编程专家,只是提出疑问,各位读者有空赐教。