1、借用CSDN掌门一句话开头
"没有无敌的高手,也没有完美的作者,如果能从别人的文章中得到一点知识,有一点感悟,我们就应该给他鼓掌,心存感激。“三人行,必有我师”,多一份尊重,多一份理解,这个世界也就多一份美丽。"
2、感慨为何而发?缘起一本书
3、这是一本什么样的书?
本书主要介绍了C#语言各方面的知识以及使用C#进行开发的原则与实践,结合C#深入浅出的阐述面向对象理论的基本内容。本书是由该书作者之一Jacquie Barker的经典畅销著作Beginning Java Object一脉传承而来,与之具有异曲同工的特色。
本书最初和最重要的关注点,是软件对象:什么是软件对象,为什么它们如此神奇而直白,以及如何正确使用对象去构建一个软件应用。
这也是一本关于C#的书:它并非一本“C#大全”,而是一份对该语言的温文但全面的介绍,还特别强调了如何把对象模型转换到功能完备的C#应用程序——其他图书很少这样编写。
本书的目标
我们撰写本书的目标(希望也是你买它的目的)是
• 让你熟悉基础的面向对象(OO)术语和概念。
• 让你得到对象建模领域的上手实践体验:即,创建一幅可用作后续面向对象软件系统构建基础的“蓝图”。
• 演示如何将类似对象模型转换为可用的软件应用程序,特别地,C#应用程序(虽然你将学到的对象建模技术也可用于其他语言)。
如果你已经熟悉C#语言(但不熟悉对象基础),那么,学习C#的面向对象根源,对你成功使用该语言至关重要。另一方面,如果你是C#新手,本书将让你能正确地“起跳”。从这两方面看,对于任何打算成为精通一门类似C#的OO编程语言的人,本书都是必读之作。
本书并不打算做到
• 让你一夜之间精通对象建模:和其他高级技能一样,完全掌握对象建模技术有两个条件:良好的理论基础和大量的练习!本书只告诉你基础知识,以及让你能应用和实践新学知识的项目/练习的建议。但是,真正精通对象建模技术的必经之路,还是坚持不断地参与OO建模和项目开发。本书给你以技能,希望还能给你以信心,让你能在一个专业机构中开始应用对象技术,那才是你真正学习的地方,尤其是如果拥有一位OO经验丰富的导师在整个“工业标准”项目中指导你时,更是如此。
• 让你变成某种特定OO术语体系的专家:OO软件开发领域有数十种不同的正式方法,新变种还在不断产生,而且并无优劣之分。例如,UML(即Unified Modeling Language,统一建模语言)符号体系是最新的,而OMT(即Object Modeling Technique,对象建模技术)是最旧的其中之一,然而两者极为相似,因为UML基本上极大地扩展了OMT。在理解了对象建模技术的一般过程和用UML建模的技术后,你就拥有足够的知识,可以自己检阅、评估和选择一种特定的术语体系(或创建你自己的体系——甚至也许有一天你会写一本关于自己发明的术语体系的书,谁知道呢!)
• 教给你所需的全部C#知识:C#是一种非常丰富的语言,在Framework Class Library中包括了数十个核心类、数百个其他类,以及这些类提供的数以千计的操作。假使C#提供了一打实现某种操作的方案,则我们将只介绍其中一两种最适合解决手边问题的方案,让你明白解决问题的方式。尽管如此,在本书中,你还是一定会看到足够用来构建一个完整应用的C#语言知识。
用从本书学到的基础知识武装好自己后,你将能欣赏关于该领域的更为彻底的阐述,例如坊间有售的C#参考书中的知识,或UML参考书中的描述。
对于想做成功OO程序员的人,为什么理解对象如此要紧
我们常常与一些软件开发者会面()在工作场所,在客户办公室,在专业会议上,或在大学校园里()
这些开发者都尝试去掌握一门类似C#的OO编程语言,他们参加C#培训,阅读关于C#的书,或是安装和使用像Visual Studio .NET这样的C#集成开发环境(IDE)。然而,这是舍本逐末的做法:他们缺乏对什么是对象的基础认识,更为严重的是,缺乏利用对象从头开始构建软件应用程序的知识。
想象一下,如果你被要求建造一所房屋,而且你也懂得关于建筑的基础知识。实际上,你还是一位抢手的世界知名建筑家!客户告诉你,建材已经运送给你。在开工那天,一辆卡车开到施工现场,卸下一大堆蓝色的、星形的奇怪建材,每块中间还有个洞。于是你只能暂时停工!你曾经使用木材、砖块、石头等建材建造过无数房屋,而且也懂得使用熟悉的材料去施工;但是,你却完全不知道怎样堆叠蓝星公司的建材。
一番冥思苦想后,你拿出一把锤子,想按照以前对付木材那套把蓝星建材钉到一起,但它们却无法严丝合缝。然后你又用砌砖的灰泥填充建材之间的缝隙,不过灰泥似乎无法粘到上面。然而,由于预算和工期都有限(因为你称自己为建筑“专家”,但却不懂如何使用现代建材,把自己推到了绝地),只好勉强上马。最终,你拼凑出一个看起来(至少从外面看起来)像是房子的玩意。客户来检查工作,并表示了完全的失望。他选择蓝星建材的原因之一是,使用这种建材搭的房屋相当节省能源;但是,由于你使用了钉子和灰泥,它们蓝星建材失去了大部分隔离能力。为了补偿热量损失,客户要求你把所有窗户玻璃换成绝热玻璃。这时你手足无措!换掉所有玻璃比新建一座房屋所耗时间还长,而且替换因为换玻璃而损伤的墙体所花时间还不计算在内。当你告诉客户这个情况时,他暴跳如雷!客户选择蓝星建材的另一个理由是,该种建材适应性十足,易于迎合设计改变;但是,由于你用极无效率的手段组装了它们,就不得不再将它们逐个拆开,换掉其中一大批。
很悲哀,这也是许多程序员搭建OO应用程序的方式,因为他们没有被很好地教会如何从对象的角度来完成项目。而更麻烦的是,绝大多数即将成为OO程序员的人,对于理解对象并将其用于OO语言编程的必要性,一无所知。所以,他们使用C#这样的语言编程,拼凑出远非理想的结果:在应用程序交付之后,需要引入新功能,从而导致需求规格改变,必须做“中期修正”时,程序就会因缺乏灵活性而无法适应。
本书为谁而写
本书为任何想要大体了解类似C#这样的面向对象编程语言的人而写!本书的目标读者
• 还没开始使用C#,希望有个正确的起步
• 曾经买过一本C#书,满怀希望地读完,了解了一些基础语言知识,但不大懂得如何充分利用该语言的OO特性来构建应用程序
• 买了一套C#集成开发环境(IDE)软件工具,但只会拖放GUI组件,为按钮、菜单等添加少量逻辑,但却对如何围绕对象正确地构建应用程序核心没有真正的认识
• 已经搭建了一个C#应用程序,但对因新需求产生而导致的维护或修改困难感到失望
• 曾经学过一些对象建模,但不明白如何把对象模型转换为真实代码(C#或其他语言)
底线是,如果谁真打算掌握一门C#这样的OO语言,那么他就必须首先成为对象专家!
为了从本书中获取最大价值,你应当具备一些编程经验,无论哪种语言均可。你应当了解简单的编程概念,例如
• 简单数据类型(整型、浮点型,等等)
• 变量及其作用域(包括全局数据的概念)
• 流程控制(if-then-else语句,for/do/while循环,等等)
• 什么是数组,如何使用数组
• 函数/子例程 (subroutine)/子程序(subprogram)的概念:如何传入数据和取回结果
不过,你不必对C#有任何认识(在第一部分,我们将让你尝试这种语言的滋味,在第三部分还会深入这种语言)。而且,你也不必对对象有所了解——至少在软件层面上!如你将在第2章所学到的那样,人类天生是从对象的角度看世界。
即便你已经开发过功能完备的C#应用程序,如果你还是对应用程序构建中的对象方案有所不解,现在再读本书也为时未晚。大学里常会提供关于对象建模和C#编程的单独课程。学生最好是顺序选修这两种课程,不过他们常常会在选修对象建模课之前已经选修了C#课。这类人会在本书中看到一些熟悉的“地标”(在C#代码范例中),即便如此,他们会学到在用C#(或其他OO编程语言)编程时为什么要这样做或那样做的原理,从而大大增长了见识。
不光了解语言机制,还要了解面向对象的“所以然”,才能让人从根本上成为更好的C#程序员。如果你有C#经验,可以快速扫读介绍这种语言的那些章节,即,第一部分第1章和第三部分第13章。
本书根源于作者的课程教学,所以也可作为一学期课程或分为对象建模和C#编程两门课的适用教材。在附录A中,我们提供了如何使用本书作为教材的一些建议。
如果你感兴趣于对象建模,但不想学C#编程
这本书还会有价值吗?绝对有!即便你不打算从事编程职业(许多对象建模学生都是如此),我们发现,阅读少量用C#这样的OO语言编写的代码范例,的确能帮助你牢固掌握对象概念。所以,我们鼓励你阅读第三部分——至少是第14章——即使你永远不会把手放到键盘上编写C#程序。
本书如何组织
本书围绕三个主题组织,如下:
第一部分:对象ABC
在一头扎进对象建模“怎样做”和C#的OO编程细节之前,我们最好都说同一种关于对象的语言。
本书第一部分由第1章到第17章组成,从定义所有软件开发手段(OO或其他)之下的基础概念开始,慢慢起步。不过,很快就冲入高级对象概念的讨论。这样,到第一部分结束时,你将会有“对象头脑”。
第二部分:对象建模101
在第二部分——第8章到第12章——中,集中于在开发应用程序的对象模型时,我们所做事情的“然”和“所以然”。了解UML符号体系很重要,它是工业标准,也多半会是你的同事/客户会使用的,所以我们教给你UML知识,并把UML应用到我们的具体建模范例上。使用这些章节呈现的建模技术,我们将为学生选修系统(Student Registration System,SRS)开发一个对象模型。本介绍末尾附带了这套系统的需求说明书。
第三部分:把对象“蓝图”翻译为C#代码
在本书第三部分——第13章到第17章——中,演示如何将在第二部分开发的SRS对象模型渲染成一个功能完备的C#应用程序,包括一个图形化用户界面,以及在用户登录并注销后持久化数据。这些章节中呈现的所有代码范例,都可从Apress网站——http://www.apress.com——下载到,我们强烈鼓励你下载这些代码并着手实验。实际上,我们在每章末尾部分都提供了可供实验的练习。SRS的需求说明书用描述风格写成,软件系统需求常常是这样表达的。也许现在你就有信心搭建一个应用程序解决此问题,但读完本书后,你将更相信自己有能力把它搭建成一个面向对象的应用程序。附录B中列出了三个额外的案例——处方跟踪系统、会议室预定系统和机票订座系统。它们是每章后面许多练习的基础。
为了完善本书,我们还写了标题是“下一步”的最后章节,它给出一些建议,让你在读完本书后,懂得如何继续自己的面向对象发现之旅。我们列出了一些推荐书目,让你根据自己下一步的发展领域,借助这些书籍更上一层楼。
约定
本书中我们使用一系列约定,帮助你更好地阅读和跟上思路。
例如:
提示框包括重要的背景信息。
对于字体风格
• 当谈及重要内容时,粗体显示。
• 用类似WriteObject()这样的字体显示文件名、URL和代码:
范例代码如下:
// 粗体字用来提示新的或重要的代码:
Student s = new Student();
// 普通字体表示在上下文中不那么重要的代码,
// 或者之前已经出现过的代码。
int x = 3;
本书基于哪个C#版本
Microsoft持续推出新版本的C#语言。好消息是,由于我们只关注核心C#语言语法——从C#出现之日起就固定下来的语言特性——所以与C#版本无关。你从本书中学到的技术和概念,也同样可以运用于未来版本的C#。
开始前的最后思考
书中的许多内容——特别是第一部分开始时那些——对于有经验的程序员看起来也许会过于简单。这是因为,许多对象技术建立于基础软件工程原则之上,这些原则经年以来在许多项目中实践过,只是稍加包装而已!的确有一些东西,使得OO语言极具威力,而非OO语言本质上不可能拥有这种威力,例如,你将在第5章和第7章学到的继承和多态。(这些技术也可用非OO语言模拟,就如同程序员编写自己的数据库管理系统(DBMS),而不使用Oracle、Sybase和MS SQL Server等现成的商业产品——不过谁肯那样做呢?)
有经验的程序员在精通对象的道路上遇到的最大挑战是,他们解决问题的方式需要得到再教育。
• 对于使用非面向对象方式开发过应用程序的软件工程师/程序员,不得不“忘掉”用在软件分析和设计的传统方式中的实现手段。
• 诡异的是,那些刚成为程序员(或OO建模师)的人,在学习软件开发的OO实现时,反而更易接受和用于实践。
幸运的是,在开发软件时思考对象——和用C#编写它们——的方式,大体上和人们思考世界的方式别无二致,就和1、2、3一样容易!
欢迎赐教
我们努力使本书尽可能对你有用,所以我们也乐意了解你的想法。我们总想了解,你想要的和希望知道的是什么。
4、看看译者对这这本书的感觉
入门不简单
(《Beginning C# Objects中文版》译序)
由于工作性质的关系,我常常需要为公司面试程序员。通常,我会首先要求应聘者做两件事:第一,口头说明虚方法、抽象方法、接口之间的异同和使用场景;第二,脱离IDE,手写一个简单的WinForm程序(例如包括布局整齐的两个文本框和三个按钮、点击按钮弹出消息框显示文本框内容),然后在命令行编译运行。第一题是考面向对象中的继承和多态概念,第二题则是考C# GUI类和关于委托等C#独有特性的基础知识,以及编译、调试技巧。很遗憾,有一大半的应聘者会在这两个简单考题面前败下阵来。尤其是第二个考题,甚至难倒了一些写代码有年头的程序员。为什么?因为这些程序员不具备基本的面向对象知识,更加不理解C#的面向对象实现手法。
这不能完全归咎于中国计算机教育。实际上,在美国或其他发达国家,真正懂得面向对象开发的程序员也并非随处可见。这也是Beginning C# Objects(及其Java原版本Beginning Java Objects)一书成为畅销书、并在Amazon上获得读者极高评价的原因。作者写道:“我们常常与一些软件开发者会面——在工作场所、在客户办公室、在专业会议上,或在大学校园里——这些开发者都尝试去掌握一门类似C#的OO编程语言,他们参加C#培训、阅读关于C#的书,或是安装和使用像Visual Studio .NET这样的C#集成开发环境(IDE)。然而,这是舍本逐末的做法:他们缺乏对什么是对象的基础认识,更为严重的是,缺乏利用对象从头开始构建软件应用程序的知识。”
翻开市面上任何一本你能找到的C#入门书,看看第一章讲什么,第一个范例是怎么实现的。闭上眼睛你都能告诉我,第一章多半是讲怎么安装VS.NET,第一个例子多半是拖一个按钮控件到窗体,双击后输入一段调用消息框的代码。我们的技术作者们,就是这样把读者引入歧途的。IDE(集成开发环境)能极大地提升生产力,但开发应用程序所需的高度专业的知识和技能,却非IDE所能代替。的确,任何一个菜鸟也许都能利用可视化组件拼凑出“看起来还不错”的应用程序,但这样的程序却将带来高昂的扩展和维护成本。
面向对象编程,绝非一些可视化组件那么简单,它涉及人类思维(抽象)模式、建模符号体系、面向对象方法学等诸多方面,对开发者有较高的要求。功夫过关的开发者,不止是技术高手,同时也一定会是有深度的思想者。把需求从自然语言翻译为对象模型,再把对象模型翻译为特定语言代码,殊非易事。最基础的,到底什么是对象?如果你曾经好好思考过这个问题,就会得到很多启发。例如,现实世界中的一张纸,如何抽象为计算世界中的对象?这个对象将具有那些特性(属性和行为),例如尺寸、颜色、质地、折叠、裁减,卷筒……?综合来看,面向对象的要素是什么?把事物抽象为对象的过程,是做思维体操的过程,也是极富挑战性和乐趣的过程。如果你还还不了解对象和面向对象的概念,或想与作者一起就该话题做更深入的思考,本书第一部分就是最好的入门手册。
我认识一些优秀的程序员朋友,他们在大学时念的专业是建筑。这些朋友对应用程序架构和/或开发流程,有近乎严苛的要求,因为他们深刻地理解,蓝图、材料、工序……对于建造房屋是多么的重要。对象模型的静态方面(域类、数据结构等)在应用程序中开发相当于建材单元,而动态方面(行为、方法等)则是关于建材之间如何组合的指导书,它们合起来,构成一个应用程序的“蓝图”。越是复杂、大型的应用程序,对蓝图的要求就越高;即便是简单的应用,有蓝图也比较有利于维护、升级和扩展。给你一份需求说明书,你将如何分析它、并且组织出正确的对象模型(蓝图)?如果你对此信心不足,建议好好阅读本书第二部分。
第三部分涉及的范例,在有经验的开发者眼中看来,似乎过于简单。其实不然。整个开发过程当中,没有使用IDE拖放过任何一个控件,或在IDE中编译调试。这样做的目的有二:一、让读者可以掌握.NET Framework和C#本身的特性,而不会被IDE的花哨界面所迷惑、急于求成;二、帮助读者学会用正确的手法和模式(如公认的MVC模式)开发程序。例如委托(delegation),这是.NET Framework中一种特别的语言元素,也不易理解。如果你只懂得往窗体放一个按钮,双击该按钮,输入一行代码,那么你永远不会明白,这个过程体现了利用委托实现事件处理的巧妙手法。但是,如果让你脱离IDE编写事件处理方法,你就很快能明白这个道理,而且也知道怎么用于实践。IDE能提升生产力,不过它却不能凭空创造生产力,本源的生产力还是来自开发者的知识与技能。
面向对象编程已经流行多年,然而还是有无数的入门者在入门阶段就走错路子,抱着错误的观念、用错误的方式开发着意大利面般一团乱麻的程序。入门不简单,对于初学者如此,对于有经验的开发者,更该回头检讨自己在面向对象编程领域的经验是否根本就是错误或细枝末节的经验。本书作者开发和培训经验丰富(一位是NASA开发工程师,一位是大学教师和对象技术专家),理解面向对象程序员可能进入的误区和面对的挑战,他们知识与经验的总结,形成了这么一本用心良苦、循循善诱、深入浅出的C#面向对象开发指南。每一位C#开发者,无论有经验还是没经验,都该读读这本书。入门不简单,你真的入对门了吗?
5、99.9%的努力毁于0.1%的失误
出版商:不知是一时失误还是急于求利,既然将这本书印刷成出版日期:2005年5月底,特此更正这本书出版日期:2006年5月底
比较搞笑的是:每家出版商汇款帐户肯定错不了
6、好书,值得推荐!