《C++代码设计与重用》——1.3 重用的障碍

1.3 重用的障碍

C++代码设计与重用
1.3 重用的障碍
事实上重用是很难实现的—存在着非技术上和技术上的障碍。非技术上的障碍是指诸如组织结构、社会结构、程序设计文化等阻碍重用的事物。技术障碍是指程序设计本身阻碍重用的各种因素。

1.3.1 非技术障碍

为了理解重用的非技术障碍,我们来考虑重用对C++程序员自身的影响。例如,程序员在一个函数库里设计一个名为Widget的类。

类Widget的设计者应该怀疑设计可重用的Widget类是否会有用处

因为使代码能够被重用是需要时间和精力的,所以大多数程序员如果觉得他们的努力是没有价值的,就不愿意编写可重用代码。

类Widget的设计者由于编写和提供可重用代码应该有望得到回报和奖赏

因为花费时间和精力的事情如果不能得到回报,一般是不会有人愿意做的。但遗憾的是,编写可重用代码,程序员有时非但不能得到回报,而且还受到(一般是无意的)责难。

假定有两个程序员—Pat和Chris—在某家大公司的某个部门工作。Pat总是能够按时完成她的任务,但她编写的代码只有她个人或她所处的项目小组成员可以重用。而Chirs花更多的时间编写可供整个公司所有程序员重用的代码。整个公司的程序员由于使用了Chris的代码将大大节约开发时间,但Chris往往因此而不能按时完成任务。于是,如果Pat和Chris的部门只注重于个人是否可以按时完成任务的话,那么Chris得到的将不会是奖赏,而是处罚。

必须有人来维护类Widget

一段可重用代码越是成功,越需要花更多的时间来维护;维护包括修改代码的错误,改写代码使它符合新的要求等。如果Chris的代码能够在整个公司使用,那么她将花费大量的时间来回答有关代码的问题,分发代码和不断发展这段可重用代码。维护一段成功的可重用代码的所有时间可能要比编写这段代码的时间还要多;所以,如果维护可重用代码毫无回报的话,那么重用也只能昙花一现。

类Widget(假设已经设计成可重用的)的最终用户应该觉察到Widget的存在性和可获得性

一个大程序需要很多可重用的代码段,但在整个世界里搜寻符合要求的可重用代码将会花费很多时间。所以程序员有时应该质疑搜寻一段特殊的可重用代码的成功率。

很明显,一个组织应该公布它的可重用代码(或者向内公布,或者向外公布,这依赖于它希望有多少用户使用这些代码段)。程序库必须提供足够的文档说明,并且提供一些可以很容易找到这些程序库和程序库里可重用代码段的工具。

类Widget的最终用户必须能够得到类Widget

得到类Widget可能只需简单地拷贝几个文件,或许可以从一张包含有类Widget源代码的光盘里获取源代码,然后再根据这些源代码中创建类Widget。遗憾的是,分发文件和创建类在实际上经常不能顺利进行,这也就成了重用的一大障碍。

类Widget的重用必须没有法律障碍

一些软件可以免费提供给任何使用它的人,另外一些软件只有当你付了费,同意和签署了许可协议和保密协议之后才能使用。这种法律的约束也阻碍了重用的发展。

类Widget的最终用户应该由于重用了类Widget而得到奖赏

一些机构(幸运的是现在已经很少了)是以程序员每天编写代码的行数来衡量程序员能力高低的。若以自己编写的代码的数量来说,重用代码的程序员是比不上没有重用代码的程序员的。因此,这种赏罚制度也扼杀了重用的发展。

当今对于重用的宣传已经引起了程序设计社区对重用潜在优点的关注,尽管有些宣传抱有过多的期望,但我们仍然希望,实现重用性潜在优点的期望会使一些组织改变对待重用的态度。他们应该是鼓励重用,而不是限制和制约重用。

1.3.2 技术障碍

重用性具有许多大大小小的技术障碍,主要的障碍如下:

可重用代码会在很多环境(context)下使用。其中,程序代码的环境是指:

