吐槽对象
回到对象的 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 内解决,会让复杂度变得很高,最佳实践是交给基础设施,一般转移到持久化层。
版权声明: 本文为 InfoQ 作者【顿晓】的原创文章。
原文链接:【http://xie.infoq.cn/article/088466e50063bfdb305c1dbb5】。文章转载请联系作者。
评论