|
用户名:MageWang 笔名:MageWang 地区: |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
欢迎访问劢杰的博客
面试常遇到的84个问题及如何回答
PPP协议
一、介绍
PPP(Point-to-Point Protocol点到点协议)是为在同等单元之间传输数据包这样的简单链路设计的链路层协议。这种链路提供全双工操作,并按照顺序传递数据包。设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。
二、 PPP链路建立过程
PPP协议中提供了一整套方案来解决链路建立、维护、拆除、上层协议协商、认证等问题。PPP协议包含这样几个部分:链路控制协议LCP(Link Control Protocol);网络控制协议NCP(Network Control Protocol);认证协议,最常用的包括口令验证协议PAP(Password Authentication Protocol)和挑战握手验证协议CHAP(Challenge-Handshake Authentication Protocol)。
LCP负责创建,维护或终止一次物理连接。NCP是一族协议,负责解决物理连接上运行什么网络协议,以及解决上层网络协议发生的问题。
下面介绍PPP链路建立的过程:
PPP链路状态机如图1所示。一个典型的链路建立过程分为三个阶段:创建阶段、认证阶段和网络协商阶段。
阶段1:创建PPP链路
LCP负责创建链路。在这个阶段,将对基本的通讯方式进行选择。链路两端设备通过LCP向对方发送配置信息报文(Configure Packets)。一旦一个配置成功信息包(Configure-Ack packet)被发送且被接收,就完成了交换,进入了LCP开启状态。
应当注意,在链路创建阶段,只是对验证协议进行选择,用户验证将在第2阶段实现。
阶段2:用户验证
在这个阶段,客户端会将自己的身份发送给远端的接入服务器。该阶段使用一种安全验证方式避免第三方窃取数据或冒充远程客户接管与客户端的连接。在认证完成之前,禁止从认证阶段前进到网络层协议阶段。如果认证失败,认证者应该跃迁到链路终止阶段。
在这一阶段里,只有链路控制协议、认证协议,和链路质量监视协议的packets是被允许的。在该阶段里接收到的其他的packets必须被静静的丢弃。
最常用的认证协议有口令验证协议(PAP)和挑战握手验证协议(CHAP)。 认证方式介绍在第三部分中介绍。
阶段3:调用网络层协议
认证阶段完成之后,PPP将调用在链路创建阶段(阶段1)选定的各种网络控制协议(NCP)。选定的NCP解决PPP链路之上的高层协议问题,例如,在该阶段IP控制协议(IPCP)可以向拨入用户分配动态地址。
这样,经过三个阶段以后,一条完整的PPP链路就建立起来了。
三、 认证方式
1)口令验证协议(PAP)
PAP是一种简单的明文验证方式。NAS(网络接入服务器,Network Access Server)要求用户提供用户名和口令,PAP以明文方式返回用户信息。很明显,这种验证方式的安全性较差,第三方可以很容易的获取被传送的用户名和口令,并利用这些信息与NAS建立连接获取NAS提供的所有资源。所以,一旦用户密码被第三方窃取,PAP无法提供避免受到第三方攻击的保障措施。
2)挑战-握手验证协议(CHAP)
CHAP是一种加密的验证方式,能够避免建立连接时传送用户的真实密码。NAS向远程用户发送一个挑战口令(challenge),其中包括会话ID和一个任意生成的挑战字串(arbitrary challengestring)。远程客户必须使用MD5单向哈希算法(one-way hashing algorithm)返回用户名和加密的挑战口令,会话ID以及用户口令,其中用户名以非哈希方式发送。
CHAP对PAP进行了改进,不再直接通过链路发送明文口令,而是使用挑战口令以哈希算法对口令进行加密。因为服务器端存有客户的明文口令,所以服务器可以重复客户端进行的操作,并将结果与用户返回的口令进行对照。CHAP为每一次验证任意生成一个挑战字串来防止受到再现攻击(replay attack)。在整个连接过程中,CHAP将不定时的向客户端重复发送挑战口令,从而避免第3方冒充远程客户(remote client impersonation)进行攻击。
四、PPP协议的应用
PPP协议是目前广域网上应用最广泛的协议之一,它的优点在于简单、具备用户验证能力、可以解决IP分配等。
家庭拨号上网就是通过PPP在用户端和运营商的接入服务器之间建立通信链路。 目前,宽带接入正在成为取代拨号上网的趋势,在宽带接入技术日新月异的今天,PPP也衍生出新的应用。典型的应用是在ADSL(非对称数据用户环线,Asymmetrical Digital Subscriber Loop)接入方式当中,PPP与其他的协议共同派生出了符合宽带接入要求的新的协议,如PPPoE(PPP over Ethernet),PPPoA(PPP over ATM)。
利用以太网(Ethernet)资源,在以太网上运行PPP来进行用户认证接入的方式称为PPPoE。PPPoE即保护了用户方的以太网资源,又完成了ADSL的接入要求,是目前ADSL接入方式中应用最广泛的技术标准。
同样,在ATM(异步传输模式,Asynchronous Transfer Mode)网络上运行PPP协议来管理用户认证的方式称为PPPoA。它与PPPoE的原理相同,作用相同;不同的是它是在ATM网络上,而PPPoE是在以太网网络上运行,所以要分别适应ATM标准和以太网标准。
PPP协议的简单完整使它得到了广泛的应用,相信在未来的网络技术发展中,它还可以发挥更大的作用。
PPP协议文档
GCC使用集锦
Q: 用GCC编译时为什么没有提示sqrt函数?
源代码如下:
#include<math.h>
#include<stdio.h>
....
sqrt(9);
....
A: 编译的时候用 -lm
Q:
A:
C++经典书籍
C++ 相关书籍之多,车载斗量;如天上繁星,如过江之鲫。广博如四库全书者有之(The C++ Programming Language、C++ Primer),深奥如重山复水者有之(The Annotated C++ Reference Manual, Inside the C++ Object Model),细说历史者有之(The Design and Evolution of C++, Ruminations on C++),独沽一味者有之(Polymorphism in C++, Genericity in C++),独树一帜者有之(Design Patterns,Large Scale C++ Software Design, C++ FAQs),程式库大全有之(The C++ Standard Library),另辟蹊径者有之(Generic Programming and the STL),工程经验之累积亦有之(Effective C++, More Effective C++, Exceptional C++)。
这几本让读者和我在期待的C/C++巨著就是这期我要推荐的——《Essential C++中文版》、《Effective C++中文版》、《The C++ Programming Language》和《C++ Primer》。
Essential C++(Addison Wesley Pub Co.,1999年10月第一版)的作者Stanley B.Lippman更是C++领域一流的大师级人物,他从1984年开始就与C++结下了不解之缘:参与了第一个C++编译器C Front的开发,曾经和C++之父Bjarne Stroustrup(详见下)一起在贝尔实验室的项目组工作、负责研究C++程序开发环境中的对象模型,后来又担任著名的C++Report杂志编辑,此后他到迪斯尼旗下的梦工厂出任软件技术总监(Software Technology Director),主要著述有Essential C++、C++Primer、C++Gems、Inside the C++ Object Model、C#Primer等,关于作者的更详细信息可以到其个人网站(http://www.objectwrite.com,该网址笔者已验证无误)查询。Lippman当前在业界的影响力可以从最近发生的一件事情看出:不久前微软已经邀请了C++编程语言的先驱Stanley B.Lippman加盟它的Visual C++.Net开发小组,以打消广大的C++编程人员的疑虑。Essential C++是Lippman在C++ Primer之后的著作,可以说是厚积薄发的精髓之作。不要想当然地觉得这本书只有276页就是烹小鲜的入门向导——其实,我到觉得如果想通过一本书入门,1237页的C++ Primer或1109页的The C++ Programming Language更加适合。Essential C++分为7个章节,分别是C++基础、面向过程的编程风格、泛型编程风格、基于对象的编程风格、面向对象的编程风格、运用模板编程和异常处理。从结构的安排上我们可以看出作者的深意所在:并不是要手把手地教你键入和编译调试一个类似“Hello World”的程序,而是要一步一步地教会读者通过函数、指针、模板、类等构件形成一套完整的编程思想,在不同的需求情况下能够自如地使用面向过程或面向对象的方法进行程序设计,正如Bjarne Stroustrup在The C++ Programming Language一书中引用Kristen Nygaard(Simula语言的两位创造者之一)所说的“Programming is understanding”。如果你是一个新手,在阅读本书的时候不要忘了找一本更详细一些的参考教材——作者只用了30页的篇幅讲C++变成的基础知识,这里面还包括了数组、向量和指针等内容,《Essential C++中文版》(华中科技大学出版社,2001年8月第一版)已经出版,是侯捷的译著——恐怕业内很少有人不知道这位台湾大名鼎鼎电脑教育作家,建立在深刻理解基础上的翻译质量几乎可以说是无可挑剔了,但对于一些词汇的翻译方法和大陆翻译习惯的差异还有待磨合和改进(虽然译者坚持保留其繁体版译法)。
Effective C++(Addison Wesley Pub Co.,1997年9月第二版)没有教你C++语法或函数、对象、模板之类的东西,这是一本风格独到的经典技巧集,曾经获得过1992年度Jolt Award and Productivity Awards,作者教给你的是50个“改善程序技术与设计思维”的特别途径。Scott Meyers是C++业界公认的权威,主要从事软件开发咨询工作,活跃在全球各技术研讨会上,同时是C++ Report的重要专栏作家,知名著述出了Effective C++之外还有More Effective C++和Effective STL等,关于作者的更详细信息可以到其个人网站(http://www.aristeia.com)查询。《Effective C++中文版》(华中科技大学出版社,2001年9月第一版)也已经在国内翻译出版,译者还是侯捷。当你初步了解C++的全貌之后,Effective C++能够在短时间内大幅度地提高你C++编程的水平,此书的独特之处在于每一个你遇到的C++问题,Meyers都好像未卜先知地放在了书里,所有让你困惑的问题你几乎都可以在这本书中找到精辟的论述——如果能加Meyers的另一本巨著More Effective C++(Addison Wesley Pub Co.,1995年12月第一版)将更会锦上添花。本书在结构上分为改变旧有的C习惯、内存管理、构造析构函数与作业运算符、类与函数的设计和声明、类与函数的实现、继承关系与面向对象设计以及杂项讨论7个部分。很多人都认为你越熟悉C语言或其他面向过程的语言,在学习面向对象的语言的时候就会面临更大的困难,的确,如果你已经习惯了面向过程,在面向对象的时候你还是无法忘记过程,为此,Meyers在第一部分就提出了改变旧有的C习惯,通过几个小技巧让你能够尽量不受原有知识对新知识学习的干扰。在接下来的3个部分中,作者又针对让人头疼的内存管理问题(Java就宣称采用自动内存管理减少了编程复杂程度和出错几率是比C++的一大进步),随后,作者针对函数与类的构造析构、设计、实现等问题进行了详实的讨论,没有枯燥的长篇大论,都是结合实例的分析讲解——如果你刚学C++不久但已经可以独立编写一些简单的程序,你会发现所有被批判的问题程序中都可以找到自己的影子,这真是一件奇妙的事情!在“继承关系与面向对象设计”部分里作者没有喋喋不休地去讨论尚有争议的问题,而是把精力放在最基础的理念上,澄清了C++中类的继承体系设计与实现,并结合继承问题阐释了OOP。“杂项讨论”中作者主要讨论了编译、标准库等问题。打一个粗俗些的比方:Effec tiv e C++和M o re Effec tiv e C++就像是C++学习者的手挠,每一下都抓在你的痒处。
The C++ Programming Language(Addison Wesley Pub Co.,2000年2月第三版,高等教育出版社,2001年8月影印版)是无论哪一个C++学习者绝对、绝对不能错过的头号经典。Rogue Wave公司(Boland C++ Builder中STL方案的提供商)的Nathan Myers说:“15年之后,此书仍然是唯一一本无可替代的C++书籍。”只要有人推荐C++书籍,此书必在其中。正如侯捷先生1999年C++Primer繁体版前言中评价所说:“C++/OOP的领域极广……,不同的切入角度,都存在不同的经典好书。但如果考量的是语言全貌性(百科型)书籍,从来我只推荐两本,一是Bjarne Stroustrup的The C++ Programming Language,另一是Stanley B.Lippman的C++ Primer。这么说难免遗珠之憾,但是泰山北斗已现,又何必案牍劳形于墨瀚书海之中!这两本书都从C++盘古开天以来,一路改版,斩将搴旗,追奔逐北,成就一身荣光”。作者Bjarne Stroustrup是贝尔实验室大规模程序设计研究部门(Large-Scale Programming Research Department)负责人,AT&T、ACM成员,主要著述有The C++ Programm ing Language、The Design and Evolution of C++、The Annota ted C++ Reference Manual、C++ In-Depth Box Set(与别人合著)等。1979年Stroustrup开始开发一种语言,当时称为“C with Class”,后来演化为C++,并于1995年在贝尔实验室研制成功并投入使用的,Stro u strup也被称为“C++之父”,关于作者的更详细信息可以到其个人网站(http://www.research.att.com/~bs/homepage.html)查询。1998年,ANSI/ISOC++标准建立,同年,Strousturp推出了其经典著作The C++Programming Language的第三版。The C++Programming Language可是说非常全面、权威,充满了技术性极强的材料,很多地方值得反复回味与思索。Stroustrup说,他所接触和开发的软件无论是在大小、复杂性和难度来说,根本不是外界一般软件所能比拟的。本书虽然是一本计算机编程语言教程,但是处处体现出他对于软件开发和程序设计的看法。所以他在书中的很多观点虽然看上去不觉得有什么了不起的地方,但是当你面临到真正挑战的时候,就会深刻体会到其真知灼见非同一般。即便我们不考虑语言的障碍,这本书仍然比较难懂,作者很多地方点到即止,其中深意不是初学者能够真正领会的。这本书有个绰号——C++专家自学指南,也就是你必须先是专家,然后再来读此书自学提高。
C++ Primer是Lippman的成名大作——不要看到这个名字就真认为这是“C++的初级读本”,实际上它是一本标准的“从入门到精通”教材,目前该书的简体中文版还没有上市,我到处寻找其英文版也没能如愿,一个偶然的机会在朋友那里看到了侯捷(见上关于此书的评价)繁体中文版的C++Primer,大体翻看了一下,感觉此书在实例方面非常详尽,内容可谓是全面、权威,通俗易懂。初学者只要能够认真学通这本书,足以能自由使用C++编写程序,成为C++的高手。C++ Primer对标准C++提供了广泛的介绍,提供了一个思考性的C++学习方案,C++中的重要该概念诸如异常处理、容器类型、面向对象的程序设计等等都体现在字里行间,对语言规则也进行了深入地探讨,是一本非常好的入门也是提高的教程和参考。全书共分为20章,从C++最基本的元素、数据类型到面向过程的程序设计到泛型算法到基于对象与面向对象的程序设计等等,洋洋洒洒,蔚为大观。此书将由中国电力出版社近期推出简体中文版,由潘爱民(《COM原理与应用》的作者,《Visual C++技术内幕(第四版)》、《深入理解COM+》、《COM本质论》、《深入解析ATL》的译者)主译。
在国内,ISO/ANSIC/C++长期被忽视,很多软件公司的招聘广告上写的都是要求熟悉Visual C++或C++Builder——它们简直就成了C/C++的代名词!但ISO/ANSIC/C++有其不可替代的重要性,特别是在软件移植方面,记得我蓝格软件公司的董事长林燕峰先生(KCOM Space的作者)曾经和我说过要保证软件开发的可移植性和开发的可协作管理就必须遵从业界标准。值得庆幸的是今年出版界对标准C/C++书籍的渴求终于重视起来,纷纷出版经典C/C++书籍。关于C/C++的“不学C,无以言”到此已经结束,但并不是说已经囊括了C/C++的全部经典书籍,像Exceptional C++(Herb Sutter著,Addison Wesley Pub Co.,1999年12月第一版)、《实用C语言编程》(Steve Oualli著,O Reilly & Associates,1997年9月第三版,中国电力出版社,2000年5月中文第三版)、《C/C++嵌入式系统编程》(Michael Barr著,O Reilly & Associates,1999年2月第一版,中国电力出版社,2001年3月中文第一版)等等,或因不得见其书、或因技术领域太过专细,皆成明代
计算机经典书籍
【程式语言:C】
1) C : How to Program 0132261197 PTH/1994-2ed
***教科书,初学C语言可考虑
2) the c progamming language 0131103628 PTH/1988-2ed
***K&R所着,乃C之bible中的bible,为c programmer 必读之书藉。惟不适合初学者,进阶用书
3) The C Answer Book 0131096532 PTH/1988-2ed
***K&R的解答本....好贵:<....所以不买了....:)
4) C: The Complete Reference 0078821010 McGraw/1995-3ed
***评价直逼K&R的一本好书....可能也不适合初学者(我没看过)
C++:
http://www.csdn.net/expert/jjhou/
1.C++ Primer 3/e(Lippman/AW) 原文书即将出版。旧版有无中译?
2.The C++ Programming Language 3/e(Stroustrup/AW) 有无中译?儒林?
3.Inside The C++ Object Model(Lippman/AW) 棋峰将有中译本
1) C++ primer 0201824701 A-W/1998-3ed
***一本十分适合初学者拿来学习的书....
以下为候捷老师的评语:
在「C++ 百科」类书中,与 The C++ Programming Language 齐名,亲和性较佳。老字号,有口碑。副作者 Josee Lajoie 是 ANSI/ISO C++ Standard 委员会的核心语言工作小组主席,因此本书在与C++ Standard 的密合度上,当可令人放心。
2) the C++ programming language 0201889544 A-W/1998-3ed
***以下为候捷候老师评语:
属「C++ 百科」级的书。此书可谓 C++ 原典,具权威性,由 C++ 之父所着。连 ANSI C++ 制定时都得叁考此书。不论是内容深度或文字风格,都不适合生手,但很适合做为进阶研究或叁考查阅壮胆之用。原文书之code 编排令我感到不舒服,行文之间学院派的味道颇重。本书为与C++ Standard 相映合,有份量极重之 errata,务请读者上网下载。
3) Thinking in C++ 0139177094 PTH/1995-1ed
***以下为候捷候老师评语:
也属「C++ 百科」类书。口碑甚佳,唯目录所列页次与实际页次 offset 4 1/e 年代过於陈旧,当此 C++ Standard 已定案之际,应属过时。
ps.第二版将不会有以上现象,但还未完书
//蒋按:大陆版有Thinking in Java
4) C++ Standard 抱歉我查不到资料....
***以下为候捷候老师评语:
醉心学术以及喜欢看 definition 的人,一定会喜欢。有此资料在手,与人争辩 C++ 时可使用最大的胆子和最大的分贝。电子版(PDF 格式)
可於 http://webstore.ansi.org/ 购得,US$ 18.0。列印出来装订得
美美的,摆在架上足以唬人。
5) Effective C++, 2nd Edition: 0201924889 A-W/1998-2ed
50 Specific Ways to Improve Your Programs and Designs
***以下为候捷候老师评语:
以条列方式列出 50 条宝贵的程式经验。每一条均有深入的原理说明。适合有 C++ programming 经验者。
//蒋按:有大陆版
6) More Effective C++: 020163371x A-W/1996-1ed
35 More Ways to Improve Your Programs and Designs
***以下为候捷候老师评语:
以条列方式列出 35 条宝贵的程式经验。每一条均有深入的原理说明。
适合有 C++ programming 经验者。
7) Inside the C++ Object Model 0201834545 A-W/1996-1ed
***以下为候捷候老师评语:
适合给已有 C++ 经验的人阅读。可为你扎下 C++ 内部机制的深厚基础。原文书笔误极多(100 个以上,大大小小),影响阅读甚巨,建议读中译本。对大部份人而言,chap3,4 可带来最大边际效益。
8) The Design and Evolution of C++ 0201543303 A-W/1994-1ed
9) The Annotated C++ Reference Manual 0201514591 A-W/1990-1ed
10)Advanced C++ Programming Styles and Idioms 0201548550 A-W/1991-1ed
11)C++ Programming Style
Assemble:
1. Microsoft Macro Assembler Bible 2/e(Barkakati/SAMS) 峰中译
2. PC Assembly Language and Programming 0137566107 PTH/1997-4ed
Windows:
http://www.csdn.net/expert/jjhou/
1.Windows 2000系统编程 原书名: Windows 2000 Systems Programming Black Book
原出版社 Coriolis 作者: Al Williams 译者: 钮文良 姜余祥 申功迈 尤克
2.windows NT/2000本机API参考手册 Gray Nebbett,机工
1。Windows 2000 内部揭密 原书名: Inside Microsoft Windows 2000,Third Edition
原出版社 Microsoft Press 作者: (美)David A.Solomon Mark E.Russinovich
译者: 詹剑锋 等译
2。inside win2000
1 rogramming Windows 95(Petzold/MP) 松格中译
//注:大陆版-清华大学出版社
2. Windows 95 : A Developer's Guide(Richter/M&T Books) 棋峰中译
//注:大陆版-清华大学出版社
3 System Programming for Windows 95(Oney/MP)松岗将有中译
4 Writing Windows VxDs and Device Deviers 2/e(Hazzah/R&D Books)无中译本
5 Windows 95 System Programming Secrets(Matt/IDG Books)旗标中译
//注:大陆版-清华大学出版社
6 Advanced Windows 3/e(Richter/Microsoft Press)松岗中译
7 The Windows NT Device Driver Book(Baker/Prentice Hall)
COM
1. Essential COM(Don Box/Addison Wesley) 棋峰将有中译
Cmpiler:
Compilers Principles, Techniques, and tools 0201100886 A-W/1986-1ed
【Computer Architecture】
1) Computer Organization and Design : 1558604286 Morgan/1997-2ed
The Hardware/Software Interface
***大学教科书(计算机组织),这个topic的入门书
2) Computer Architecture : 1558603298 Morgan/1996-2ed
A Quantitative Approach
***大学教科书(计算机组织),这个topic的入门书
3) Computer Architecture : Concepts and Evolution 0201105578 A-W/1997-1ed
【Unix】
1。Linux内核情景分析,上,下册。浙江大学出版社
2。Linux内核源代码分析(美)[S.麦克斯韦尔]
3。Linux编程白皮书
4。Linux IP协议栈源代码分析
5。莱昂氏unix源代码分析
6.Running Linux (3rd Edition) by Matt Welsh, Matthias Kalle Dalheimer, Lar Kaufman, Matthew Welsh
7.Hacking Linux Exposed by Brian Hatch, James B. Lee, George Kurtz
8.Linux System Administration (Linux Library)
by Vicki Stanfield, Roderick Smith, Roderick W. Smith
9.Linux Complete by Sybex (Editor)
5) Unix system administration handbook 0131510517 PTH/1995-2ed
***网路上昵称其为"红皮书",系统,网路都说的十分详细,无可挑惕!!
进阶用书,不适合初学者
1) Unix internals -the new frontiers 0131019082 PTH/1996-1ed
***深入UNIX.....进阶用书(SVR4 BSD都有讨论)
2) 4.4 BSD Operating System 0201549794 A-W/1996-2ed
***同上,但以4.4BSD为主题
3) The Magic Garden Explained : The 0130981389 PTH/1994-1ed
Internals of Unix System V Release 4 : An Open Systems Design
***同上,但以SVR4为主题。台湾没有书,我是向国外订的
(听说台大图书馆有喔~~~)
4) The Design of the UNIX operating system 0132017997 PTH/1986-1ed
***同上,BACH着,很多教科书都指名它为reference....
5) Lions' Commentary on Unix : With Source Code 1573980137 P-t-P/1996-6th
6) Unix Internals : A Practical Approach 020187721X A-W/1996-1ed
7) Unix Systems for Modern Architecture 0201633388 A-W/1994-1ed
: Symmetric Multiprocesssing and Caching for Kernel Programmers
8) The Linux Kernel Book 0471981419 Wiley/1998-1ed
***我觉得翻译得怪怪的(因为它是由别国语言翻成英文)....
最好先对kernel有多些概念再读会较好....
9) Linux Kernel Internals 0201331438 A-W/1997-2ed
***讨论linux kernel的书,恐龙书上在linux部分的reference,个人推荐
10)Linux Device Drivers 1565922921 O'reilly/1998-1ed
***网友推荐,作者是来自义大利的骇客....
1) Advanced programming in the UNIX environment 0201563177 A-W/1992-1ed
***Richard Steven所着,十分适合对系统,C有基础的人,亦是一本好的manual
2) UNIX systems programming(for SVR4) 1565921631 O'relly/1997-1ed
***网路上评语为其讨论内容过杂,但我觉得满适合拿来当reference
1) managing projects with make 0937175900 O'reilly/1993-2ed
***对make有详细的说明
2) programming with GUN SOFTWARE 1565921127 O'reilly/1997-1ed
***个人强力推荐!!教你用emacs,gcc,gdb,gmake....
1) A Practical Guide to Linux 0201895498 A-W/1997-1ed
***(A Practical Guide to UNIX的再版)
Linus写序提到, 他当初就是用这本书学Unix, 没想到七年後很荣幸的为
作者写序.
2) Running Linux ?????????? O'Reilly/1999-3ed
3) Linux Network Administrator's Guide ?????????? O'Reilly/1999-2ed
【系统安全】
1) maximum Security:A hacker's guide to 0672313413 Sams/1998-2ed
protecting your internet site and network
2) Cracking Des : Secrets of Encryption 1565925203 O'reilly/1998-1ed
Research, Wiretap Politics & Chip Design
3) Practical Unix and Internet Security 1565921488 O'reilly/1996-2ed
4) Building Internet Firewalls 1565921240 O'reilly/1995-1ed
Netword:
3) internetworking with TCP/IP vol 1: 0132169878 PTH/1995-3ed
Principles, Protocols, and Architecture
4) internetworking with TCP/IP vol 2: 0130102210 PTH/1999-3ed
design,implementation and internals
5) internetworking with TCP/IP vol 3: 0132621487 PTH/1996-2ed
client-server programming and application
***以上三本乃comer所着,属bible级读物。为大学教科书.....
vol1讲TCPIP的原理,vol2讲TCPIP的implementation,vol3讲APP的写作
另外vol3分成三个版本,分别为BSDsockets,winsock,TLI
6) TCP/IP illustrated vol 1 0201633469 A-W/1994-1ed
7) TCP/IP illustrated vol 2 020163354x A-W/1995-1ed
8) TCP/IP illustrated vol 3 0201634953 A-W/1996-1ed
***以上三本乃Richard Steven所着,影响小弟甚深,bible级读物。
vol1讲TCPIP的原理,vol2讲TCPIP的implementation,vol3讲APP的写作
10)UNIX network programming 0136493289 PTH/1998-2ed
vol 1:networking API:Sockets and XTI
***以上两本亦为Richard Steven所着,第一本为第一版,小弟无缘
第二本为第二版,强力推荐!!
11)UNIX network Programming 0130810819 PTH/1998-2ed
vol 2: Interprocess Communications
***以IPC为主题,觉得"杂"了点....但不失为一代宗师之作
【Data structure and algorithm】
1。数据结构算法与应用-C++语言描述(英文版) 原书名: Data Structures,Algorithms, and Applications in C++ 原出版社 McGraw-hill 作者: Sartaj Sahni
2。数据结构与程序设计——C++语言描述(影印版)原出版社 Prentice Hall/Pearson
作者: Robert L.Kruse,Alexander J.Ryba
3。数据结构C++语言描述 原书名: Data Structures C++
原出版社 作者: William Ford,William Topp 译者: 刘卫东 沈官林
4。数据结构 C++语言描述(英文影印版)原书名: Data Structures with C++
原出版社 Prentice Hall/Pearson 作者: William Ford ,William Topp
5。数据结构与算法分析 原书名: A Practical Introduction to DATA STRUCTURES AND ALGORITHM ANALYSIS 原出版社 作者: CLIFFORD A.SHAFFER 译者: 张铭 刘晓丹
6。数据结构算法与应用-C++语言描述 原书名: Data Structures, Algorithms, and Applications in C++ 原出版社 Mcgraw-Hill 作者: Sartej Sahni 译者: 汪诗林等
1) Fundamemtals of DATA STRUCTURES IN C 0716782502 CS/1993-1ed(?)
***大学教科书(data structure),另有PASCAL,C++版本
//蒋按:有大陆版
2) Introduction to algorithms 0262031418 MIT/1990-1ed
***大学教科书(algorithm)
3) Computer Algorithms/C++ 0716783150 CS/1996-1ed
***大学教科书(algorithm),另有PASCAL版本。
不必我说,IA和CA两本都是超棒的!!都拿来读读,多读几次......
阅读顺序由个人选择。我选CA->IA
//蒋按:有大陆版
4) The Art of Computer Programming (Vol 1): 0201896834 A-W/1997-3ed
Fundamental Algorithms
5) The Art of Computer Programming (Vol 2): 0201896842 A-W/1997-3ed
Seminumerical Algorithms
6) The Art of Computer Programming (Vol 3): 0201896850 A-W/1998-2ed
Sorting and Searching
***以上三本....我不必介绍了吧??(好想找时间完整的研究一次....)
7) Distributed Algorithms 1558603484 M-K/1997-1ed
***还没玩完,但只想说: 真的好棒!!
【作业系统通论】
1) Operating System concepts 0201591138 A-W/1997-5ed
***大学教科书(operating system),俗称"恐龙书"。很棒的作业系统入门书
2) Modern operating system 9813076623 PTH/1996-2ed
***大学教科书,配合恐龙书服用,效果加倍
3) Operating systems design and implememtation 0136301959 PTH/1997-2ed
***大学教科书(advanced operating system)
教你写一个完整的OS(Minix),不含网路系统
4) Distributed Operating systems 0131439340 PTH/1995-2ed
系统分析,设计,软件工程:
1。《软件工程》实践者的研究方法
Software Engineering A Practitioner's Approach Fourth Edition
(美)Roger S.Pressman著
黄柏素 梅宏 译
机械工业出版社
3。软件工程实践者之路(第5版)(英文影印版)
ROGER S.PRESSMAN/ 7-302-04139-3/清华大学出版社/ 2001-1-1出版
4。软件需求
Karl E.Wiegers/ 7-111-08127-7/机械工业出版社/
2。软件工程——理论与实践(第二版 影印版)
(美)Shari Lawrence Pfleeger/ 7-04-010099-1/高等教育出版社/
3。能力成熟度模型(CMM):软件过程改进指南
(美)卡耐基梅隆大学软件工程研究所/ 7-5053-6729-3/电子工业出版社/
6。面向对象系统分析与设计
Ronald J.Norman/ 7-302-02342-5/清华大学出版社/
7。面向对象系统分析与设计(英文影印版)
Ronald J.Norman/ 7-302-02944-X/清华大学出版社/ 1999-10-1出版
8.系统分析与设计方法(第五版 影印版)原出版社 Prentice Hall/Pearson
作者: Jeffrey L.Whitten,Lonnie D.Bentley,Kev
Java"
1。thinking in java
2。Java2核心技术系列
3。J2EE服务器端高级编程 Professional Java Server Programming J2EE Edition
原出版社 Wrox Press 作者: (美)Subrahmanyam Allamaraju 等著
4。J2EE平台上的EJB组件开发 Applying Enterprise JavaBeans Component-Based Development for the J2EE Platform
原出版社 Addison Wesley/Pearson 作者: (美)Vlada Matena Beth Stearns
5。 《Mastering EJB II》Ed Roman http://www.theserverside.com
6。Enterprise JavaBean
7.《Java in a Nutshell 》 David Flanagan
8.JAVA与XML 原出版社 O'Reilly 作者: (美)Brett McLaughlin 译者: 孙照林 汪东 王鹏
9.Effective Java(TM) Programming Language Guide by Joshua Bloch
10.Core J2EE Patterns: Best Practices and Design Strategies
by Deepak Alur, John Crupi, Dan Malks
11.J2EE Applications and BEA WebLogic Server by Michael Girdley, Rob Woollen, Sandra L. Emerson
12.Professional EJB
XML:
1.Java & XML, 2nd Edition: Solutions to Real-World Problems by Brett McLaughlin
2.XML in a Nutshell : A Desktop Quick Reference (Nutshell Handbook)
by Elliotte Rusty Harold, W. Scott Means
3.XML高级编程 原书名: Professional XML 原出版社 Wrox Press 作者: Didier Martin
译者: 李喆 严春莹 马琳
4.Java XML编程指南 原书名: Professional Java XML Programming
作者: (美)Tom Myers Alexander Nakhimovsky 译者: 王辉 张晓辉 等
面向对象的软件开发
引自:http://www.gdit.edu.cn/html/dept/software/article/6.htm
Linda M. Northrop
Software Engineering Institute
1 历史回顾
针对日趋复杂的软件需求的挑战,软件业界发展出了面向对象(OO)的软件开发模式。目前作为针对"软件危机"的最佳对策,OO技术已经引起人们的普遍关注。最初被多数人看作只是一种不切实际的方法和满足一时好奇心的研究,现在得到了人们近乎狂热的欢迎。许多编程语言都推出了支持面向对象的新版本。大量的面向对象的开发方法被提出来。关于OO的会议、学术研讨班和课程极受欢迎。无数专业的学术期刊都为这一话题开辟了专门的版面。一些软件开发合同甚至也指明了必须使用OO的技术和语言。面向对象的软件开发对于90年代,就向是结构化的软件开发对于70年代那样让人着迷,而且OO的发展势头还在日益加速。
诸如"对象"和"对象的属性"这样的概念,可以一直追溯到1950年代初。它们首先出现于关于人工智能的早期著作中。然而,OO的实际发展却是始于1966年 (当年文化大革命在中国爆发) 。 当时Kisten Nygaard和Ole-Johan Dahl开发了具有更高级抽象机制的Simula语言。Simula提供了比子程序更高一级的抽象和封装;为仿真一个实际问题,引入了数据抽象和类的概念。 大约在同一时期,Alan Kay正在尤他大学的一台个人计算机上努力工作,他希望能在其上实现图形化和模拟仿真。尽管由于软硬件的限制,Kay的尝试没有成功,但他的这些想法并没有丢失。70年代初期,他加入了Palo Alto研究中心(PARC),再次将这些想法付诸实施。
在PARC,他所在的研究小组坚信计算机技术是改善人与人、人与机器之间通讯渠道的关键。在这信念的支持下,并吸取了Simula的类的概念,他们开发出Smalltalk语言;1972年PARC发布了Smalltalk的第一个版本。大约在此时,"面向对象"这一术语正式确定。Smalltalk被认为是第一个真正面向对象的语言。 Smalltalk 的目标是为了使软件设计能够以尽可能自动化的单元来进行。在Smalltalk中一切都是对象-----即某个类的实例。最初的Smalltalk的世界中,对象与名词紧紧相连。Smalltalk还支持一个高度交互式的开发环境和原型方法。这一原创性的工作开始并未发表,只是视为带浓厚试验性质的学术兴趣而已。
Smalltalk-80是PARC的一系列Smalltalk版本的总结,发布于1981年。1981年8月的<<BYTE>>杂志公布了Smalltalk开发组的重要结果。在这期杂志的封面图上,一个热气球正从一个孤岛上冉冉升起来,标志着PARC的面向对象思想的启航。该是向软件开发界公开发表的时候了。起初,影响只是渐进式的,但很快就跃升到火爆的程度。热气球确实启航了,而且影响深远。早期Smalltalk关于开发环境的研究导致了后来的一系列进展:窗口(window),图标(icon),鼠标(mouse)和下拉式window环境。Smalltalk语言还影响了80年代早期和中期的面向对象的语言,如:Object-C(1986), C++(1986), Self(1987),Eiffl(1987),Flavors(1986). 面向对象的应用领域也被进一步拓宽。对象不再仅仅与名词相联系,还包括事件和过程。1980 Grady Booch首先提出面向对象设计(OOD)的概念。然后其他人紧随其后,面向对象分析的技术开始公开发表。1985年,第一个商用面向对象数据库问世。1990年代以来,面向对象的分析、测试、度量和管理等研究都得到长足发展。目前对象技术的前沿课题包括设计模式(design patterns)、分布式对象系统和基于网络的对象应用等。
2 动因
为什么面向对象运动发展到了现在这样火暴的程度?部分是源于人们长久以来的一个希望:人们希望它,象以前其他的软件开发技术一样,能够满足软件开发对于生产效率、可靠性、易维护性、易管理等方面的更高、更快、更强的迫切需求。除此之外,还有许多原因都促使了它的流行。
面向对象的开发强调从问题域的概念到软件程序和界面的直接映射;心理学的研究也表明,把客观世界看成是许多对象更接近人类的自然思维方式。对象比函数更为稳定;软件需求的变动往往是功能相关的变动,而其功能的执行者----对象----通常不会有大的变动。另外,面向对象的开发也支持、鼓励软件工程实践中的信息隐藏、数据抽象和封装。在一个对象内部的修改被局部隔离。面向对象开发的软件易于修改、扩充和维护。
面向对象也被扩充应用于软件生命周期的各个阶段---从分析到编码。而且,面向对象的方法自然而然地支持快速原型法和RAD(Rapid Application Development)。面向对象开发的使用鼓励重用,不仅软件的重用,还包括分析、设计的模型的重用。更进一步,OO技术还方便了软件的互换性,即,网络中一个节点上应用能够利用另一个节点上的资源。面向对象的开发还支持并发、层次和复杂等一些在目前的软件系统中常见的现象。今天我们常常会需要建造一些软件系统----不止是一黑盒应用。这些复杂系统通常包含由多个子系统组成的层次结构。面向对象的开发支持开放系统的建设;利用不同的应用来进行软件集成有了更大的柔性。最后,面向对象开发的使用可以减小开发复杂系统所面临的危险,主要是因为系统集成遍布软件生命周期的各个阶段。
3 面向对象的建模
面向对象的建模不仅仅是新的编程语言的汇总。它是一种新的思维方式,一种关于计算和信息结构化的新思维。面向对象的建模,把系统看做是相互协作的对象,这些对象是结构和行为的封装,都属于某个类,那些类具有某种层次化的结构。系统的所有功能通过对象之间相互发送消息来获得。面向对象的建模可以视为是一个包含以下元素的概念框架:抽象、封装、模块化、层次、分类、并行、稳定、可重用和可扩展性。
面向对象的建模的出现并不能算是一场计算革命。更恰当地讲,它是面向过程和严格数据驱动的软件开发方法的渐进演变结果。软件开发的新方法受到来自两个方面的推动:编程语言的发展和日趋复杂的问题域的需求驱动。尽管在实际中分析和设计在编程阶段之前进行,但从发展历史看却是编程语言的革新带来设计和分析技术的改变。同样,语言的演变也是对计算机体系的增强和需求的日益复杂的自然响应。
影响OO产生的诸多因素中,最重要的可能要算是编程方法的进步了。在过去的几十年中,编程语言中对抽象机制的支持已经发展到了一个较高的水平。这种抽象的进化从地址(机器语言)到名字(汇编语言),到表达式(第一代高级语言,如Fortran),到控制(第二代高级语言,如Cobol),到过程和函数(第二代和早期第三代高级语言,如Pascal),到模块和数据(晚期第三代高级语言,如modula),最后到对象(基于对象和面向对象的语言)。Smalltalk和其他面向对象语言的发展使得新的分析和设计的技术的实现成为可能。
这些新的OO的技术实际上是结构化和数据库方法的融合。OO的方法中,小范围内对面向数据流的关注,如偶合和聚合,也是很重要的。同样,对象内部的行为最终也需要面向过程的设计方法。数据库技术中的实体-关系(ER图)的数据建模思想也在 OO的方法中得以体现。
计算机硬件体系结构的进步,性能价格比的提高和硬件设计中对象概念的引入都对OO的发展产生了一定的影响。OO的程序通常要更加频繁地访问内存,需要更高的处理速度。他们需要并且也正在利用强大的计算机硬件功能。哲学和认知科学的层次和分类理论也促进了OO的产生和发展。最后,计算机系统不断增长的规模、复杂度和分布性都对OO技术起了或多或少的推动作用。
因为影响OO发展的因素很多,OO技术本身还未成熟,所以在思想和术语上有很多不同的提法。所有的OO语言并非生而平等,他们在术语、概念的运用上也各不相同。尽管也存在统一的趋势,但就如何进行面向对象的分析、设计而言还没有完全达成共识,更没有统一的符号来描述这些活动。(说明:UML正在朝这方向努力) 但是,OO的开发已经在以下领域被证明是成功的:空中交通管理、动画设计、银行、商业数据处理、命令和控制系统、CAD、CIM、数据库、专家系统、图象识别、数学分析、音乐合成、操作系统、过程控制、空间站软件、机器人、远程通讯、界面设计和VLSI设计。毫无疑问,OO技术的应用已经成为软件工业发展的主流。
4 面向对象编程
<1> 概念
在面向对象编程中,程序被看作是相互协作的对象集合,每个对象都是某个类的实例,所有的类构成一个通过继承关系相联系的层次结构。面向对象的语言常常具有以下特征:对象生成功能、消息传递机制、类和遗传机制。这些概念当然可以并且也已经在其他编程语言中单独出现,但只有在面向对象语言中,他们才共同出现,以一种独特的合作方式互相协作、互相补充。
过程化编程模式: 参数输入----- | 代 码 | ------结果输出
为实现某个功能,参数被传入某个处理过程,最后传回计算结果。
| 对象------ 数据结构 面向对象编程模式:
界面 | 对象------ 和
| 对象------ 操作
OOP中,功能是通过与对象的通讯获得的。对象可以被定义为一个封装了状态和行为的实体;或者说是数据结构(或属性)和操作。状态实际上是为执行行为而必须存于对象之中的数据、信息。对象的界面,也可称之为协议,是一组对象能够响应的消息的集合。 消息是对象通讯的方式,因而也是获得功能的方式。对象受到发给他的消息后,或者执行一个内部操作(有时成为方法或过程),或者再去调用其他对象的操作。所有对象都是类的实例。类是具有相同特点的对象的集合,或者也可以说,类是可用于产生对象的一个模版。对象响应一个消息而调用的方法,由接受该消息的对象自己决定。 类可以以一种层次结构来安排。在这个层次结构中,子类可以从比他高的超类中继承得到状态和方法。当对象接收到一个消息后,寻找相应的方法的过程将在从该对象的类开始,并在该类所处的层次结构中展开,最后,直到找着该方法,或者什么也没找到(将会报错)。在某些语言中,一个给定的类可以从不止一个超类中继承,称之为多继承。如果采用动态联编,继承就导致了多态性。多态性描述的是如下现象:如果几个子类都重新定义了超类的某个函数(都用相同的函数名),当消息被发送到一个子类对象时,在执行时该消息会由于子类确定的不同而被解释为不同的操作。 方法也可以被包括在超类的界面中被子类继承,而实际上并不去真正定义他。这样的超类也叫抽象类。抽象类不能被实例化,因此也就只能被用于产生子类。
<2> 语言
面向对象的语言包含4个基本的分支:
1 基于Smalltalk的; 包括smalltalk的5个版本,以Smalltalk-80为代表。
2 基于C的; 包括 objective-C, C++, Java
3 基于LISP的; 包括 Flavors, XLISP, LOOPS, CLOS
4 基于PASCAL的。包括 Object Pascal, Turbo Pascal, Eiffel, Ada 95
Simula实际上是所有这些语言的老祖宗。在这些OO语言中,术语的命名和支持OO的能力都有不同程度的差别。 尽管Smalltalk-80不支持多继承,它仍被认为是最面向对象的语言(the truest OO language)。
在基于C的OO语言中,Object-C 是Brad Cox开发的,它带有一个丰富的类库,已经被成功用于大型系统的开发。C++是由贝尔实验室的Bjarne Stroustrup写的。它将C语言中的STRUCT扩展为具有数据隐藏功能的CLASS。多态性通过虚函数(virtual functions)来实现。C++ 2.0 支持多继承。在多数软件领域,尤其是Unix平台上,C++都是首选的面向对象编程语言。 同C和C++相类似的新一代基于Internet的面向对象语言Java是由Sun microsystems研制的。它于1995年伴随着Internet的崛起而风靡一时。用Java写的applets可以嵌入HTML中被解释执行,这使它具备了跨平台特性。Java和Ada一样支持多线程和并发机制,又象C一样简单、便携。
基于LISP的语言,多被用于知识表达和推理的应用中。其中CLOS(Common LISP Object System)是面向对象LISP的标准版。
在基于Pascal的语言中,Object Pascal是由Apple和Niklaus Wirth为Macintosh开发的,它的类库是MacApp。Turbo Pascal 是Borland公司以Object Pascal为范本开发的。
Eiffel由交互软件工程公司的Bertrand Meyer于1987年发布的。它的语法类似Ada,运行于Unix环境。Ada在1983年刚出来时并不支持继承和多态性,因而不是面向对象的。到了1995年,一个面向对象的Ada终于问世,这就是Ada 95。
除了上述的面向对象的语言之外,还有一些语言被认为是基于对象(Object-based)的。它们是:Alphard, CLU, Euclid, Gypsy, Mesa, Modula。
5 面向对象的软件工程
生命周期
尽管面向对象的语言正在取得令人激动的进展,但我们都知道,编码并非是软件开发中的问题的主要来源。相比之下,需求和分析的问题更加普遍,而且它们的纠错代价更加昂贵。因此, 对OO开发技术的关注就不能仅仅集中在编码上面,更应集中关心软件工程的其他方面。OO方法在处理复杂系统的分析和设计、分析和设计的重用方面的应用前景也是非常可观。如果我们承认OO的软件开发不仅仅局限于编码活动,那么就必须采用一种全新的开发模式,包括新的软件生命周期。 目前最常见的生命周期是"瀑布"模型(结构化)。它是在60年代末"软件危机"后出现的第一个生命周期模型。如下所示。
分析 ----- 设计 ----- 编码 ----- 测试 ------ 维护
如图所示,瀑布式生命周期的开发过程是顺序行进的;活动流向基本是单向的。它假设开发者在开发初期对系统的了解足够清楚。不幸的是,任何软件开发活动都不可避免地要涉及大量迭代过程,无论你事先是否安排。好的设计人员指的是那些能同时在抽象的层面和具体的细节上进行工作的实践家。总的来说,瀑布式生命周期的缺点表现在三个方面:<1> 后期的变化、迭代、改动困难 <2> 不支持重用 <3> 没有一个联系各个阶段的统一模型。
面向对象的方法从问题模型开始,然后就是识别对象、不断细化的过程。它从本质上就是迭代的和渐增的。在这里,快速原型和反馈环路是必需的标准结构。开发过程就是一次次的迭代反复过程。随着迭代的进行,系统的功能不断完善。这里,传统的开发模式中在分析、设计和编码等各个阶段之间的明显界限变得模糊起来。其原因是因为对象的概念弥漫了整个开发过程。对象和它们之间的关系成为分析、设计和编码等各个阶段的共同表达媒介。开发的重心从编码向分析偏移,从功能为中心向数据为中心偏移。而且,面向对象开发的迭代和无缝性使得重用变得更加自然。
近来,为改善面向对象开发的可管理性,玻姆(Boehm,1988)提出了一个结合了宏观和微观视角(macro & microview)的螺旋开发模型。宏观包括3个阶段:1分析---发现和识别对象;2 设计---发明和设计对象;3 实施---创建和实现对象。每个宏观阶段都包含一些微观迭代活动。
6 OOA和OOD
由于面向对象的技术还比较新,目前存在许多种面向对象的分析和设计方法。面向对象的分析(OOA)建立于以前的信息建模技术的基础之上,可以定义为是一种以从问题域词汇中发现的类和对象的概念来考察需求的分析方法。OOA的结果是一系列从问题域导出的"黑箱"对象。OOA通常使用"剧情(scenarios)"来帮助确定基本的对象行为。一个剧情是发生在问题域的一个连续的活动序列。在对一个给定的问题域进行 OOA时,"框架"(Frameworks)的概念非常有用。框架是应用或应用子系统的骨架,包含一些具体或者抽象的类。或者说,框架是一个特定的层次结构,包含描述某一问题域的抽象父类。当下流行的所有的OOA方法的一个缺点就是他们都缺乏一种固定的模式(formality)。
在面向对象的设计(OOD)阶段,注意的焦点从问题空间转移到了解空间。OOD是一种包含对所设计系统的逻辑的和物理的过程描述,以及系统的静态和动态模型的设计方法(Booch,1994)。
在OOA和OOD中,都存在着对重用性的关注。目前,OO技术的研究人员们正在尝试定义"设计模式(design patterns)"这一概念。它是一种可重用的"财富",可以应用于不同的问题域。通常,设计模式指的是一种多次出现的设计结构或解决方案。如果对他们进行系统的归类,即可被重用,可以构成不同设计之间通信的基础。
OOD技术实际上早于OOA技术而出现。目前在OOA和OOD已经很难画出一条清晰的界限。因此,下面的描述给出一些常用的OOA/OOD技术的(联合)概貌。
Meyer 用语言作为表达设计的工具。(1988)
Booch的OOD技术扩展了他以前在Ada方面的工作。他采用一种"反复综合(round-trip gestalt)"的方法,包括以下过程:识别对象,识别对象的语义,识别对象之间的关系,进行实施,同时包含一系列迭代。Booch是最先使用类图,类分类图,类模板和对象图来描述OOD的人(1991)。
Wrifs-Brock's的OOD技术是由职责代理来驱动的。类职责卡(Class Responsibilities Cards)被用来记录负责特定功能的类。在确定了类及其职责之后,再进行更详细的关系分析和子系统的实施。(1990)
Rumbaugh使用3种模型来描述一个系统:1 对象模型,描述系统中对象的静态结构;2 动态模型,描述系统状态随时间变化的情况;3 功能模型,描述系统中各个数据值的转变。对象图,状态转换图和数据流图分别被用于描述这3个模型。(1991)
Coad和Yourdon采用以下的OOA步骤来确定一个多层OO模型(5个层次):找出类和对象,识别结构和关系,确定主题,定义属性,定义服务。5个步骤分别对应模型的5个层次,即类和对象层,主题层,结构层,属性层和服务层。他们的OOD方法既是多层次的又是多方面的(multicomponent)。层次机构和OOA一样。多方面包括:问题域,人与人的交互,任务管理和数据管理。
Ivar Jacobson 提出了Objectory方法(或Jacbson法),一种他在瑞典Objective系统中开发的面向对象软件工程方法。Jacbson的方法特别强调了"Use Case"的使用。 Use Case成为分析模型的基础,用交互图(Interaction Diagram)进一步描述后就形成设计的模型。Use cases同时也驱动测试阶段的测试工作。到目前为止,Jacbson法是最为完整的工业方法。 (1992)
以上所述的方法还有许多的变种,无法一一列出。近年来,随着各种方法的演变,它们之间也互相融合。1995年,Booch,Rumbaugh和Jacbson联手合作,提出了第一版的UML(Unified Modelling Language),一体化建模语言。(目前已经成为OO建模语言的事实标准)
7 管理问题
当组织向面向对象的开发技术转向时,支持软件开发的管理活动也必然要有所改变。承诺使用OO技术即意味要改变开发过程,资源和组织结构。(Goldberg 1995) OO开发的迭代、原型以及无缝性消除了传统开发模式不同阶段之间的界限。新的界限必须被重新确定。同时,一些软件测度的方法也不在适用了。"代码行数"LOC(Lines of Code)绝对过时了。重用类的数目,继承层次的深度,类与类之间关系的数目,对象之间的耦合度,类的个数以及大小显得更有意义。在OO的软件测度方面的工作还是相当新的,但也已经有了一些参考文献。(Lorenz 1993)
资源分配和人员配置都需要重新考虑。开发小组的规模逐步变小,擅长重用的专家开始吃香。重点应该放在重用而非LOC上。重用的真正实现需要一套全新的准则。在执行软件合同的同时,库和应用框架也必须建立起来。长期的投资策略,以及对维护这些可重用财富的承诺和过程,变的更加重要。
至于软件质量保证,传统的测试活动仍是必须的,但它们的计时和定义必须有所改变。例如,将某个功能"走一遍"将牵涉到激活一个剧情(scenario),一系列对象互相作用,发送消息,实现某个特定功能。测试一个OO系统是另一个需要进一步研究的课题。发布一个稳定的原型需要不同与以往控制结构化开发的产品的配置管理。
另一个管理方面要注意的问题是合适的工具支持。一个面向对象的开发环境是必须的。同时需要的还包括:一个类库浏览器,一个渐增型编译器,支持类和对象语义的调试器,对设计和分析活动的图形化支持和引用检查,配置管理和版本控制工具,以及一个象类库一样的数据库应用。
除非面向对象开发的历史足以提供有关资源和消耗的数据,否则成本估算也是一个问题。计算公式中应该加入目前和未来的重用成本。最后,管理也必须明白在向面向对象方法转变的过程中要遇到的风险。如消息传递、消息传递的爆炸增长、动态内存分配和释放的代价。还有一些起步风险,如对合适的工具,开发战略的熟悉,以及适当的培训,类库的开发等。
8 向面向对象转变
这个转变的时期可能相当长。培训是必须的。一个实验性质的向导项目也是有必要的。建议不要使用结构化和面向对象像结合的办法。越来越多的证据表明,成功需要完全的OO解决方案.
9 未来
总的来说,面向对象的技术是以前的软件开发技术自然演进的成果,对许多应用领域的软件开发都极具前途。借用Maurice Wilkes在他图灵奖颁奖仪式上的演讲的话?quot;对象是软件界从70年代以来最激动人心的革新之一。" (1996) 然而,面向对象的开发并非是包医百病的灵丹妙药,其发展还远未成熟。可是尽管OO技术的未来还未确定,但在90年代初期的一些预言都已实现。(Winblad 1990) 类库和应用程序框架在市场上已经可用。应用和环境之间的透明信息存取业已实现。支持用户在应用之间通信的的环境以及面向对象的继承多媒体工具包正在涌现。随着经验的积累,OO的发展将日渐流行,OO技术也将日趋成熟。当然,OO技术也有可能为某种处理更高一级抽象的开发技术取代或融合。这些都只是猜想。虽然在不远的将来,谈论对象无疑会显得过时,但现在,还有许多的问题等着我们去付出真正的热情。
软件工程的七条基本原理
引自:http://www.gdit.edu.cn/html/dept/software/article/2.htm
自从1968年提出"软件工程"这一术语以来,研究软件工程的专家学者们陆续提出了100多条关于软件工程的准则或信条。 美国著名的软件工程专家 Boehm 综合这些专家的意见,并总结了TRW公司多年的开发软件的经验,于1983年提出了软件工程的七条基本原理。
Boehm 认为,着七条原理是确保软件产品质量和开发效率的原理的最小集合。它们是相互独立的,是缺一不可的最小集合;同时,它们又是相当完备的。
人们当然不能用数学方法严格证明它们是一个完备的集合,但是可以证明,在此之前已经提出的100多条软件工程准则都可以有这七条原理的任意组合蕴含或派生。
下面简要介绍软件工程的七条原理:
1 用分阶段的生命周期计划严格管理
这一条是吸取前人的教训而提出来的。统计表明,50%以上的失败项目是由于计划不周而造成的。在软件开发与维护的漫长生命周期中,需要完成许多性质各异的工作。这条原理意味着,应该把软件生命周期分成若干阶段,并相应制定出切实可行的计划,然后严格按照计划对软件的开发和维护进行管理。 Boehm 认为,在整个软件生命周期中应指定并严格执行6类计划:项目概要计划、里程碑计划、项目控制计划、产品控制计划、验证计划、运行维护计划。
2 坚持进行阶段评审
统计结果显示: 大部分错误是在编码之前造成的,大约占63%; <2> 错误发现的越晚,改正它要付出的代价就越大,要差2到3个数量级。 因此,软件的质量保证工作不能等到编码结束之后再进行,应坚持进行严格的阶段评审,以便尽早发现错误。
3 实行严格的产品控制
开发人员最痛恨的事情之一就是改动需求。但是实践告诉我们,需求的改动往往是不可避免的。这就要求我们要采用科学的产品控制技术来顺应这种要求。也就是要采用变动控制,又叫基准配置管理。当需求变动时,其它各个阶段的文档或代码随之相应变动,以保证软件的一致性。
4 采纳现代程序设计技术
从六、七时年代的结构化软件开发技术,到最近的面向对象技术,从第一、第二代语言,到第四代语言,人们已经充分认识到:方法大似气力。采用先进的技术即可以提高软件开发的效率,又可以减少软件维护的成本。
5 结果应能清楚地审查
软件是一种看不见、摸不着的逻辑产品。软件开发小组的工作进展情况可见性差,难于评价和管理。为更好地进行管理,应根据软件开发的总目标及完成期限,尽量明确地规定开发小组的责任和产品标准,从而使所得到的标准能清楚地审查。
6 开发小组的人员应少而精
开发人员的素质和数量是影响软件质量和开发效率的重要因素,应该少而精。这一条基于两点原因:高素质开发人员的效率比低素质开发人员的效率要高几倍到几十倍,开发工作中犯的错误也要少的多; 当开发小组为N人时,可能的通讯信道为N(N-1)/2, 可见随着人数N的增大,通讯开销将急剧增大。
7 承认不断改进软件工程实践的必要性
遵从上述六条基本原理,就能够较好地实现软件的工程化生产。但是,它们只是对现有的经验的总结和归纳,并不能保证赶上技术不断前进发展的步伐。因此,Boehm提出应把承认不断改进软件工程实践的必要性作为软件工程的第七条原理。根据这条原理,不仅要积极采纳新的软件开发技术,还要注意不断总结经验,收集进度和消耗等数据,进行出错类型和问题报告统计。这些数据既可以用来评估新的软件技术的效果,也可以用来指明必须着重注意的问题和应该优先进行研究的工具和技术。
面向对象方法综述
通过#pragma pack(n)改变C编译器的字节对齐方式
引自:http://blog.csdn.net/wenddy112/articles/300583.aspx
在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然对界(alignment)条件分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。
例如,下面的结构各成员空间分配情况:
struct test
{
char x1;
short x2;
float x3;
char x4;
};
结构的第一个成员x1,其偏移地址为0,占据了第1个字节。第二个成员x2为short类型,其起始地址必须2字节对界,因此,编译器在x2和x1之间填充了一个空字节。结构的第三个成员x3和第四个成员x4恰好落在其自然对界地址上,在它们前面不需要额外的填充字节。在test结构中,成员x3要求4字节对界,是该结构所有成员中要求的最大对界单元,因而test结构的自然对界条件为4字节,编译器在成员x4后面填充了3个空字节。整个结构所占据空间为12字节。
更改C编译器的缺省字节对齐方式
在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:
· 使用伪指令#pragma pack (n),C编译器将按照n个字节对齐。
· 使用伪指令#pragma pack (),取消自定义字节对齐方式。
另外,还有如下的一种方式:
· __attribute((aligned (n))),让所作用的结构成员对齐在n字节自然边界上。如果结构中有成员的长度大于n,则按照最大成员的长度来对齐。
· __attribute__ ((packed)),取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。
以上的n = 1, 2, 4, 8, 16... 第一种方式较为常见。
应用实例
在网络协议编程中,经常会处理不同协议的数据报文。一种方法是通过指针偏移的方法来得到各种信息,但这样做不仅编程复杂,而且一旦协议有变化,程序修改起来也比较麻烦。在了解了编译器对结构空间的分配原则之后,我们完全可以利用这一特性定义自己的协议结构,通过访问结构的成员来获取各种信息。这样做,不仅简化了编程,而且即使协议发生变化,我们也只需修改协议结构的定义即可,其它程序无需修改,省时省力。下面以TCP协议首部为例,说明如何定义协议结构。其协议结构定义如下:
#pragma pack(1) // 按照1字节方式进行对齐
struct TCPHEADER
{
short SrcPort; // 16位源端口号
short DstPort; // 16位目的端口号
int SerialNo; // 32位序列号
int AckNo; // 32位确认号
unsigned char HaderLen : 4; // 4位首部长度
unsigned char Reserved1 : 4; // 保留6位中的4位
unsigned char Reserved2 : 2; // 保留6位中的2位
unsigned char URG : 1;
unsigned char ACK : 1;
unsigned char PSH : 1;
unsigned char RST : 1;
unsigned char SYN : 1;
unsigned char FIN : 1;
short WindowSize; // 16位窗口大小
short TcpChkSum; // 16位TCP检验和
short UrgentPointer; // 16位紧急指针
};
#pragma pack() // 取消1字节对齐方式
引自:http://community.csdn.net/Expert/topic/3804/3804035.xml?temp=.8115198
Intel和微软和本公司同时出现的面试题
#pragma pack(8)
struct s1{
short a;
long b;
};
struct s2{
char c;
s1 d;
long long e;
};
#pragma pack()
问
1.sizeof(s2) = ?
2.s2的s1中的c后面空了几个字节接着是d?
还是我给出正确答案吧:
如果代码:
#pragma pack(8)
struct S1{
char a;
long b;
};
struct S2 {
char c;
struct S1 d;
long long e;
};
#pragma pack()
sizeof(S2)结果为24.
成员对齐有一个重要的条件,即每个成员分别对齐.即每个成员按自己的方式对齐.
也就是说上面虽然指定了按8字节对齐,但并不是所有的成员都是以8字节对齐.其对齐的规则是,每个成员按其类型的对齐参数(通常是这个类型的大小)和指定对齐参数(这里是8字节)中较小的一个对齐.并且结构的长度必须为所用过的所有对齐参数的整数倍,不够就补空字节.
S1中,成员a是1字节默认按1字节对齐,指定对齐参数为8,这两个值中取1,a按1字节对齐;成员b是4个字节,默认是按4字节对齐,这时就按4字节对齐,所以sizeof(S1)应该为8;
S2中,c和S1中的a一样,按1字节对齐,而d 是个结构,它是8个字节,它按什么对齐呢?对于结构来说,它的默认对齐方式就是它的所有成员使用的对齐参数中最大的一个,S1的就是4.所以,成员d就是按4字节对齐.成员e是8个字节,它是默认按8字节对齐,和指定的一样,所以它对到8字节的边界上,这时,已经使用了12个字节了,所以又添加了4个字节的空,从第16个字节开始放置成员e.这时,长度为24,已经可以被8(成员e按8字节对齐)整除.这样,一共使用了24个字节.
a b
S1的内存布局:11**,1111,
c S1.a S1.b d
S2的内存布局:1***,11**,1111,****11111111
这里有三点很重要:
1.每个成员分别按自己的方式对齐,并能最小化长度
2.复杂类型(如结构)的默认对齐方式是它最长的成员的对齐方式,这样在成员是复杂类型时,可以最小化长度
3.对齐后的长度必须是成员中最大的对齐参数的整数倍,这样在处理数组时可以保证每一项都边界对齐
补充一下,对于数组,比如:
char a[3];这种,它的对齐方式和分别写3个char是一样的.也就是说它还是按1个字节对齐.
如果写: typedef char Array3[3];
Array3这种类型的对齐方式还是按1个字节对齐,而不是按它的长度.
不论类型是什么,对齐的边界一定是1,2,4,8,16,32,64....中的一个.
结构对齐是基础知识,这种问题只有一个目的,就是看你对语言细节的了解程度.
在网络通讯,多个模块交互的应用中这种东西是很常见.
这一类的东西还有像__stdcall,__cdecl,volatile,mutable这些东西.平常学习中很难遇到,但实际工作中却会用.