使用这段代码的某个程序;
程序执行时候;代码是如何被调用的;
创建代码的平台(包括机器类型、系统接口和可用资源等);
外层代码执行的平台(外层代码指本身包含这段可重用代码的那些代码)。
显然,一段代码能够在越多的环境下使用,它的重用性就越好。

我们不可能对环境信息了如指掌

可重用代码被调用时,我们对调用环境各个方面的信息都是陌生的。我们一般不能检查调用这段代码的用户程序,我们因此对程序的执行情况往往一无所知。或许我们只能在程序调用我们的代码时,估计一下代码调用需要的系统资源的情况。

用户需求经常是互相冲突的

即使我们可以通过某种方法了解到可重用代码被调用时的所有环境信息,但由于用户需求常常互相冲突,我们仍然会面临着重大的设计抉择。在这时,程序库设计者通常不得不做出某种抉择,而这种抉择往往是不能令所有的用户都感到满意的。
**
我们提供的功能不可能面面俱到**

如果我们的用户有互相冲突的需求,我们为什么不能在可重用代码里提供所有的功能呢?答案是很简单的,因为由此引起的庞大的代码实体将会导致昂贵的开发费用,而且很难使用。

环境总是不断变化的

更加糟糕的是,使用可重用代码的环境会随着时间的推移而不断变化。新用户要把这段代码用于新的程序里,老用户为适应新的需求要更改原先的程序。因此,可重用代码的设计者必须尽力预测将来可能的变化,从而编写出可以适应将来变化需求的可重用代码。但是,对将来的预测往往是非常困难的。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

时间: 2024-09-21 01:34:10

《C++代码设计与重用》——1.3 重用的障碍的相关文章

《C++代码设计与重用》导读

前言 C++代码设计与重用 一切事物都将得到检验并因此被称为问题. Edith Hamilton 这本书的主要目的在于:展示如何以C++编程语言编写可重用代码-就是说,根据不同的需要,在不经过修改,或者经过很少修改的前提下,可重用代码可以很容易地应用到5个.50个甚至500个程序当中,而且这些程序往往是不同程序员编写的,可能运行在不同的系统上.在整个阐述的过程中,我们的目的并不在于争论是否所有的代码都是可重用的,也不在于说明可重用代码能够解决所有的程序问题.显然,不论是对程序员而言,还是对可重用

《C++代码设计与重用》——2.3 Nice类

2.3 Nice类 C++代码设计与重用 2.3 Nice类 我们都知道类会提供某些函数,这些函数要么是在类的代码中被显式声明为公共的(public)或保护的(protected),要么是由编译器在程序需要这些代码时隐式生成的.例如,下面这个类: class X{ public: X(); void f(); }; 它提供了一个缺省构造函数.函数f.一个拷贝构造函数.一个赋值运算符和一个析构函数.而且最后3个函数会在程序需要它们的时候由编译器自动生成. 请考虑下面这个通常有用的函数: templ

《C++代码设计与重用》——1.5 这本书能给我们带来什么

1.5 这本书能给我们带来什么 C++代码设计与重用 1.5 这本书能给我们带来什么 编写可重用代码可以使复杂的问题变得比较简单,但编码过程是非常困难的.这本书不会也不能让这困难的过程变得格外简单,这本书也没有提供能让每个C++程序员都可以很轻松地编写出可重用代码的锦囊妙计. 针对每个希望编写出可重用代码的C++程序员,这本书的每一章都讨论了一个或者多个他们必须理解的问题.理解了这些问题虽然不能使编写可重用代码变得相当简单,但可以让编写出可重用代码成为一种可能. 这本书的其余部分的结构如下: 当

《C++代码设计与重用》——1.2 重用的神话

1.2 重用的神话 C++代码设计与重用1.2 重用的神话关于代码重用出现了许多神话(荒诞的说法),这一节我们来反驳几个比较普遍的说法. 神话1:重用可以解决软件危机 软件危机是指程序设计团体现今没有能力做到以下几点:编写解决复杂问题的程序,快速生成解决复杂问题的程序,正确编写这些程序并使这些程序的维护相当容易. 软件开发进步的迹象是显而易见的.一个很显然的迹象就是随着时间的推移,所谓的复杂问题的范围发生了改变.在20世纪60年代,编写一个FORTRAN-66编译器就被认为是一个非常复杂的问题:

