一、从函数说起
我是 1993 年学习电脑的。学习的开发语言有三种:汇编、C、DbaseIII。
所以在我学习的时候,我并不了解面向对象的代码架构设计和代码编程实现。所以要从字面上来区分函数和函数之间的关系,主要就靠函数命名、放在同一个代码文件里、放在同一个代码目录文件夹里来区分他们之间的关联性。
在当时函数时代,也没啥异常保护、异常处理、异常日志的函数编写基本原则,所以我们除了命名以外,主要注重的就是函数的输入数据参数以及格式、输出数据的参数以及格式。
二、面向对象
我的面向对象是用 Object Pascal 开始的,但真正大量写面向对象代码的时候是使用 Delphi,那已经是 1996 年的事情了。
因为有了类这个东西,所以函数就可以物以类聚了。有的函数属于私有函数只能这个类里面才能调用,有的函数属于公有函数可以供外部调用。
但是我那时候使用类还很初级,往往是一个源代码文件中就定义一个类。而且类也没有使用继承,也就是说我所有的类都是平行的,类和类之间通过 Public 型的公开函数调用才产生了关系。
三、面向接口
Delphi 这个开发语言是优美的,它的定义申明和它的详细实现是分离的。
业务功能进一步复杂起来了,过去没什么太多关系的业务现在关系越来越紧密了,有些类和类之间的调用就太多了。我就想着重写这块代码,把这两个类进行合并了。但一重写吧,需要动的东西太多了。
用继承、用多重继承的方法来做吧,太麻烦,总要在实现里写一个空函数(就是没有代码但只有函数架子的,以备编译器能语法通过)。后来认识了接口,就用接口定义了,就不使用空函数了,就定义,不实现,编译器照样能通过。
四、面向组件
我是完整经历过面向组件时期的,并且用面向组件技术编写过一整代完整的 ERP 引用套件。从 CORBA 技术到 COM/DCOM/COM+技术都娴熟学习并使用过。我也是完整经历单机版本到 C/S 客户端服务器端局域网版本到 C/S/S 三层架构的。
一开始我用 DBaseIII 写应用,UI 开发、业务逻辑开发、数据库开发都是一个开发语言搞定。
后来用 Delphi 写 C/S 应用,就用了 SQLServer 大型关系数据库,在数据库层就写了不少存储过程和定时 JOB 任务。但当时业务逻辑代码和 UI 代码都是运行在客户端,所以这两层之间的分离也并不清晰。
然后写 C/S/S 三层架构,业务逻辑层独立出来,而且是物理独立部署,这样客户端代码和业务逻辑层代码就必须要彻底分开,不能不清不楚地混杂在一起了。在那个时候,我才开始大量使用精心的接口设计、对象设计。
因为有了独立的业务逻辑层,那么这些代码(接口/类)何时创建对象实例,何时释放,这些对象实例要运行在哪个进程容器中,就有了要求了。因而就产生了组件容器和组件。组件容器来管理组件的全生命周期(安全、创建、并发访问控制、休眠、激活唤醒、计数、摧毁释放内存),组件管理器就来管理组件的注册、发现等。
所以《COM 本质论》的作者 Don Box 说.NET 就是更好的 COM,我一下子明白了:对啊,微软的意思是,以后所有的应用都应该运行在组件容器中,不管是单机应用,还是 C/S 应用,还是 C/S/S 应用,每个应用都要运行在组件容器中,由组件容器来屏蔽和管理内存的创建与回收,不要把内存的创建与释放直接袒露给开发者,否则开发者技术能力水平不一,有的烂的程序员管理不好内存,很容易就会使应用占满内存并导致操作系统崩溃。