面向对象编程的关键目标

面向对象编程的关键目标Object Oriented Programming: A Critical Approach一文从面向对象的诞生原因,以及始祖SmallTalk语言特点,阐述了OO的关键。

作者认为,C++语言比C复杂多,正如Object Pascal相当比Pascal也复杂得多。Ruby作为新语言总算争了口气,但是他们都有优缺点,他们给予了细心的程序员创建良好可重用的代码,但是另外一方面,他们也能让粗心的程序员写出无法维护调试的代码。

Smalltalk的一个关键点在其他语言中丢失了:状态处理。一些OO语言可以隐藏对象的内部状态,但是状态的访问不是通过方法,或者发消息,而是可以从外部直捅到内部状态(比如java中宣称public 变量名),语言应该让对象的状态独立于他们被使用的代码,这才是Smalltalk的关键所在。

正如Smalltalk原理架构师之一Dan Ingalls所说:No component in a complex system should depend on the internal details of any other component.
一个复杂系统的组件不应该依赖其他组件的内部细节(banq注:还是逻辑分层原理所致)

如果一个对象的内部细节能够被从外部访问,如果程序员改变这些内部细节,这些改变就会产生无法预料的副作用。程序员们经常认为封装是可以保护代码避免出错的,其实错了,只有你执行严格的模块化和数据隐藏,以确保你的对象的内部细节对于对象之外的代码是不可见的。

Dan Ingalls再次强调了模块化的重要性:

"消息发送者能够提供模块化,带有内部细节的消息从方法中被发出,被接受者接受。结构化信息同样能够被保护,因为所有对对象内部状态的访问都必须通过同样的消息接口。"

Alan Kay也表示歉意,他过分强调“对象”的好处而牺牲了突出“消息”。他说:“对不起,我很久前就创造了这个”对象“这个词,它让很多人把重点放在较小的想法。大的想法是“消息”......伟大的,不断增长扩展的系统的关键是它的模块设计如何沟通,而不是其内部的属性和行为应该是什么。“


最后,作者总结:
现在,哪怕最现代的面向对象编程语言总是从Smalltalk随机拾起一堆东西而忘记了什么是Smalltalk的美丽。因此,这些语言相比旧语言来说,往往并不是最简单的或更安全或更优雅和美丽。(banq注:方向错了)

Alan Kay艾伦·凯说,“当C ++就出来了,他们试图以迎合C + +程序员,他们做了一个不伦不类的系统。而正是这些不伦不类却被称为面向对象。“

这并不意味着用现代的面向对象的语言你不能写出漂亮的,模块化的代码。但是,为了做到这一点,你必须运用了大量的自律(而这增加复杂,不再简单了),简约就是美。
[该贴被banq于2012-12-05 10:20修改过]

可以毫不夸张地说:Jdonframework代表的事件驱动模型正是符合真正的面向对象,每个聚合体实际是一个模块,聚合体之间交互调用是通过事件消息,主要落实在聚合根实体的发送和接受事件。

可见:机器人Bot案例
[该贴被banq于2012-12-05 11:22修改过]
[该贴被banq于2012-12-05 11:23修改过]

这篇文章的目的应该是想指出,C++面向对象的精髓不只在于它的开发思想,还有他对内部数据的安全性封装,如果任意透露内部的数据查询或修改接口,还在对象与对象之间交叉引用的话,就违背了语言设计的初衷。
[该贴被root于2012-12-05 13:55修改过]

2012-12-05 13:54 "@root"的内容
如果任意透露内部的数据查询或修改接口,还在对象与对象之间交叉引用的话,就违背了语言设计的初衷 ...

是这样,但是这些都是君子协定,防君子不防小人,没有强迫性,如果引入消息事件就具有一定强迫性,但也不是每个对象之间都用消息发送接受,粒度太细,而是组件之间用消息,每个组件内有几个对象,每个组件代表一个模块。

以如下图所示:Shipping Sales Billing表示三个模块,分别是货运 销售和财务,这里每个模块代表一个组件,模块之间的调用使用消息事件。

嗯 ,这样就比较容易懂了……

再贴图:领域驱动DDD聚合体作为模块,聚合体外使用事件消息,聚合体内封装了状态,外部调用必须通过消息事件实现,而不能直接通过方法调用。