《抽象是一种美》
计算机编程语言的每一次进化,都是一种抽象。
从最初的面向与非门和数字电路的开关,到基于一种中央处理器架构的汇编语言,这是一种巨大的进步,计算机从此进入可编程时代。
再到后来高级语言的发明,更进一步的抽象了硬件,编程者甚至不用考虑硬件问题,从此软件和硬件有了分界线,高级语言的发明带来了软件革命,随着软件工业发展,越来越多,越来越大型的软件工程的发展,面向过程的编程语言的基于流程和逻辑的思想和本色已经不能满足这种复杂性和生产性的要求。
这时候出现了新的编程语言机制,她实现了更进一步的抽象,把过程和逻辑封装起来,让他们之间通过合理的设计模式进行沟通,这就是面向对象的编程思想。有了面向对象,“软件工程”这四个字才有了实质性的意义。
但是由于良好的设计模式的实现需要丰富的设计经验和高超的设计技巧,一般人往往容易陷入其耦合与解耦的泥潭,而不能自拔,于是就有人提出组件化的编程思想,即把各个对象或对象的组合封装成一个组件,组件之间通过合理的接口进行沟通。就像汽车的零部件一样,产品是由组件组装而成,这是更进一步的抽象。Microsoft的COM就是基于这一思想构建的。
至此,我们有了软件工程,有了组件工厂,似乎我们的软件工业已经很完美了,但其实不然,我们解决了工程的问题,但是还存在工艺的问题:
1. 组件内部的设计仍然具有相当的复杂性
2. 组件之间的接口设计仍然需要考验设计者的经验和能力
如果说前面这两个问题无法避免,他必然依赖人,也就是有良好技能和经验的设计者和编程者得话,那么下面这个问题,恐怕就不容易通过经验和能力来解决,或者说他更应该有编程语言本身来提供:
3. 如何让一个组件做到通用化,他可以适用于不同的软件架构和目标产品,而不是只是适用于特定的目标产品。
别小看这个问题。
面向对象编程的核心思想就是把编程的标的抽象成一个有行为有属性的对象,但是这也很容易让设计者把对象具象化,也就是说你本来是要把做的东西抽象出来,但是在使用OOD或者OOP的过程中,有自然而然的把它具象化了,注意,这是自然而然的。这样带来的结果就是:具象化的对象和组件是不具有完整意义的组件的,因为他们往往针对特定的产品和架构的环境而设计,脱离了特定的环境,他是无用的,那么也就失去了组件化的意义。
解决这个矛盾的新的编程思想被引入:那就是泛型编程的思想,泛型编程很自然的解决了这个问题,不仅如此,他还带了抽象的思维方式的转变。这种转变,或许已经是进入哲学范畴:世间万物,皆可抽象。或者用《老子》的第一篇来说:
无,名天地之始;有,名万物之母。故常无,欲以观其妙;常有,欲以观其徼。此两者同出而异名,同谓之玄,玄之又玄,众妙之门。
我则简单的认为: 抽象,是一种美!