类,还是函数?

这是昨天(?)和杰弗里·马交谈的时候提出的一个话题,完整的问题是,在设计一个系统(例如操作系统)的时候,向外提供的接口是采用类的方式好,还是采用函数的方式好?在此之前,我不是没有想过这个问题,不过却可以肯定地说,没有认真地,深入地思考这个问题,因为我的心里一直是存在着固定的一个答案的。我一直认为,在接口的设计上采用函数是一种更好的选择。但是杰弗里·马问我:为什么?

是的,为什么呢?
我觉得,不外乎以下几个原因。

首先,人们更习惯于使用函数的方式。函数是过程式编程语言中所采用的最常见的功能块之间的交互方式。在这里,函数这一名词采用其最宽泛的含义,也即该术语在 C 语言中的定义,同时包括了其他语言中所使用的过程/函数/子函数/子例程等术语的含义。因而,函数这种方式被广泛地应用于 C、Pascal、Basic 甚至宏汇编语言中。它是程序员最常见的,最惯用的编程方式,其中惯用,包括了惯于使用和惯于使用此方式实现两个方面。

其次,函数的使用要比类的使用更加简单。相比较而言,函数的使用要远简单于类的使用,这是由类的本质决定的。类是面向对象思想的代表产物,其中心思想也充分体现着面向对象设计的精神:以数据为中心,进行基于数据之上的操作的集中封装。然而也正因为此,通常一个类的复杂度要高于一个单一的函数,类中的数据与方法之间的耦合以及不同方法间的耦合性通常会较大,导致完全了解一个类甚至仅是一个类的方法的工作量都要远远大于了解一个函数的工作量。

另外一个很重要的原因是,由于类对象的内存布局(如何安排类的成员变量以及虚函数表的指针等的位置)等原因,类的改动会给类的使用者在无意之中带来巨大的麻烦,通常是需要随着类自身的改动而重新编译已有的程序,否则的话,后果一般都是程序的立即崩溃。

最后,函数的形式更适合不同种类的语言之间进行调用。进入到 Windows 时代后,动态链接库的形式越来越被广大的程序员所使用,而同时,运行于 Windows 之上的开发语言的种类要远远超过运行于其它平台的语言。

此处仅就编译型的开发语言而言。在 UNIX 系统上虽然也有相当丰富的开发语言,但除了 C/C++ 之外绝大多数都是脚本语言,而且对其他模块的调用也通常使用 C/C++ 作为桥梁;与之不同的是,Windows 平台上有许多编译型语言,除了 C/C++,最常见的编译型语言大概就是 Pascal 了,Borland 公司的 Delphi 产品是采用该语言的最著名的集成开发环境。甚至连 Basic 这种老牌的解释型语言都在微软的不断努力下在 Visual Basic 5.0 的时候几乎成为了编译型语言。

这些语言无论是调用系统的 API 还是其他的模块,大都是以动态链接库的形式进行调用的。由于 C++ 编译器的历史原因,编译之后的类的成员的命名在不同的编译器之间存在非常大的差异,而同时 C++ 标准本身在这一方面又从来没有给出过指导性的统一规范,从而导致在符号查找上存在着几乎是难以克服的障碍。

其实,也正是因为 C++ 类的这些固有问题,才导致以对象形式复用代码的技术形成为 COM(或者类似 COM 的技术,如 Mozilla 工程中的 XPCOM,Symbian 系统中的 ECOM,以及庞大的 Corba) 这种形态。所以,在了解了 COM 的基本规则之后,如果能弄清楚为什么会要采用这样的规则,会使你深入地明了以上所述的内容。

如果有时间,下次讨论以下话题:在实现的时候如何兼取类和函数二者的优点?

附:仓促写成,恐有不周,请大家指教。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注