《C++代码设计与重用》——1.1 什么是重用性

1.1 什么是重用性 C++代码设计与重用 1.1 什么是重用性 许多相同操作都会在多个计算机程序里重复实现,例如: 对数组元素进行排序:解答线性方程组:实现一个从X类型到Y类型的映射:解析C++代码:从数据库检索数据:和其他程序进行通信.与其在每个程序里都设计和实现上面每个操作的相同代码,我们更愿意采用的方法是:只设计和实现这些操作的代码一次,然后再把这些代码重用手不同程序里.显然,已有的可重用代码,使每个应用程序不必从头写起,因为它(可重用代码)大大加速了应用程序的开发,并且减少了编写和维护

《C++代码设计与重用》——2.7 转型

2.7 转型 C++代码设计与重用2.7 转型程序库设计者必须充分重视隐式转型(implicit conversion).在C++中,有两种方法可以用来定义从类型From到类型To的隐式转型.第一种,我们可以在类To中定义一个只含一个参数的构造函数(并且没有其他的缺省参数): class To { public: To(const From&); //或者是To(From) //... }; 或者,我们可以在类From中定义一个转型操作: class From { public: operato

《C++代码设计与重用》——2.9 总结

2.9 总结 C++代码设计与重用2.9 总结正规函数-拷贝构造函奴.析构函数.基本赋值运算符.相等运算符和不等运算符-在所有的类中都应该实现相同的语义. 尽管没有最小标准接口,但是nice函数-缺省构造函数.拷贝构造函数.赋值运算符和相等运算符-应该是大多数类都提供的函数.没有任何函数是所有的类都应该提供的函数:而且,绝大多数类都不应该提供浅拷贝和深拷贝操作. 对程序库中类的接口一致性,我们应该给予充分的重视.但是当一致性使类的接口变得很不适当或者不直观时,我们就不能一味顽固地坚持这种一致性.

《C++代码设计与重用》——2.2 正规函数

2.2 正规函数 C++代码设计与重用2.2 正规函数对所有提供它们的类而言,某些函数应该具有相同的语义.考虑类Rational的拷贝构造函数: class Rational { public: Rational(const Rational& r); //... }; 上面的操作将会构造一个Rational对象,它的值等同于对象r的值(我们所说的值总是指抽象值).我们认为,每个类的拷贝构造函数都应该具有这样的语义,就是构造一个和它的参数等值的对象.尽管C++没有-也不能-强制拷贝构造函数遵循这

《C++代码设计与重用》——2.5 浅拷贝和深拷贝

2.5 浅拷贝和深拷贝 C++代码设计与重用2.5 浅拷贝和深拷贝有两个操作,尽管它们具有某些不合乎需要的特性,但因为它们的使用范围很广,进而博得一定的注意,所以这两个操作在这里有必要特别提及一下,这两个操作就是浅拷贝操作和深拷贝操作.x对象的浅拷贝是指:另一个和x相同类型的,并且它的数据成员和x相对应的数据成员具有相同值的对象.x对象的深拷贝是指:另一个和x类型相同的对象,它具有x直接或间接指向的对象的一份拷贝,并且在拷贝里,所有共享和循环的联系依旧保留.考虑下面3个类: class Z {

《C++代码设计与重用》——第1章 重用性介绍

第1章 重用性介绍 C++代码设计与重用程序库是聪明的程序员最好的咨询室. -George Dawson 在介绍重用性的这一章里,我们先描述什么是重用性,其中特别着重讨论代码提取技术.因为代码(仅供参考)提取是重用的原始形式,也正是它的不足促使我们对可重用代码下定义.接着我们反驳一些有关重用性的神话(对重用性错误的理解),并列举了阻碍重用性发展的障碍-技术性的和非技术性的.最后,我们对有志于编写可重用代码的程序员提出若干期望. 本文仅用于学习和交流目的,不代表异步社区观点.非商业转载请注明作译者