??xml version="1.0" encoding="utf-8" standalone="yes"?>
以下是一个典型的多层体系l构图?br>
首先我们?#8220;订单(Order)”ZQ进行一个简单的业务分解?br>
1. 订单自然包括订单的内?OrderInfo)Q其中有诸如订单~号、商品名U、数量,以及(qing)金额{信息?br>2. 有了(jin)订单信息Q我们还需要一个存储订单的场所Q那么自焉要有个操作读写的对象(OrderAccess)?br>3. Z(jin)外界能进行相关的订单操作Q我们还需要有个业务逻辑对象(Order)Q它提供创徏新订单,向订单插?删除商品Q保存订单等操作?br>
通过上面的分析,我们基本上可以将一个业务逻辑完整地分割ؓ(f)Q?br>
业务实体 ---> OrderInfo
数据讉K ---> OrderAccess
业务逻辑 ---> Order
Zpȝ架构考虑Q我们将q些对象分别攄在不同的逻辑单元中,q些逻辑单元?yu)q成了(jin)“多层”?br>
业务实体?Model) ---> 业务实体 ---> OrderInfo
数据讉K?DAL) ---> 数据讉K ---> OrderAccess
业务逻辑?BLL) ---> 业务逻辑 ---> Order
同样以上面订单ؓ(f)例,我们q一步讲q各层对象的实现l节?br>
1. 客户基本上只依赖?Order ?OrderInfoQ通过他们可以操作业务的全部Q它q不兛_业务存储{细节?br>
2. 大多数时候我们会(x)?OrderAccess 设计?Internal Protected 方式QOrderAccess 可以是一个抽象类或者接口。我更习(fn)惯于其实现为抽象类Q因为某些方法是调用其他Ҏ(gu)来实现的Q抽象类的设计可以减实现类的代码数量。另外将该抽象类设计成工厂方法模式,通过 IoC 或?"配置反射" 来获得具体的实现c,可以减少层之间的耦合Q也便于数据pȝ的替换?br>
3. Order 多数时候可以实Cؓ(f) Singleton 或者静态类Q它只是提供?jin)一pd的方法来操作某些逻辑Q通过接受 OrderInfo 参数来获取信息。其本n无需保存M状态。如果需要实现购物RQ只需?OrderInfo 存储?Session 之中卛_?br>
通过上面的例子,我们q可以发现多层的另外一个好处就是更利于团队协作开发。架构设计h员无需考虑具体的数据库实现代码Q而将设计重点攑֜业务层面Q数据库开发h员自然也可将重心攑֜数据库访问优化上。团队成员之间不再是一责一个业务模块,不再有了(jin) n 个数据访问类Q不再有 n U不同的对象模式{等。从传统?"瓦罐作坊" 演变?"工业水U?Q更利于Ҏ(gu)技术能力和业务熟?zhn)度的差别来划分不同的角色?br>
以下是一个典型的多层体系l构图?br>
首先我们?#8220;订单(Order)”ZQ进行一个简单的业务分解?br>
1. 订单自然包括订单的内?OrderInfo)Q其中有诸如订单~号、商品名U、数量,以及(qing)金额{信息?br>2. 有了(jin)订单信息Q我们还需要一个存储订单的场所Q那么自焉要有个操作读写的对象(OrderAccess)?br>3. Z(jin)外界能进行相关的订单操作Q我们还需要有个业务逻辑对象(Order)Q它提供创徏新订单,向订单插?删除商品Q保存订单等操作?br>
通过上面的分析,我们基本上可以将一个业务逻辑完整地分割ؓ(f)Q?br>
业务实体 ---> OrderInfo
数据讉K ---> OrderAccess
业务逻辑 ---> Order
Zpȝ架构考虑Q我们将q些对象分别攄在不同的逻辑单元中,q些逻辑单元?yu)q成了(jin)“多层”?br>
业务实体?Model) ---> 业务实体 ---> OrderInfo
数据讉K?DAL) ---> 数据讉K ---> OrderAccess
业务逻辑?BLL) ---> 业务逻辑 ---> Order
同样以上面订单ؓ(f)例,我们q一步讲q各层对象的实现l节?br>
1. 客户基本上只依赖?Order ?OrderInfoQ通过他们可以操作业务的全部Q它q不兛_业务存储{细节?br>
2. 大多数时候我们会(x)?OrderAccess 设计?Internal Protected 方式QOrderAccess 可以是一个抽象类或者接口。我更习(fn)惯于其实现为抽象类Q因为某些方法是调用其他Ҏ(gu)来实现的Q抽象类的设计可以减实现类的代码数量。另外将该抽象类设计成工厂方法模式,通过 IoC 或?"配置反射" 来获得具体的实现c,可以减少层之间的耦合Q也便于数据pȝ的替换?br>
3. Order 多数时候可以实Cؓ(f) Singleton 或者静态类Q它只是提供?jin)一pd的方法来操作某些逻辑Q通过接受 OrderInfo 参数来获取信息。其本n无需保存M状态。如果需要实现购物RQ只需?OrderInfo 存储?Session 之中卛_?br>
通过上面的例子,我们q可以发现多层的另外一个好处就是更利于团队协作开发。架构设计h员无需考虑具体的数据库实现代码Q而将设计重点攑֜业务层面Q数据库开发h员自然也可将重心攑֜数据库访问优化上。团队成员之间不再是一责一个业务模块,不再有了(jin) n 个数据访问类Q不再有 n U不同的对象模式{等。从传统?"瓦罐作坊" 演变?"工业水U?Q更利于Ҏ(gu)技术能力和业务熟?zhn)度的差别来划分不同的角色?br>
在WWW中,“客户”?#8220;服务?#8221;是一个相对的概念Q只存在于一个特定的q接期间Q即在某个连接中的客户在另一个连接中可能作ؓ(f)服务器。WWW服务器运行时Q一直在TCP80端口(WWW的缺省端?监听Q等待连接的出现?br> 下面Q讨论HTTP协议下客?服务器模式中信息交换的实现。 1.建立q接 q接的徏立是通过甌套接?Socket)实现的。客h开一个套接字q把它约束在一个端口上Q如果成功,q当于建立?jin)一个虚拟文件。以后就可以在该虚拟文g上写数据q过|络向外传送?br> 2.发送请?br> 打开一个连接后Q客h把请求消息送到服务器的停留端口上,完成提出h动作?br> HTTP/1.0 h消息的格式ؓ(f)Q?br> h消息=h?通用信息|h头|实体?CRLF[实体内容]
h ?Ҏ(gu) hURL HTTP版本受CRLF
斏V ?GET|HEAD|POST|扩展Ҏ(gu)
U R L=协议名称+宿主?目录与文件名
h行中的方法描q指定资源中应该执行的动作,常用的方法有GET、HEAD和POST。不同的h对象对应GET的结果是不同的,对应关系如下Q?br> 对象 GET的结?br> 文g 文g的内?br> E序 该程序的执行l果
数据库查询 查询l果
HEAD——要求服务器查找某对象的元信息,而不是对象本w?br> POST——从客户机向服务器传送数据,在要求服务器和CGI做进一步处理时?x)用到POSTҎ(gu)。POST主要用于发送HTML文本中FORM的内容,让CGIE序处理?br> 一个请求的例子为:(x)
GEThttp://networking.zju.edu.cn/zju/index.htmHTTP/1.0
头信息又UCؓ(f)元信息,即信息的信息Q利用元信息可以实现有条件的h或应{?br> h头——告诉服务器怎样解释本次hQ主要包括用户可以接受的数据cd、压~方法和语言{?br> 实体头——实体信息类型、长度、压~方法、最后一ơ修Ҏ(gu)间、数据有效期{?br> 实体——请求或应答对象本n?br> 3.发送响?br> 服务器在处理完客L(fng)h之后Q要向客h发送响应消息?br> HTTP/1.0的响应消息格式如下:(x)
响应消息=状态行(通用信息头|响应头|实体? CRLF 〔实体内宏V?br> 状态行=HTTP版本受状态码 原因叙述
状态码表示响应cd
1×× 保留
2×× 表示h成功地接?br> 3×× 为完成请求客户需q一步细化请?br> 4×× 客户错误
5×× 服务器错?br> 响应头的信息包括Q服务程序名Q通知客户h的URL需要认证,h的资源何时能使用?br> 4.关闭q接
客户和服务器双方都可以通过关闭套接字来l束TCP/IP对话
是按某种序讉K二叉?wi)中的每个结点一ơ且仅一ơ的q程。这里的讉K可以是输出、比
较、更新、查看元素内容等{各U操作?br>
二叉?wi)的遍历方式分?f)两大c:(x)一cL栏V左子树(wi)和右子树(wi)三个部分q行讉KQ另一cL
层次讉K。下面我们将分别q行讨论?/p>
1?按根、左子树(wi)和右子树(wi)三部分进行遍?
遍历二叉?wi)的序存在下?U可能:(x)
TLRQ根左右Q? TRLQ根叛_Q?/p>
LTRQ左根右Q? RTLQ右根左Q?/p>
LRTQ左xQ? RLTQ右左根Q?/p>
其中QTRL、RTL和RLT三种序在左叛_?wi)之间均是先叛_?wi)后左子树(wi),q与Z先左后右
的习(fn)惯不同,因此Q往往不予采用。余下的三种序TLR、LTR和LRTҎ(gu)根访问的位置不同分别
被称为先序遍历、中序遍历和后序遍历?/p>
Q?Q先序遍?/p>
若二叉树(wi)为空Q则l束遍历操作Q否?/p>
讉K根结点;
先序遍历左子?wi)?/p>
先序遍历叛_?wi)?/p>
Q?Q中序遍历若二叉?wi)?f)I,则结束遍历操作;否则
中序遍历左子?wi)?/p>
讉K根结点;
中序遍历叛_?wi)?/p>
Q?Q后序遍?/p>
若二叉树(wi)为空Q则l束遍历操作Q否?/p>
后序遍历左子?wi)?/p>
后序遍历叛_?wi)?/p>
讉K根结炏V?/p>
例如。以下是一二叉树(wi)?qing)其l过三种遍历所得到的相应遍历序?/p>
二叉?wi)的两种遍历?gu)Q?/p>
Q?Q对一二叉树(wi)中序遍历Ӟ若我们将二叉?wi)严格地按左子?wi)的所有结点位于根l点的左
侧,叛_?wi)的所有结点位于根右侧的Ş式绘Ӟ可以对每个l点做一条垂U,映射C面的
水^U上Q由此得到的序是该二叉树(wi)的中序遍历序?br>
Q?QQ何一二叉树(wi)都可以将它的外部轮廓用一条线l制出来Q我们将它称Z叉树(wi)的包U,
q条包线对于理解二叉?wi)的遍历q程很有用?/p>
由此可以看出Q(1Q遍历操作实际上是将非线性结构线性化的过E,其结果ؓ(f)U性序列,
q根据采用的遍历序分别UCؓ(f)先序序列、中序序列或后序序列Q(2Q遍历操作是一个递归?/p>
q程Q因此,q三U遍历操作的法可以用递归函数实现?/p>
Q?Q先序遍历递归法
void PreOrder(BTree BT) {
if (BT) { Visit(BT);
PreOrder(BT->Lchild);
PreOrder(BT->Rchild);
}
Q?Q中序遍历递归法
void InOrder(BTree BT) {
if (BT) {
InOrder(BT->Lchild);
Visit(BT);
InOrder(BT->Rchild);
}
}
Q?Q后序遍历递归法
void PostOrder(BTree BT) {
if (BT) {
PostOrder(BT->Lchild);
PostOrder(BT->Rchild);
Visit(BT);
}
}
2 、按层次遍历二叉?/strong>
实现Ҏ(gu)Z上层C层,每层中从左侧到右侧依ơ访问每个结炏V下面我们将l出一?/p>
二叉?wi)?qing)其按层次序讉K其中每个l点的遍历序列?br>
void LevelOreder(QBTree BT) {
for (i=1;i<=BT.n;i++)
if (BT.elem[i]!='#') Visite(BT.elem[i]);
}
二叉?wi)用铑ּ存储l构表示Ӟ按层遍历的算法实?/p>
讉Kq程描述如下Q?/p>
讉K根结点,q将该结点记录下来;
若记录的所有结炚w已处理完毕,则结束遍历操作;否则重复下列操作?/p>
取出记录中第一个还没有讉K孩子的结点,若它有左孩子Q则讉K左孩子,q将记录下来Q?/p>
若它有右孩子Q则讉K叛_子,q记录下来?/p>
在这个算法中Q应使用一个队列结构完成这Ҏ(gu)作。所谓记录访问结点就是入队操作;
而取录的l点是出队操作。这样一来,我们的算法就可以描述成下列Ş式:(x)
Q?Q访问根l点Qƈ根l点入队Q?/p>
Q?Q当队列不空Ӟ重复下列操作Q?/p>
从队列退Z个结点;
若其有左孩子Q则讉K左孩子,q将其左孩子入队Q?/p>
若其有右孩子Q则讉K叛_子,q将其右孩子入队Q?/p>
void LevelOrder(BTree *BT) {
if (!BT) exit;
InitQueue(Q); p=BT; //初始?br> Visite(p); EnQueue(&Q,p); //讉K根结点,q将根结点入?br> while (!QueueEmpty(Q)) { //当队非空旉复执行下列操?br> DeQueue(&Q,&p); //出队
if (!p->Lchild) {Visite(p->Lchild);EnQueue(&Q,p->Lchild); //处理左孩?br> if (!p->Rchild) {Visite(p->Rchild);EnQueue(&Q,p->Rchild); //处理叛_?br> }
}
五?strong>典型二叉?wi)的操作?/strong>
1?输入一个二叉树(wi)的先序序列,构造这二叉树(wi)
Z(jin)保证唯一地构造出所希望的二叉树(wi)Q在键入q棵?wi)的先序序列Ӟ需要在所有空二叉
?wi)的位置上填补一个特D的字符Q比如,'#'。在法中,需要对每个输入的字W进行判
断,如果对应的字W是'#'Q则在相应的位置上构造一늩二叉?wi);否则Q创Z个新l?/p>
炏V整个算法结构以先序遍历递归法为基Q二叉树(wi)中结点之间的指针q接是通过指针
参数在递归调用q回时完成?/p>
法Q?/p>
BTree Pre_Create_BT( ) {
getch(ch);
if (ch=='#') return NULL; //构造空?br> else { BT=(BTree)malloc(sizeof(BTLinklist)); //构造新l点
BT->data=ch;
BT->lchild =Pre_Create_BT( ); //构造左子树(wi)
BT->rchild =Pre_Create_BT( ); //构造右子树(wi)
return BT;
}
}
2?计算一二叉树(wi)的叶子结Ҏ(gu)?/strong>
q个操作可以使用三种遍历序中的M一U,只是需要将讉K操作变成判断该结Ҏ(gu)?/p>
为叶子结点,如果是叶子结点将累加器加1卛_。下面这个算法是利用中序遍历实现的?/p>
法Q?/p>
void Leaf(BTree BT,int *count) {
if (BT) {
Leaf(BT->child,&count); //计算左子?wi)的叶子l点个数
if (BT->lchild==NULL&&BT->rchild==NULL) (*count)++;
Leaf(BT->rchild,&count); //计算叛_?wi)的叶子l点个数
}
}
3?交换二叉?wi)的左右子?wi)
许多操作可以利用三种遍历序的Q何一U,只是某种遍历序实现h更加方便一
些。而有些操作则不然Q它只能使用其中的一U或两种遍历序。将二叉?wi)中所有结点的左右
子树(wi)q行交换q个操作属于这cLc(din)?/p>
法Q?/p>
void change_left_right(BTree BT) {
if (BT) {
change_left_right(BT->lchild);
change_left_right(BT->rchild);
BT->lchild<->BT->rchild;
}
}
4 、求二叉?wi)的高?/strong>
q个操作使用后序遍历比较W合Z求解二叉?wi)高度的思维方式。首先分别求出左叛_?
的高度,在此基础上得|(wi)的高度,卛_叛_?wi)较大的高度值加1?/p>
法Q?/p>
int hight(BTree BT) { //h1和h2分别是以BT为根的左叛_?wi)的高?br> if (BT==NULL) return 0;
else {
h1=hight(BT->lchild);
h2=hight(BT->right);
return max{h1,h2}+1;
}
}
六?strong>?wi)、森林与二叉?wi)的转?/strong>
1??wi)、森林{换成二叉?/strong>
一|(wi)转换成二叉树(wi)的方法:(x)
一|(wi)转换成二叉树(wi)实际上就是将q棵?wi)用孩子兄弟表示法存储即可,此时Q树(wi)中的?/p>
个结Ҏ(gu)多有两个指针Q一个指针指向第一个孩子,另一个指针指向右侧第一个兄弟。当你将
q两个指针看作是二叉?wi)中的左孩子指针和孩子右指针Ӟ是一二叉树(wi)?jin)?/p>
特点Q一|(wi)转换成二叉树(wi)后,根结Ҏ(gu)有右孩子?/p>
森林{换成二叉?wi)的?gu)与一|(wi)转换成二叉树(wi)的方法类|只是把森林中所有树(wi)的根
l点看作兄弟关系Qƈ对其中的每棵?wi)依依地q行转换?/p>
2 、二叉树(wi)q原成树(wi)或森?/strong>
q个q程实际上是?wi)、森林{换成二叉?wi)的逆过E,卛_该二叉树(wi)看作是树(wi)或森林的孩子
兄弟表示法。比如,若二叉树(wi)为空Q树(wi)也ؓ(f)I;否则Q由二叉?wi)的根结点开始,延右指针向下
赎ͼ直到为空Q途经的结点个数是相应林所含树(wi)的棵敎ͼ若某个结点的左指针非I,说明q?/p>
个结点在?wi)中必有孩子Qƈ且从二叉?wi)中该结点左指针所指结点开始,延右指针向下赎ͼ直到
为空Q途经的结点个数就是这个结点的孩子数目?/p>
lg Q?数据和功能一起在q行着的计机E序中Ş成的单元Q组件在 OOP 计算机程序中是模块和l构化的基础?
抽象?Q?E序有能力忽略正在处理中信息的某些方面,卛_信息主要斚wx的能力?
装 Q?也叫做信息封装:(x)保lg不会(x)以不可预期的方式改变其它lg的内部状态;只有在那些提供了(jin)内部状态改变方法的lg中,才可以访问其内部状态。每c?/font>lg都提供了(jin)一个与其它lg联系的接口,q规定了(jin)其它lgq行调用的方法?
多态?Q?lg的引用和c集?x)涉及(qing)到其它许多不?a target=_new>cd的组Ӟ而且引用lg所产生的结果得依据实际调用的类型?
l承?Q?允许在现存的lg基础上创建子cȝӞq统一q增Z(jin)多态性和装性。典型地来说是用类来对lgq行分组Q而且q可以定义新cMؓ(f)现存的类的扩展,q样可以将cȝl成?wi)Ş或网状结构,q体C(jin)动作的通用性?
׃抽象性、封装性、重用性以?qing)便于用等斚w的原因,以组件ؓ(f)基础的编E在脚本语言中已l变得特别流行。Python ?Ruby 是最q才出现的语aQ在开发时完全采用?OOP 的思想Q而流行的 Perl 脚本语言从版?开始也慢慢地加入了(jin)新的面向对象的功能组件。用lg代替“现实”上的实体成ؓ(f) JavaScriptQECMAScriptQ?得以行的原因,有论证表明对lgq行适当的组合就可以在英特网上代?HTML ?XML 的文档对象模型(DOMQ?nbsp;
一、oop的基本思想
OOP的许多原始思想都来之于Simula语言Qƈ在Smalltalk语言的完善和标准化过E中得到更多的扩展和对以前的思想的重新注解。可以说OO思想和OOPL几乎是同步发展相互促q的。与函数?a target=_new>E序设计Qfunctional-programmingQ和逻辑式程序设计(logic-programmingQ所代表的接q于机器的实际计模型所不同的是QOOP几乎没有引入_的数学描叙,而是們于徏立一个对象模型,它能够近似的反映应用领域内的实体之间的关p,其本质是更接q于一Uhc认知事物所采用的哲学观的计模型。由此,D?jin)一个自然的话题Q那是OOP到底是什么?[D&T 1988][B.S 1991] .。在OOP中,对象作ؓ(f)计算MQ拥有自q名称Q状态以?qing)接受外?a target=_new>消息的接口。在对象模型中,产生新对象,旧对象销毁,发送消息,响应消息构成OOP计算模型的根本?/p>
对象的生有两种基本方式。一U是以原型(prototypeQ对象ؓ(f)基础产生新的对象。一U是以类Q?a target=_new>classQؓ(f)基础产生新对象。原型的概念已经在认知心理学中被用来解释概念学习(fn)的递增Ҏ(gu),原型模型本n是企图通过提供一个有代表性的对象为基来生各U新的对象,q由此l生更W合实际应用的对象。而原?委托也是OOP中的对象抽象Q代码共享机制中的一U。一个类提供?jin)一个或者多个对象的通用性描叙。从形式化的观点看,cMcd有关Q因此一个类相当于是从该cM产生的实例的集合。而这L(fng)观点也会(x)带来一些矛盾,比较典型的就是在l承体系下,子集Q子c)(j)对象和父集(父类Q对象之间的行ؓ(f)相融性可能很难达刎ͼq也是OOP中常被引用的---子类型(subtypeQ不{于子类QsubclassQ[Budd 2002]。而在一U所有皆对象的世界观背景下,在类模型基础上还诞生Z(jin)一U拥有元c(metaclassQ的新对象模型。即cLw也是一U其他类的对象。以上三U根本不同的观点各自定义?jin)三U基于类Qclass-basedQ?Z原型Qprototype-basedQ和Z元类Qmetaclass-basedQ的对象模型。而这三种对象模型也就D?jin)许多不同?a target=_new>E序设计语言Q如果我们暂时把静态与动态的差别攑֜一边)(j)。是的,我们l常接触的C++,Java都是使用Zcȝ对象模型Q但除此之外q有很多我们所没有接触的OOPL采用?jin)完全不一L(fng)对象模型Q他们是在用另外一U观点诠释OOP的内c(din)?/p>
什么是oop的基本思想呢?把组件的实现和接口分开Qƈ且让lgh多态性。不q,两者还是有Ҏ(gu)的不同。oop在程序构造中语言要素的语法。你必须得承,使用c,使用对象Q对象传递消息。gp不关心你l承或是不承,它的开端是分析产品的分c,有些什么种c,他们的行为如何。就是说Q两件东西相{意味着什么?怎样正确地定义相{操作?不单单是相等操作那么单,你往深处分析׃(x)发现“相等”q个一般观忉|味着两个对象部分Q或者至基本部分是相等的,据此我们可以有一个通用的相{操作。再说对象的U类。假讑֭在一个顺序序列和一l对于顺序序列的操作。那么这些操作的语义是什么?从复杂度权衡的角度看Q我们应该向用户提供什么样的顺序序列?该种序列上存在那些操作?那种排序是我们需要的Q只有对q些lg的概念型分类搞清楚了(jin)Q我们才能提到实现的问题Q用模ѝ承还是宏Q用什么语a和技术?gp的基本观Ҏ(gu)把抽象的软glg和它们的行ؓ(f)用标准的分类学分c,出发点就是要建造真实的、高效的和不取决于语a的算法和数据l构。当然最l的载体q是语言Q没有语a没法~程。stl使用c++Q你也可以用ada来实玎ͼ用其他的语言来实C行,l果?x)有所不同Q但基本的东西是一L(fng)。到处都要用C分查扑֒排序Q而这是Z正在做的。对于容器的语义Q不同的语言?x)带来轻微的不同。但是基本的区别很清楚是gp所依存的语义,以及(qing)语义分解。例如,我们军_需要一个组件swapQ然后指个组件在不同的语a中如果工作。显焉Ҏ(gu)语义以及(qing)语义分类。而oop所的(我认为是q分的)(j)是清楚的定义cM间的层次关系。oop告诉?jin)你如何建立层次关系Q却没有告诉你这些关pȝ实质?br>Q这D不太好理解Q有一些术语可能要q一D|间才?x)有合适的中文译——译者)(j)
面向对象的编E方法OOP是九(ji)十年代才行的一UY件编E方法。它对象?#8220;抽象”?#8220;装”?#8220;l承”?#8220;多?#8221;。我们讲E序设计是由“数据l构”+“法”l成的。从宏观的角度讲QOOP下的对象是以~程Z心的Q是面向E序的对象。我们今天要讲的OOD是面向信息的对象Q是以用户信息ؓ(f)中心的?
二、OOP技术的历史
面向对象技术最初是从面向对象的E序设计开始的Q它的出C60q代simula语言为标志?0q代中后期,面向对象E序设计逐渐成熟Q被计算机界理解和接受,Z又开始进一步考虑面向对象的开发问题。这是?ji)十q代以Microsoft VisualpdOOP软g的流行的背景?
传统的结构化分析与设计开发方法是一个线性过E,因此Q传l的l构化分析与设计Ҏ(gu)要求现实pȝ的业务管理规范,处理数据齐全Q用戯全面完整地其业务需?/font>?
传统?a target=_new>软gl构和设计方法难以适应软g生自动化的要求Q因为它以过Eؓ(f)中心q行功能l合QY件的扩充和复用能力很差?
对象是对现实世界实体的模拟,因面能更Ҏ(gu)地理解需求,即用户和分析者之间具有不同的教育背景和工作特点,也可很好地沟通?
区别面向对象的开发和传统q程的开发的要素有:(x)对象识别和抽象、封装、多态性和l承?
对象(Object)是一个现实实体的抽象Q由现实实体的过E或信息牲来定义。一个对象可被认为是一个把数据Q属性)(j)和程序(Ҏ(gu)Q封装在一L(fng)实体Q这个程序生该对象的动作或对它接受到的外界信号的反应。这些对象操作有时称为方法。对象是个动态的概念,其中的属性反映了(jin)对象当前的状态?
c?Class)用来描述h相同的属性和Ҏ(gu)的对象的集合。它定义?jin)该集合中每个对象所共有的属性和Ҏ(gu)。对象是cȝ实例?
׃分析不难看出Q尽OOP技术更看中用户的对象模型,但其目的都是以编Eؓ(f)目的的,而不是以用户的信息ؓ(f)中心的,L把用L(fng)信息U_到某个用户不感兴的“E序对象”中?
三、OOP 的优~点
· OOP 的优点:(x)使h们的~程与实际的世界更加接近Q所有的对象被赋予属性和Ҏ(gu)Q结果编E就更加富有人性化?/font>
· OOP 的也有缺点,?C++ 而言Q由于面向更高的逻辑抽象层,使得 C++ 在实现的时候,不得不做出性能上面的牺Ԍ有时候甚x致命?( 所有对象的属性都l过内置多重指针的间接引用是其性能损失的主要原因之一Q不q,W者的局限性在于未使用q?VC++ 外的面向对象语言Q所以不是十分肯定,哈哈Q有人笑出来?#8230; )?/font>
在计机速度飞速发展的今天Q你可能?x)说Q一丁点的性能牺牲没什么大不了(jin)。是的,从面向对象的角度Q的编E的l构更加清晰完整Q数据更加独立和易于理Q性能的牺牲可以带来这么多的好处,没有理由不做E的生意吧Q?/font>
不过Q在某些寚w度要求极高Ҏ(gu)场合Q例如你做的是电(sh)信的交换pȝQ每U钟有超q百万的人同时进行电(sh)话交换,如果Q每一个数据交换过E都是一个对象,那么ȝ性能损失是天文数字Q!
或者这个例子不够脓(chung)w,再D个例子吧。假如你受聘于一个游戏设计公司,老板希望做出来的游戏可以更多的兼ֈ更多?a target=_new>?sh)?/font>使用者,游戏每秒钟的q行的可以更多Q子弹和爆炸物可以更多、更华丽。那么,你会(x)发现使用 C++ ?x)你的E序变得W拙Q无法满你的需求,除非你非得要你的游戏q行于奔腑֛的机器上 ( 如果不是Q而你又坚持用 C++ 的对象编E,那么请减主角的枪的威力?)?/font>
如果你是冥顽不宁的hQ你说不怿 OOP ?x)有性能上的损失Q那么,我记得曾看到?CSDN 上关?VB ?VC 执行效率的讨论的文章Q讲q的是使用?MFC 以后Q执行效率甚至低?VB 开发出来的东西。请各位验证一下:(x)如果使用的是Ua(b)?C 语言语法的话Q那么一定会(x)比在 VB ~出来的东西要快很多 ( GetTickCount 函数可以查阅 MSDN ,如果x加精一些,可以使用 QueryPerformanceCounter 函数 )?/font>
四、OOP的未来(撰文/Bjarne Stroustrup & Tim Lindholm ~译/孟岩Q?/strong>
在未来三q_(d)E序员编写代码的方式?x)发生那些变化?/font>
Stroustrup: 在C++中,假如没有合适的库在背后支撑Q完成Q何重要的工作都可能是很复杂的。而一旦有?jin)合适的库,M东西都可以被我们操控于股掌之间。因此,构造和使用E序库的重要性与日俱增。这也暗C我们,泛型E序设计(generic programming)会(x)来多地被q用。只有通过GPQ我们才能确保库的通用性和高效率。我q预期在分布式计和“lgQcomponentsQ?#8221;应用领域?x)出现喜人的增长。就大部分程序员而言Q通过使用方便适用的程序库Q这些开发工作会(x)变得单明?jin)?/font>
现在有一个趋势,~译器厂商试图把其特有的“对象模型”和图形界?GUI)l节推销l用戗比如微软的COM和Inprise的类属?#8220;properties”。对于用h_(d)q既不必要,也不情愿。我所希望看到的程序库Q应该是用标准C++打造,界面灉|Q值得信赖的程序库。通常Q这些界面应该是q_无关的。C++的表达能力极强,即不用大量的宏,也应该以达成这一要求。就有些地Ҏ(gu)法百分之癄遵守q一原则Q也应该对于^台和厂家的依赖性限制v来。这个目标的完成情况Q可以反?a target=_new>软g工具产业对于应用E序开发行业的xE度。我怀疑目前对于那些独立的、跨q_厂商来说Qƈ不存在相应的?jng)场。如果能够徏立这L(fng)?jng)场Q也许能够促q厂商们为客户做?#8220;真正有用?#8221;产品?
Lindholm: 对于~写代码的开发者来_(d)主要的驱动力量仍是两个Q网l和分布式——也是设计和开发非单机软g的需求。大部分的应用程序将不会(x)是孤雉地运行在单一讑֤上,而是q用?jin)类?a target=_new>EJB和JSP之类技术的Q^台无关的分布式程序。程序员们将不得不面对分布式计算的重重险阅R这对许多E序员所依赖?a target=_new>设计模式、技术和直觉构成严峻的挑战。这是选择~程语言之前必须认识到的Q尽不同语a的设计特性可能促q或者阻这一转化?/font>
在网l应用的增长中,一个很重要的部分是型Ud讑֤和特DInternet讑֤的爆炸性增ѝ这些设备各有各?a target=_new>操作pȝQ或者只在某U特定的讑֤领域内有共同的操作系l。我们现在还可以一一列D些设备——家庭接入设备、蜂H电(sh)话、电(sh)子报U、PDA、自动网l设备等{。但是这些设备领域的数量和深入程度将?x)很快变得难以估量。我们都知道q个?jng)场大得惊hQPC的兴起与之相比不q小菜一。因此在q些讑֤的应用程序市(jng)ZQ竞争将?x)相当残酗获胜的重要手段之一Q就是尽快进入市(jng)场。开发h员需要优U的工Pq速高效地撰写和调试他们的软g。^台无x也是制胜秘诀之一Q它使得E序员能够开发出支持多种讑֤q_的Y件?/font>
我预期的另一个变化是Q我们对于代?Java)和数?XML)协同型应用程序的开发能力将?x)不断提高。这U协同是开发强大应用程序的核心目标之一。我们从XML的迅速流行和ebXML规范的进展中Q已l看C(jin)q个势。ebXML是一个针?a target=_new>?sh)子商?/font>和国际N易的Q基于XML的开攑ּ基础构架Q由联合国N易促q和?sh)子商务中?UN/CEFACT)与结构性信息标准推q组l?OASIS)共同开发?
我们能否期望出现一个真正的面向lg(component-oriented)的语aQ它的创造者会(x)是谁呢?
Stroustrup: 我怀疑,q个领域中之所以缺乏成果,正是因ؓ(f)Z——主要是那些非程序员们——对“lg”q个意义含糊的字眼寄予了(jin)太多的期望。这些h士梦惻I有朝一日,lg?x)以某种方式把程序员赶出历史舞台。以后那些称职的“设计?#8221;只需利用预先调整好的lgQ把鼠标拖一拖放一放,把pȝl合出来。对于Y件工具厂商来_(d)q种xq有另一层意义,他们认ؓ(f)Q到时候只有他们才保留有必要的技术,有能力编写这L(fng)lg?/font>
q种x有一个最基本的谬误:(x)q种lg很难获得q泛Ƣ迎。一个单独的lg?a target=_new>框架(framework)Q如果能够满一个应用程序或者一个业领域对所提出的大部分要求的话Q对于其刉者来说就是划的产品Q而且技术上也不是很困难。可是该产业内的几个竞争者很快就?x)发玎ͼ如果所有h都采用这些组Ӟ那么彼此之间的品就?x)变得天下大同,没什么区别,他们为简单的办事员,主要利润都将钻进那些lg/框架供应商的腰包里!
?#8220;lg”很有用,不过产生不了(jin)预期的杠杆效应。中型的、更通用的组仉常有用,但是构造时需要非同寻常的Ҏ(gu)?/font>
在C++中,我们l合q用不同׃n形式的类体系(class hierarchies)Q以?qing)用templates_ֿ打造的接口Q在q方面取得了(jin)一定的q展。我期待在这个领域取得一些有和有用的成果,不过我认U成果很可能是一U新的C++E序设计风格Q而不是一U新的语a?
Lindholm: ~写面向lg的应用程序,好像更多的是个投资、设计和E序员管理方面的问题Q而不是一个编E语a问题。当然某些语a在这斚wh先天优势Q不q如果说有什么魔术般的新语言能够大大化组件的~写隑ֺQ那Ua(b)是一U误对{?
微Y已经全部赌注押在C#上,其他语言何去何从Q?/font>
Stroustrup: C++在下一个十q里仍然是一U主语a。面Ҏ(gu)的挑战,它会(x)奋v应对。一个创造了(jin)那么多出色系l的语言Q绝不会(x)“坐视落花水春去?#8221;?/font>
我希望微软认识到Q它在C++(我指的是ISO标准C++)上有着巨大的利益,C++是它与IT世界内其他h之间的一座桥梁,是构造大型系l和嵌入式系l?/font>的有效工P也是满高性能需求的利器。其他语aQ似乎更注重那些四^八稳的商用程序?
竞争
C#?x)不会(x)获得广泛的接受Qƈ且挤掉其他的语言Q?/font>
Lindholm: 通常Q一U语a既不?x)从别的语言那里获利Q也不会(x)被挤掉。那些坚定的FortranE序员不q用着Fortran吗?对于个h来说Q语a的选择当然因时而异Q但整体而言Q语a的种cd?x)递增Q也是_(d)它们之间的关pL“有你有我”而不?#8220;有你没我”?/font>
对于一个新语言的接受程度,往往取决于其能力所?qing)。Java技术被q速接受,原因是多斚w的,Internet和W(xu)orld Wide Web接口Q在其他技术面前的挫折感,对于Java技术发展方向的全面影响能力Q都是原因。另一个重要的原因是Java独立于厂商,q意味着在兼容品面前可以从定w择?/font>
C#是否?x)获得广泛接受?视情况而定。ȝ来说Q那些对于^台无x和厂商无关性漠不关心的E序员,可能?x)喜ƢC#。那些跟微Yq_捆在一起h当然可能惌LVB 和VC的一个出色的替代品。但是对于程序跨q_执行能力特别x的程序员Q将?x)坚守Java之类的语a。这U能力对于多重访问设备(multiple access devicesQ和分布式计模型至关重要,而Java语言提供?jin)一个标准的、独立于厂商q行时环境?/font>
Stroustrup: C#的流行程度几乎完全取决于微Y投入的资金多。看上去C#的兴赯定会(x)牺牲掉其他一些语a的利益,但是事实上未必如此。Java的蓬勃发展ƈ没有lC(j)++带来衰|。C++的应用仍然在E_增长Q当?dng)已经不是爆炸性的增长?jin)?j)。也许其他的语言也还能获得自q一席之地?/font>
不过Q我实在看不出有什么必要再发明一U新的专有语a。特别是微YQ既生VBQ何需C#Q?/font>
不同OOP语言各有什么优势和劣势Q?/font>
Stroustrup: C++的优点自始至l都是这么几条:(x)灉|、高效,而且q专有语言。现在ISO C++标准的出玎ͼ巩固?jin)最后一炏V?/font>
我认为C++的高效是它最基本的优炏V这U高效来自于其特有的数据和计模型,较之Java和C#Q这U模型更加脓(chung)q机器。不q,哪些E序才真正地渴望q么高的效率Q这是个问题。我认ؓ(f)q类E序非常多。h们对于计机的期望,永远都超硬件科技的发展速度。很昄QJava和C#的设计者的x不同Q他们认为,在很多地Ҏ(gu)率问题无关紧要?/font>
C++主要的缺点,归罪于糟p的教育Q是那些始终认ؓ(f)C++是个Ua(b)面向对象语言的hQ和那些把C++当成C语言变体的hD?jin)这U情况)(j)Q归|于不同q_上的不一致性,归罪于不完整、不标准的编译器实现Q归|于q_无关的系lE序库的~少?/font>
q些问题归于一点,是~Z一个卓的厂商Q能够满x个C++C的需求,勇于投入大量的资金开发必要的E序库?/font>
Lindholm: Java技术的成功Q是因ؓ(f)它在合适的旉Q出现在合适的地点Q而且合理地选择?jin)语a和计^台的支持目标。Javaq不是在所有场合都优于其他OOP语言Q但是对于出现的新问题能够解军_很出艌Ӏ它面向Internet计算环境Q避免了(jin)C++中晦涩的l构Q成功翻了(jin)l承机制的恼人问题。垃圾收集机制显著地提高?jin)生产率Q降低了(jin)复杂度。在|络背景下用虚拟机Q以?qing)有兛_全性和动态加载的一pd设计选择Q迎合了(jin)正在出现的需求和愿望。这些特性Java不仅成ؓ(f)现有E序员的新武器,而且也ؓ(f)新的E序员创造了(jin)J荣的市(jng)场空间?/font>
此外QJava拥有一个标准化的、二q制形式的类库,提供?jin)必要的Q当然ƈ非充分的Q^C厂商无关性。^C厂商无关性要求一Ҏ(gu)术必L清晰的规范,摒弃那些ȝ二进制标准实施的Ҏ(gu)。C++虽然有一个ISO标准Q但其实甚至对于相同pȝ与相同指令体pȝ各个q_Q也提不Z个实用的、各版本兼容的二q制标准?/font>
历史上很多用虚拟机的语a饱受责难Q是因ؓ(f)其不够出色的性能问题Q而这要归q于~慢的解释器和糟p的垃圾攉器。Java的早期实C因ؓ(f)同样的问题受C厉的批评。但是自那时P业界向新的虚拟机实现技术投入了(jin)大量资金Q取得了(jin)显著的效果,如今在大部分场合QJava的性能跟常规的静态编译语a相比毫不逊色。这使得E序员在获得q_和厂商无x的同时Q也不必付出性能上的代h(hun)?/font>
C++q没有强制?a target=_new>面向对象Ҏ(gu)Q因此ؓ(f)?jin)编写出色的面向对象代码Q就要求E序员们有相当强的纪律性。很多公司就是因个原因放弃了(jin)C++。作aQJava的一个突出的优点是强制面向对象Ҏ(gu)Q不允许非面向对象的l构?/font>
C#介于C++和Java之间Q脚t两只船Q因此既不够安全Q又׃复杂?/font>
对于公司来说Q采用新的语a要付出巨大代仗雇不到好的E序员(没h熟?zhn)q种新语aQ,培训费用高得惊hQ学?fn)过E中生率和产品质量下降Q多q的l验随风消逝,{等。一U语a如何克服q些障碍Q?/font>
Lindholm: 说得很对Q采用新东西实常常开销巨大。不q问题是Q这个新东西是否能够节省更多的开支,或者提供巨大的改进Q获取合理的回报Q很多公司发玎ͼ转向Java技术不论在开发的后端Q尽快进入市(jng)场、快速P代开发、维护简单性)(j)q是前端Q跨q_发布Q适用范围从低端设备到高端服务器的技术,安全性)(j)Q都能节省大W的开销?/font>
对于C物的接纳Q常常是在痛楚的压力之下。很大程度上Q这正是Java所l历的。Java的生,是对当时很多pȝ的缺h做出的反应。Java技术通过下面的手D减M(jin)开发者的痛楚Q?) ֏(qing)?jin)网l计方面的需求,是应q而生?) 在技术能力的抉择上,保持良好的品位,֏(qing)?jin)大众的心理?) 采用适度强制性策略推行设计决定。此外,Java技术已l成为大学教学中的主,q同样保证了(jin)Java开发者队伍的不断壮大?/font>
但是最重要的一Ҏ(gu)Q再没有另一U程序设计技术,能够像Java那样允许E序员开发基于Internet的不同^C上的应用E序。Javaq_在这斚w的杰玎ͼ已经被大量的实例证明。Java已经成ؓ(f)Internet上的~省应用E序q_QJava APIs也成为Internet应用E序开发的天然q_?/font>
Stroustrup: 微Y和Sun把大W的金钱扔在Java、VB和C#中,q不是因Z良心发现Q也不是因ؓ(f)他们真的怿q些语言能够带给E序员更好的生z,而是利益使然?/font>
有一个说法,认ؓ(f)软g工具厂商如果能够把应用程序开发者的专业技术Q务负担v来,获取巨大的l济利益。我对其背后的经分析颇为怀疑,我认很难成ؓ(f)现实Q特别是当应用程序开发者用开攄、标准化的工hQ他们可以有多种选择Q从而上面的想法更加不可能?/font>
多年以前QC++已l具有泛型能?也就是templates和STL)Q有q算W重载,有枚丄型?我们?x)不会(x)在Java的未来版本中看到q些Ҏ(gu)?Java是不是应该纳入这些特性呢Q?/font>
Strousturp:?988-89qvQC++已l有?jin)templates。但是我们花?jin)不时间来了(jin)解如何最好地q用q个工具Q早期各厂家对于template的支持在品质上也有很大的差异。有些编译器厂商动作q缓Q至有一个主要的~译器厂商(好像是指微YQ微软在Visual C++4.0才开始支持templateQ在此之前一直声Utemplate是过于复杂而又没什么用的技术,时至今日QVisual C++对于template的支持在L~译器中都属于最差的一档——译者注Q暗中鼓励声名狼藉的反template宣传Q直C们自q于学?x)?jin)q项技术ؓ(f)止。直C天,对于template的支持在品质上仍然有待改q?/font>
你上面提到的那些Ҏ(gu),我认为JavaQ还有C#Q应该,也肯定会(x)逐渐引入。那些对于程序员来说最有用的语aҎ(gu)和概念Q将?x)逐渐集中Q成为各家主语a的必然之选。也是_(d)我认为类似析构函数和模板Ҏ(gu)化之cȝ机制Q远q比枚D{机刉要得多?/font>
LindholmQJava技术成功的原因之一Q就是很清楚哪些不该做。我们得多问几个Z么:(x)q项Ҏ(gu)是不是必不可少Q增加它?x)带来哪些开销Q运符重蝲是C++中一Ҏ(gu)其强大的Ҏ(gu),但是它也大大增加?jin)C++语言的复杂度Q很多h都难以招架。Java在各U可能的权衡之中Q做Z(jin)明智的抉择,扑ֈ?jin)能力与需求之间的完美q炏V?/font>
当然QJava也会(x)发展Q而且最重要的是Q现在是开发者们在推动发展。Java增加泛型能力qg事,很好地展CZ(jin)Java是如何通过整个开发者社的参与Q在权衡中决定正的q炏V关于增加泛型类型(generic typesQ的“Java规格甌”QJava Specification Request, JSRQ已l进?a target=_new>JCPQ?a target=_new>Java Community ProcessQ程序,而且已经开发了(jin)很长一D|_(d)参见 http://java.sun.com/aboutJava/communityprocess/之JSR-014Q。现在,在JCP中,有超q?0个JSRs正在讨论中,q充分体C(jin)整个体系对开发者的U极反馈和高度合作,q正是驱动Javaq_不断q化的动力?/font>
发展 vs. 革新(Evolution vs. Revolution)
C++是一U发展型的语aQJava和C#g更像是革新型语言Q它们是从头设计的)(j)Q什么时候,革新型的语言才是必需的呢Q?/font>
Lindholm: Java技术ƈ非凭I出世,反而更像是发展型的。Java所有的Ҏ(gu),在Javaq_推出之前Q都臛_已经存在于另一U环境之中。Java的A(ch)献在于,在众多的Ҏ(gu)和权衡中,做出?jin)合理的选择Q得品既实用Q又优雅。Java技术对于程序员的态度是:(x)抚养Q但不h爱?/font>
StroustrupQ从技术上Ԍ我ƈ不认为Java和C#是什?#8220;从头设计?#8221;革新型语a。倘若Java是从技术原则出发,从头设计Q大概就不会(x)模仿C/C++那种丑陋和病态的语法?jin)(不必惊讶QStroustrup在很多场合表CQC++采用C的语法Ş式,实在是迫于兼Ҏ(gu)。他本h更偏爱Simula的语法——译者)(j)?/font>
我认为,只有当程序员们面对的问题发生?jin)根本的变化的时候,或者当我们发现?jin)全新的、极其优的E序设计技术,又完全不能ؓ(f)现存语言所支持的时候,我们才需要全新的语言。问题是Q我们恐怕永q也?l)C到那?#8220;Ҏ(gu)”?#8220;全新”的情c(din)?/font>
我以为,自从OOP问世以来Q可UCؓ(f)“Ҏ(gu)”的新型程序设计技术,唯有泛型E序设计Qgeneric programmingQ和生成式程序设计(generative programmingQ技术,q两Ҏ(gu)术主要是源于C++ templates技术的q用Q也有一部分曄被视为面向对象和函数式语a(functional languages)的次要成分,现在都变成正式、可用和可承受的技术了(jin)。我对于目前C++模板(template)E序设计的成果非常兴奋。例如,像POOMA, Blitz++和MTL{程序库Q在很多地方改变?jin)数D的方式?/font>
Java和C#的一?#8220;卖点”Q就是它们的单性。现在Java是不是快失去q个卖点?jin)?/font>
StroustrupQ新语言L宣称自己如何如何单,对老语a的复杂性颇多非议。其实这U所谓的“单?#8221;Q简单地_(d)是不成熟性。语a的复杂性,是在解决现实世界中极为烦(ch)琐和Ҏ(gu)的复杂问题的q程中逐渐增加的。一个语a只要zȝ旉够长QM(x)有某些地斚w渐复杂hQ或者是语言本nQ或者是E序库和工具。C++和Java昄都不例外Q我看C#也一栗如果一U语a能够度过自己的幼q时代,它会(x)发现Q自己无论是体积q是复杂性都大大增加?jin)?/font>
LindholmQJava技术的的功能在增加Q需要学?fn)的东西也在增加。不q功能的增加q不一定带来复杂性的增加。Java技术的发展Qƈ没有使学?fn)曲U更加陡峭,只是让它l箋向右方g展了(jin)?/font>
标准
标准化语a和开攑֞语言各自的优点和~点何在Q?/font>
LindholmQ对于一个开放、不允许专有扩展、具有权威的强制性标准语a或者运行环境来_(d)不存在什么缺炏V允怸有扩展就意味着允许厂商下套子绑架客戗特别重要的是,必须让整个^収ͼ而不只是其中一部分完全标准化,才能杜绝厂商们利用高层次的专?a target=_new>API下套子。客戯求有选择厂商的自由,他们既要有创造性,又需要兼Ҏ(gu)?/font>
StroustrupQ对于一个语aQ如C/C++来说Q徏立正式标准(如ISO标准Q最大的好处Q在于可以防止某一个厂商操U这U语aQ把它当成自q摇钱?wi)。多个厂商的竞争l用户带来的是较低的价位和较好的E_性?/font>
专有语言的好处,一是流行,二是便宜Q不q等你被套牢?jin)之后,情况׃?x)起变化)(j)Q三是对于商业性需求可以做出快速的反应?/font>
标准化语a的特点之一是,它不能忽略特D用L(fng)需求。比如我在AT&T中所考虑的东西,其规模、可靠性和效率要求Q跟那些普通厂商关注的大众软g相比Q根本不可同日而语。那些公司很自然只关注主要的需求?/font>
然而,多数大机构和w处前沿的公司,都有着Ҏ(gu)的需求。C++的设计是开放、灵zd高效的,能够满我所能想象的M需求。跟其他的现代语a相比QC++的家长式作风可谓之又少Q原因就在这。当?dng)不能赞赏q一点的Z(x)诟病C++?#8220;危险”?/font>
拥有正式和开放标准的语言主要是ؓ(f)~程工具的用者和客户服务的,而拥有专?#8220;标准”的语aQ主要是为厂商服务的?br>
—?/span>Bjarne Stroustrup访谈?/span>
늎?/span>
许多重要人物之所以成名,或者是因ؓ(f)其改变了(jin)历史或者是因ؓ(f)其创造了(jin)历史Q?/span>Bjarne Stroustrup先生Q?/span>C++之父Q属于后者;归结个h成功的原因,理由可能有许多,但他只有显的两个一点点Q他比多Ch天真和理想主义那么一点点Q比多数在解决问题上的时间多一点点?/span>
C++E序设计语言是一U承前启后,被数以百万计的程序员应用在各个领域中的语aQ我们正在用的Windows操作pȝQ我们上|用的浏览器IE无不是出?/span>C++的手W?/span>
C++是一U重要的和比较流行的计算a之一Q也是未来十q内仍然发挥重要作用的语a?/span>C++语言是一U通用的应用广范的E序设计语言Q是一U既支持传统的结构化E序设计Q又支持面向对象E序设计的系l复杂的语言?/span>C++?/span>C语言的扩充首先由 Stroustrup先生?/span>1980q在贝尔实验室提出的Q于1983q改名ؓ(f)C++。尽?/span>C++的祖?/span>C语言是世界上最受喜爱和应用最q的专业E序设计语言之一Q但C++的发明是必需的?/span>C++的本质就是让E序员理解和理更大更复杂的E序。而对q种语言有着最大A(ch)献的C++之父又是怎样一个h呢?
Bjarne Stroustrup先生Q?/span>1950q生于丹麦港口城?jng)奥(dng)胡斯?/span>1975q在奥尔胡斯大学毕业Q?/span>1979q获得剑桥大学计机U学博士学位。他?/span>C++语言的设计者和实现者,现在是得克萨斯州A&M大学计算机系教授?/span>1979q他来到国的新泽西州ƈ加入贝尔实验室,?/span>C语言之父?/span>1983q图灵奖得主Dennis Ritchie以及(qing)大名鼎鼎?/span>Brian KernighanQ两人合著?/span>CE序设计语言》)(j)׃多年Q期间参与了(jin)贝尔实验室的C语言标准化活动。他的研I兴十分广泛,包括分布式系l、操作系l、仿真、设计以?qing)编E,Bjarneq积极推?/span>C++?/span>ANSI/ISO标准化?/span>
20世纪90q代以后Q?/span>Bjarne Stroustrup步入人生的最辉煌时期?/span>
1990q_(d)Bjarne荣获《胦(ch)富》杂志评选的“国12位最q轻的科学家”U号?/span>
1993q_(d)׃?/span>C++领域的重大A(ch)献,Bjarne获得?/span>ACM该年度的 Grace Murray Hopper大奖q成?/span>ACM院士Q成立于1947q的ACM协会(x)是历史最(zhn)久、目前世界上最大的教育和科学计协?x),成?f)ACM院士是个人成q里程)(j)?/span>
1995q_(d)BYTE杂志颁予?#8220;q?/span>20q来计算机工业最具媄(jing)响力?/span>20?#8221;的称受?/span>
除了(jin)他的专业研究领域外,他对历史Q通俗文学Q摄影,q动Q旅行和音乐{有q泛的兴。他?/span>C++语言的推q也做出?jin)极大的贡献Q他写的?#8220;The C++ Programming Language?/span>C++E序设计语言?#8221;已经成ؓ(f)q种语言中最为流行的学习(fn)资料Q至被译?/span>18U语a?/span>
2004q?/span>12?/span>8日,杭州Q?/span>C++之父Bjarne Struostrup先生再次来到中国。我们有qR访到?jin)这位大师!L(fng)大师l中国程序员的最好愿?/span>
问:(x) (zhn)对中国和中国的E序员有什么认识?(zhn)想对他们说点什么吗Q?/span>
Bjarne StroustrupQ?/span>中国是个大国Qƈ且她有许许多多有的文化。我惛_中国E序员说的和对其他国家的E序员说的是一L(fng)Q所以我有如下的回答Q优U软g所h的特点和技术在全世界都是通用的?/span>
?/span> C++之父l中国程序员最好的祝?/span>
现在Q成Z名电(sh)脑高手是许多q轻学生的梦惻I面对Stroustrupq样一位大师人物的出玎ͼ最令我们感兴趣的问题莫q于Q?/span>Bjarne成ؓ(f)大师的历E是什么样子的呢?
Bjarne Stroustrup先生出生的奥?dng)胡斯?jng)是日德兰半岛东v岸的一个美丽的城Q那里每安有自q公寓,公寓里有个小院,院是孩子们t球的地方Q那Ӟ成ؓ(f)一名球明星比成ؓ(f)一名电(sh)脑高手是更可行的xQ做一名电(sh)脑名星好象是很遥q的事情Q因ZZ太可能拥有一台昂늚计算机。很q运Q在大学时他q上了(jin)p里的计机Q它?/span>GIERQ是一台旧的丹麦计机Q有一个房间那么大Q程序都写在带上面Q他用它学习(fn)Algol 60E序设计?/span>
而对Bjarne生活产生质的变化的事情是什么呢Q?/span>
他认为在他的发展生(dng)中,最关键的一个项目是在剑桥大学攻d士学位时?/span>Simula67计算机做的模拟分布式pȝ。做q个目除了(jin)使他成ؓ(f)一名顶的E序设计高手外,更他养成了(jin)E序员应h的沟通和交流能力Q这Z后来的发展奠定了(jin)坚实的基?/span>
Bjarne?/span>C有缘?/span>
Bjarne Stroustrup先生?/span>CQ?/span>China中国Q有~,对他来说中国是一个神U、美丽而有的国度?/span>
Bjarne两度亲密接触中国Q第一ơ是2002q_(d)曑֜中国的几所大学讲学Q而第二次是在江大学参加ICESS国际?x)?/span>Q?span>ICESS 2004, http://www.cs.zju.edu.cn/icess2004/Q?/span>?/span>Bjarne Stroustrup先生两年前在中国有过长时间的旅程Q而在杭城的日子恰逢阴雨,q次到来Ҏ(gu)天的期望是强烈的Q何冉|杭州西湖景。作Z麦hQ也是卖火柴的女孩诞生的地方Q也是安徒生童话诞生的国度Q和中国有着很深的渊源,安徒生童话里恰y里面有一《夜莺》,那里写到?jin)中国,?/span>Bjarne Stroustrup先生对于CQ中国)(j)的认识又是什么呢?
他的回答很微妙,他自然知道安徒生童话Q他也很喜欢它们Q《夜莺》中描绘的中国纯是虚构,与当时的中国可能有也可能没有M关系Q安徒生创造了(jin)那个“中国”来泛指多个国家及(qing)其统治者。而作Z个教育者,他对中国的教育老祖师孔老夫子也有自q到的见解?/span>
作ؓ(f)W二?/span>CQ自然就?/span>C++?jin)。勿庸置疑,C++对于IT的分量,和对?/span>Bjarne个h的媄(jing)响,都是巨大的。还有一?/span>CQ就是计机Q且看下面他如何描述自己与计机的联pR?/span>
问:(x) (zhn)的生活是怎样和计机联系在一L(fng)Q?/span>
Bjarne StroustrupQ?/span>我也不晓得自己到底是怎样和计机联系在一L(fng)。当我上高中Ӟ不知什么原因总觉得计机U学是数学的某种实用形式。而事实不完全是这P或者至从软g的发展上看ƈ不是如此Q但正是q种误解使得我在q不知计机Z物时选择?/span> “计算机科学数?#8221; Q作为我学习(fn)的专业,q获得了(jin)我的士学位。我写完W一个程序后Q就着?jin)迷Q曾没有回过头。正象大家所看到的,很幸q,我找C(jin)一个自己的才能可以很好地发挥的位子?/span>
问:(x)(zhn)怎样教育自己的孩子和学生们?
Bjarne StroustrupQ?/span>多数情况下,我是通过实例来进行教学的。我认ؓ(f)多数高的估计?jin)言语的影响力,而过低的估计?jin)这U媄(jing)响力是怎样辑ֈ的过E。我量通过把理论和实践相结合v来以?/span>好地辑ֈ目的Q这样可以比仅用理论或仅用实늤例来教育更能取得事半功倍的成效。我量丑և实例Q从q些zȝ生的实例中引导归U_一般的规则和概c(din)?/span>
C++是怎样炼成的,是什么促成了(jin)C++语言Q这象迷一L(fng)在我们的心头Q那什么又是计机语言呢?后者弄懂了(jin)Q前者看h也许更单了(jin)Q且看大师的回答Q?/span>
问:(x) (zhn)觉得计机语言和我们hcȝ语言有什么不同呢Q?/span>
Bjarne StroustrupQ?/span>计算a要比人类语言单的多,q且_的多Q那也是它应该具有的方式。我不赞成用自然语言L令电(sh)脑的x。一U程序语a是专家们的工Pq且和普通h相比Q是Ҏ(gu)有的专家来说用更加专业、定义的更加_的符号和术语来表辄工具?/span>
当然两者也有相同之处。那些用的较多的语言比那些用率较小的语a拥有更多的俗语、表达方式、词汇,q一Ҏ(gu)论是计算aq是自然语言都是一L(fng)。语aq有一个們是来易学,但却很难_N,象E++ 和英语。在两种语言当中Q我们都希望能从最初的基本的应用到真正的掌握。另外一个相同之处就是语a的发展都要适应一个群体的需求,q且一个大的群体或者说C本n有重要意义Q因Z个群体的一部分可以让你有更多的人来q行互动q且有更多的Z(x)可以使用。所有鲜zȝ语言都是通过获得新的术语、俗语和表达方式来得到发展的。在C++中我们已l看C(jin)关于模板技术的q猛发展Q始因是STLQ注QSTL指标准模板库Q后面我们将采访STL之父 Stepanov先生Q他实有许多精彩的a论,?/span>Bjarne Stroustrup先生相比Q毫不逊色Q,也就是经常提到的泛型~程Q?/span>generic programmingQ?/span>和模板元E序Q?/span>template metaprogrammingQ?/span>。以后几q里Q我们将?x)在新?span>ISO C++标准中看刎ͼ?998q标准中Ҏ(gu)板技术更强的支持和更q的应用?/span>
那么Q究竟是什么促成了(jin)C++语言呢?
他的研究生(dng)l了(jin)他很大灵感,他所在的AT&T贝尔实验室是一个光荣的体Q那里有一非常出色的研究人员Q那里有许多著名?/span>IT人物Q他们彼此间的媄(jing)响十分深q。他曄?/span>C语言之父Dennis Ritchie亲密接触十多q_(d)他们的办公室相距不远Q?/span>C++语言?/span>C的媄(jing)响是巨大的。而对?/span>C++来说Q尤其值得我们推崇的是Q作ZU学术性语aQ他是从商业性语a的重围中杀出的?/span>
1979q?/span>Bjarne在剑桥完成学业后Q到?jin)贝(dng)实验室从事研究工作Q?/span>20世纪80q代Q?/span>AT&T曾拔?/span>5000元作ؓ(f)?jng)场预算Q创Z门语a的决心可能由此而始。在那里Q开始研I几个与分布式计有关的目。可是工作进展得q不利Q因为那时几乎所有程序设计工具都不适合完成此类工作。所以,他决定自己开发一个名?#8220;带类?/span>C”的工P它既允许以类gSimula的方式组l程序(q种方式现在被称为面向对象)(j)Q同时也支持在硬件层ơ上q行pȝ软g开发。从1980q开始,“带类?/span>C”被应用于贝尔实验室的很多应用领域Q在应用q程中,他又学到?jin)很多东西,?/span>C++正是?#8220;带类?/span>C”为基q结合了(jin)一些我们学到的C西发展而来的?/span>1983q夏天,Rick Mascittilv?/span>C++的名字,q个名字也象征着两种语言之间巨大的渊源?/span>
对于Bjarne来说Q生zM更有意义的事情是什么呢Q是学习(fn)和教肌Ӏ这看v来象个沉重的话题Q而在Bjarnew上却显得如此生动,作ؓ(f)教育ӞBjarne Stroustrup先生本n便是一个成才的典范Q他n于农场和“蓝领工h”家庭Q他在专业领域孜孜耕耘,取得?jin)不菲业l。先?/span>AT&T的研I者,现在又兼L席,Bjarne从研I室又走q了(jin)大学Q直接面对大学的新学生!
C++?/span>Bjarne生命中最重要的事情,而还有一些更有意义的事情?/span>
他对大学教育情有独衷Q他现在?/span>A&M大学的教授,q种行动便是很好的说明,在这里,以一U在AT&T研究所中无法采用的方式研I和教学l合h。他认ؓ(f)教学是一U与工业生不同的能影响世界q其变得更加美好的方式Q而且大学里的研究工作的成果与曄q行的工业研I的q不相同 - 不是说它更好Q仅仅只是不同而已?/span>
他的一些教育观点也非常值得我们深思:(x)
他说Q不要只学习(fn)计算机和~程Q要U篏一U或多种领域的经验,要有其他专业知识Q这样就能明白什么东西值得我们ȝE实现。另外,学习(fn)多种语言也是他一再强调的Q如果只学一U,Ҏ(gu)D惌力的僵化。他本h爱好q范Q精通多U计机语言?/span>
问:(x)(zhn)觉得怎样才是学编E的好方法?学习(fn)语言时一U好的工h不是必需的?
Bjarne StroustrupQ?/span> q是q去一q左右里一直占据我大部分注意力的一个问题。我志愿教授?sh)子工?span>/ 计算机工E专业大学一q的学生编E,我认为我们目前教~程的传l方法不够严谨也不够qK。我们社?x)的文明q步是徏立在软g上的Q因而必dL好的软g专家。我认ؓ(f)已经C(jin)我开始培L手程序员的时候了(jin)Q在我此之前我都是把_֊攑֜专家上。我基本的设x让学生成ZӞ使他们最l能够编出可靠ƈ且别人可以信赖的软gQ这意味着在培L手时要求更高Q要重Ҏ(gu)在对E序正确性和处理错误的训l上。既然目标是Z(jin)刉现实世界中可用的YӞ我也非常重视标准库的应用和设计。对于C++标准库工L(fng)教学Q例如向量(vectorQ和字符(string)从第一周就该开始应用,在第一个月之内c(classQ就应该介绍Q在W二个月之内介绍囑ŞQgraphicsQ和l承性(inheritanceQ。这U方法和传统的方法不同,那些教学Ҏ(gu)往往p数周的时间来区分那些令hqh的C++基本cdQƈ且浪费宝늚旉来处理诸如声明和循环上的一些迷目的语法细节。我U我的方法ؓ(f)“深度优先?#8221;Q因为我们首先教我们的学生够的知识d一些有用的工作Q然后才在这有限的基上拓宽他们的理解能力和对工具的用能力?/span>
我所有的教学都是在实例的基础上进行的。我通过典型的例子来使学生理解,用亲w的体会(x)来解释一些规则。自然地Q我要求学生写大量代?/span>?/font>如果你不M不写大量代码的话你就学不?x)编E。第一阶段如下Q学生必ȝq亲w写代码Q体?x)解题过E中出现的实际问题;W二个阶D必d好体?x)亲w所犯的错误Qƈ且学?x)克服他们。这其中Q调试、错误处理,q有学会(x)大问题分解成小问题Q从最的lg来编E是非常重要的?/span>
?/span>:数学和计机U学有什么关pdQ?/span>
Bjarne StroustrupQ?/span> 两者ƈ没有很强的直接联p,但是有一部分~程的实质包含在里面-- -象学数学一P~程有时也需要很严密的思维。自从古希腊以来Q数学就被用来训lh们的逻辑思维Qƈ且我觉得如果不用数学的话很难惌怎样才能~出好程序来。当然也有一些计机领域Q用到高q数学知识。然而,q些领域通常是非怸业的。数学,特别是数学思维是计机的一个支柱。经验主义是另一支柱Q通过观察和测量来帮助理解实际的发展,用以调整我们的系l和行ؓ(f)。两斚w我们都需要。计机U学不是仅仅用来证明定理的,也不是仅仅用来收集数据的。ؓ(f)?jin)有效地实践计算机科学和发展高质量YӞ更同旉要数学和l验的训l?/span>
问:(x) (zhn)以前在Ƨ洲学习(fn)而现在在国工作Q?zhn)觉得Ƨ美有什么学术传l区别?怎样才算是一U好的大学教育呢Q尤其对计算机科学来说。现在的大学有部分学生中途退学,(zhn)怎样看待q一现象呢?
Bjarne StroustrupQ?/span>q很隑֛{。欧z和国都幅员辽阔,而且有很多不同的学术传统。真的不好ȝQƈ且在两地都有一些非常好的大学科p,q不是很Ҏ(gu)区别和下l论的?/span>
很少有学生离开学校d公司Q较多的是离开学校M事一些有较高收入的工作,但大多数是完成了(jin)学业。我印象中那些放弃了(jin)计算机科学学?fn){而投入业界工作的是会(x)为此感到后?zhn)的。从长期眼光来看学位对一个好工作来说是重要的Q特别是学生在他们最后一q或最后几q的学习(fn)。当然也实有些相反的例子,但那些h通常永远不会(x)再从事真正的技术工作,而{为商业管理h员了(jin)Q如果那是他们想做的Q那一个学位ƈ不是必须的。我一直认?span>:一个学生如果还未获得学位,最好不要离开学校?/span>
问:(x)我们l常批评我们现在?span>C++教育不够C、不够科学,(zhn)是通过“深度优先?#8221;来教授学生的Q?zhn)是否觉得在一个学生学?fn)早期有些难吗?我们该如何做呢?/span>
Bjarne StroustrupQ?span>q是必然的。传l的教授~程的方法是不行的,学完q些评的学生写不出很好的代码。说得更Ȁq一点,他们甚至不知道什么是好的代码Q我的方法可以避免这U情况发生。我已在300 名学生n上实验成功。对于程序员来说q是非常关键的——包括新E序员——了(jin)解基本概念和基本技能。但仅仅?jin)解E序设计语言的基本构造是不够的。另一斚wQ如果没有一U编E语a我们׃可能教授~程的技能和规则Q因此,对一U语a工具充分掌握Q做可能多的练?fn)是必需的?/span>
很显?dng)q种教育问题不仅仅局限于C++语言。我的方法可以应用于M其他语言?/span>
面向对象是个有趣的问题,C++正是和面向对象有着非常联系的语aQ作ZU非商业化语aQ他已经影响?jin)世界范围数十亿元的设计决{。而还有许多语ahq种特点,因而,关于各种语言的争论喋喋不休地q行?jin)几十年?/span>
当有人问Bjarne Stroustrup先生Q有Java是纯_w向对象的Q而C#更胜一{,而还有很多h说它们纯_Ҏ(gu)面向金钱的。以(zhn)之见呢Q?/span>
Bjarne 的回{非帔R:(x)我喜?#8220;面向金钱”q个?:-) q有Andrew Koenig的说?面向大话"我也喜欢。C++可不面向q两个东东。对q点我还x出,我认为纯_Ҏ(gu)ƈ非什么优炏VC++的优Ҏ(gu)恰在于其支持多种有效的编E风|多种思维模型吧,如果你一定要q么_(d)(j)?qing)其l合。最优雅最有效也最Ҏ(gu)l护的解x案常常涉?qing)到一U以上的风格Q编E模型)(j)。如果一定要用吸引h的字|C++是一U多思维模型的语a。在软g开发的庞大领域Q需求千变万化,L(fng)需要一U支持多U编E的设计风格的通用语言Q而且很可能需要一U以上呢。再_(d)世界之大Qd得下好几U编E语a吧?那种认ؓ(f)一U语aҎ(gu)有应用和每个E序员都是最好的看法Q根本就是荒谬的?/span>
他上面的回答很好地告诉了(jin)我们面向对象和面向金q关系Q也l我们的争论划上?jin)圆满的句号?/p>
问:(x)(zhn)对面向对象是怎样理解的?它是不是一U好的可接受的编E思考方式?有没有学?/span>OO必须的有用的工具Q?/span>
Bjarne StroustrupQ?/span>OO 技术在现在软g发展的扮演了(jin)非常重要的角Ԍ但ƈ不是唯一的方法。象泛型E序设计Qgeneric programmingQ?用C++ 模板是另一U方法,q些Ҏ(gu)必须通过l合应用来,才能创造出Q一的、最可读的、最易于l护的、最高效的程序。但没有M一U方法是适合所有要求的?/span>
我主要用C++来编E。我觉得C++是一U学?fn)和实践OO思想很好的编E语a?/span>
?/span> 敢问路在何方
问:(x) (zhn)能?/span>IT的将来做一下预吗Q将来我们最有可能用什么语aQ?/span>
Bjarne StroustrupQ?/span>一个聪慧的q默大师曄说过Q预是困难的,特别是对来的预。但是我认ؓ(f)未来十年之内我们用的东西在今天的实验室里是能够看到的。另外我们将用的最主要的语a也是今天最主要的。我们不可能因ؓ(f)一些新东西和一些更好的东西的出现就重组整个工业领域Q因此在五到十年之内Q我们还是用C, C++, COBOL, Fortran, Java, Perl, PythonQ也许还有C#Q和其它许多U语a。没有一U语a能适合所有用途,q且好的E序员都懂ƈ且都能用好几U语a。懂好多U语a和多U程序设计技术会(x)使我们可以更好地~程?/span>
对于IT我不惌太多Q很昄Q我们会(x)l箋依赖ITq且它会(x)延到越来越多的领域。当?dng)肯定会(x)有p|Q通常是因度的滥用引v的——但是在十年以后我们受IT的媄(jing)响肯定要比今天大得多?/span>
很幸q,通过?sh)邮采访的同时终于有Z(x)和大师面寚w。想象中的大师和面对面见到的有太多的意想不到Q用一个词来ŞҎ(gu)“谦?#8221;?/span>
Bjarne到杭州下?jin)飞机,便扑向美丽的西湖Q同ȝ是他的好?/span>STL之父Alex Stepanov先生。在未去杭州之前Q?/span>Bjarne Stroustrup先生通过?sh)邮告诉我杭州城的美Q去?jin)之后,有的好天气让我们碰上?jin)Q爽Q夜里在旅馆见到?jin)久q的大师Q一夜之间见C位大师,更爽Q?/span>
我对Bjarne Stroustrup先生有着Ҏ(gu)的感情,觉得他象位慈Ӟ而他正和我的父亲同样的年U。大师,慈父Q接触越多,?/span>Bjarne Stroustrup先生的感触越深。到?jin)杭城,见到大师其hQ这U感觉越来越厚Q他又象P既有热情Q又能包宏V?/span>
采访大部是通过E?/span>mailq行的,采访的过E中Ҏ(gu)的问题孜孜以求,l我的回{细微备臻IE?/span>mail的好处在此发挥到?jin)极_(d)大洋q边的我沐着阛_Q那边的他在挑灯夜书?/span>
唯有谢谢众多C++E友和非C++朋友Ҏ(gu)的支持,唯有大师再来杭城Ӟ到最好的茉上好的龙井泡上Q亲手送到大师的手中!
2004q?/span>12?/span>19?/span>
?我的?sh)?右键-属?-高-性能-讄--视觉效果 Q?选中“在菜单下显C阴影?
②如果不行就看看Q桌面右?排列图标-“在桌面上锁定web目”,选了(jin)那一就?x)不透明
③还是不行的话:(x)桌面右键Q-属性-Q桌面-Q自定义桌面Q-WebQ-把所有的NL
?最后一招 :(x)在“运行”中输入“gpedit.msc”,打开l策略;在“用户配|→理模板→桌面→Active Desktop”中Q点zd桌面属性选定“未被配|”,点禁用活动桌面属性选定“已用”;最后打开控制面板Q在l典视图中打开pȝQ在“性能→高U选项→性能→视觉效果”里选取“在桌面上ؓ(f)图标标签使用阴媄(jing)”即?默认情况下,最后一步可忽略)?/p>
l过以上几步基本可以L桌面图标和文字的背景色了(jin)。?/p>