面向对象编程的关键目标
面向对象编程的关键目标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修改过]