现代新的简化”对象“和”面向对象“的定义

12-07-14 banq

传统面向对象定义已经过时,过去定义已经不能满足新语言新思想的发展,来自A Proposal for Simplified, Modern Definitions of "Object" and "Object Oriented"

一文试图提出一种新的对象定义,以容纳适应新的发展形势。

新的对象定义是:An object is a first-class module that is invoked polymorphically
对象是能够被多态调用的顶级模块。

这里模块module定义可以是传统语言的类Class,也可以是函数语言的函数function。这样,面向对象定义比以前更加宽广,可以包含Scala等新的函数语言。

多态性polymorphically被定义成运行调用方式,而传统OO语言的继承只是其中一个代码机制的实现,在运行时实现多态,包括运行时的Mixin实现,在不改变不变动原来代码情况下将新的代码混入运行。这就更加侧重运行时的对象定义,而不是传统意义上编码阶段的对象定义了。

作者还总结了对象哪些特性是对象的重要本质特性,其中最重要的是可变状态Mutable State
,值对象是一种不可变对象,大部分函数语言试图通过回避可变状态来实现高并发性能,但是这也许有些激进,因为可变状态的应用越来越多。

我们有办法从可变性分离出不变性,我们也有办法去控制可变性(先容纳再控制的哲学),比如在GOF设计模式中只有State, Memento, Observer, Decorator, 以及Chain or Responsibility 和 Adapter都需要可变性. 通过模式,我们达到重点分界可变状态和不可变状态,然后围而分别歼之的策略,这样,不可变的安全区域才会变得更加广阔,变成一种缺省语境。


作者将标识Identity也归为对象必须的特性,在领域驱动设计DDD中我们知道实体的特点是标识,用来区别某个具体的对象,标识可以有能力来区别两个引用是否指向同一个对象,相同对象的定义是它们的引用都指向一个单一的对象创建事件的结果。


作者认为其他特性如类Class 或方法定义Multi-methods都不适合纳入新的对象定义之中,还有比如反射reflection, 静态类型static typing, 接口interfaces, first-class classes, 并发对象concurrent objects, 同步synchronization。





15
banq
2012-07-14 16:31

标识和可变状态作为对象定义的重要特性,很显然,对象成为DDD中实体的等同实现,实体对象一般是一种可变状态的对象,而值对象是一种不可变的对象,我们使用DDD进行分析设计需求时,从需求中提炼出实体和值对象两种不同类型对象,实际就是从分析设计阶段重视可变性和可变性区分,重点对待可变性,将缺省语境环境变成不可变性,才能开发出一套高性能高并发的软件系统。

不变性immutablity设计

是不是可以极端地认为:性能设计融入在业务分析设计中,业务分析设计不是纯粹的业务分界,而且是找出更适合计算机CPU干的事情出来,就像让每个人干自己最适合的事情,才是效率最大化。



lostalien
2012-07-14 17:33

面向对象理论发展太快了吧?最后把人逼得继续写 事务脚本式 的代码。。。

banq
2012-07-15 20:51

相关讨论:

重新认识对象和行为的关系
如果对象只是封装有状态的数据,那么对象应该有行为吗?

为什么对象如此糟糕?
Erlang发明者认为对象不应噶将数据结构和函数捆绑在一起...

2006年的一篇旧文:状态对象:数据库的替代者

[该贴被banq于2012-07-18 15:29修改过]

showerxp
2012-08-01 09:53

2012-07-14 16:11 "@banq"的内容
对象是能够被多态调用的顶级模块。 ...


“被多态调用”放置于日常用语,我认为就是抽象。

keenkui
2012-11-19 14:47

学习~~~~~~~~~~~