写点什么

吐槽对象

用户头像
顿晓
关注
发布于: 2021 年 05 月 11 日
吐槽对象

回到对象的 2 大属性:所属的类型和提供的函数。函数在各编程语言中表现都差不多-函数三元组,但对象和类型的关联就有多种实现方式,其中最大的误区就是把对象当做超级复合类型用。


对象为什么会被当作类型用?这个锅由 class 来背?因为 ta 和表达类型的 struct 长得太像了,可能有部分原因;又或人容易偷懒,喜欢就地修改代码,让代码快速 work;但重点都不在此,要把这个说清楚需要几点:


1. 回到 OO 出现之前的情况-过程式编程:函数实现逻辑,全局变量实现数据共享。这时的问题不在函数,在于共享的数据。


2. OO 改善了函数的处境,其实也就是减少了个 context 参数,默认提供了 this/self 参数而已;对于共享数据的问题,如果只是把全局变量换了个地,本质上并没有解决问题。


3. 那 OO 到底有没有解决数据的问题呢?其实并没有,对象状态可以携带数据,但这部分数据主要目的是为了让逻辑变得更简单,减少更多参数,为多态逻辑提供支持。


4. 关键来了,从顶层设计看,对象应该携带什么数据?答:只携带能区分多个实例的 ID 数据即可。


5. 那数据共享的问题还没解决,怎么办?数据的问题,不是 OO 负责的,OO 只是能较好的管理好逻辑;数据的问题也得需要几点才能说清楚。


总的来说,数据的问题需要整体架构来解决。


1. 数据的来源和去处

来源有:配置、流量(请求)、持久化去处也差不多。


2、有状态->无状态

函数本是无状态的,如果需要有副作用,也是把这些问题转移出去,转给流量、持久化层;所以数据在对象间只是匆匆过客,如果要持有,也只拿 ID,然后持久化层获取(DB,Cache,MQ...)


总结一下:OO 中的对象,如果叫 agent 会让人更不容易和类型/数据关联在一起;由于历史问题我们继续使用对象。类型在 OO 中扮演的角色主要是当关系/函数中的信息/数据/参数,需要共享时不要试图在 OO 内解决,会让复杂度变得很高,最佳实践是交给基础设施,一般转移到持久化层。

发布于: 2021 年 05 月 11 日阅读数: 12
用户头像

顿晓

关注

因观黑白愕然悟,顿晓三百六十路。 2017.10.17 加入

视频号「编程日课」 知识星球「俺的死党顶」

评论

发布
暂无评论
吐槽对象