在现实的大多数项目中,我们都在考虑着软件重用的问题,因为这是在软件开发中无法避免的一个很现实的问题,也是一个很让人的头疼的问题。下面是我对软件重用的非常个人的理解,仅作参考。
软件重用可分为两个层次,一个层次是设计上的重用,另外一个层次是代码级的重用,而代码级的重用上又可分细分为两个层次,一个是基于源代码的重用,另外一个是基于组件的重用。
无论是以往的瀑布型开发模式还是现在比较流行的敏捷开发,无不体现了“设计先行”的观点,虽然敏捷更注重代码,但是也还是强调简单设计。设计上的重用往往体现在对一个事物或领域的知识的重用。比如我们设计了一个排版系统,我们希望重用的可能就是其中的排版规则以及和排版领域相关的核心概念,不同的排版系统都可重新利用这些核心规则和概念建立其自己的系统。因为这种重用方式非常抽象,因此它的重用度是最高的,与此同时也是最难的。MDA就突出地强调了在设计层面的重用。
其实,在现实的项目中,我们提到的重用往往都是代码级的重用。不同的平台对于重用的观点上是不一样的,COM和.NET平台更多地是强调组件级的重用,而STL更多地是强调源码级的重用。两者没有孰优孰劣的说法,在不同的项目中两者都各有千秋。
但是源码级重用的一个最大的缺点就是它被编程语言所约束,比如说STL代码就只能被C++程序所使用。而基于组件的重用就有所不同,.NET强调了平台的统一,因此C#编写的一个组件就可被VB.NET或VC++/CLI程序所复用。从这个角度来说,.NET更多地强调的组件级的重用,因此组件级的重用要求平台的统一。目前.NET就实现了不同的程序设计语言架构在同一个平台上,那就是CLI,如C++/CLI、Python/CLI等。
微软从 COM 到 .NET 一直都在坚持着组件级重用的思想,这是一个趋势,毕竟源代码重用是有很多缺陷的,同时设计级的重用难度太高。现在一些组织也在朝着这个方向努力,但是目前的成效并不是太明显。因此,就目前来说,我们应该更多地关注组件级的重用。