《Delphi高手突破》第0章(预览版)——关于本书(100分)

  • 主题发起人 主题发起人 Nicrosoft
  • 开始时间 开始时间
N

Nicrosoft

Unregistered / Unconfirmed
GUEST, unregistred user!
第0章 关于本书
感谢您阅读本书!
本书是写给程序员的,更确切说,是写给Delphi程序员的,再确切些,是写给已经有了一定的实现能力而欲求寻找一种"突破"的Delphi程序员的。
作者本人,在接触了两年的Delphi之后,曾经迷茫过。我可以写各种各样的程序,我懂得VCL大多数组件的用法,我知道应该调用哪个Windows API来完成我要的功能……但时常会疑惑:这就是写程序了?那时候在大学里读书,课余时间很多,每天就不停地写,写各种程序:包括课堂的作业、在网上发布的免费软件以及接到的开发项目。每天都写代码,有了Delphi的help和MSDN,似乎不会有什么困难,只是偶尔会觉得单调。不禁又问自己:这就是写程序了?
我迷茫,是因为我感到,写程序不应该是件单调的事情;我迷茫,是因为自己总在寻求却始终没有找到一种"突破"的感觉;我迷茫,是因为我想成为"高手"却不知道如何去做……
我有很多理由喜欢Delphi,但是应该说,那时正是Delphi的RAD开发方式让我陷入迷茫。当时我迷惑于RAD使人能力退化还是一种革命性的进步,相信很多Delphi程序员都会和我有一样的经历。
我很幸运,就在我迷茫的时候,认识了我的同学Lythm。是他让我找到了方向,然后就暂时放下手中的键盘,捧起了书本钻研C++与面向对象编程的理论。此时已没有了迷茫,取而代之的,则是能亲身感受到的、我梦寐以求的"突破"的感觉。之后,我又发现Delphi与C++在OO思想方面的共通性,并且相比之下,Delphi更得我心(理由见第1章),于是便有了"看C++的书,把弄手上的Delphi"的经验。
那么,你是否曾经或正在经历我曾经的迷茫呢?
如果你现在正在经历,我希望你和我一样幸运。不要犹豫,从这本书开始结束这种迷茫,也许我或者这本书能成为你的Lythm。
如果你预期未来会经历,那也请你珍藏着这本书,也许某天你会想起它,需要它。
我并没有任何文字暗示自己已经成为"高手",所谓"高手突破"的解释并不是高手来帮助你突破。写这样一本书,我只是希望能把自己的"突破"的感觉与经验和大家共享,同时,它也是我对前一段时间学习的一个总结。
0.1 这本书没有什么?
这是本特殊的Delphi编程方面的书,它不会教你如何使用Delphi,也不会教你如何使用类似TListBox那样的组件,更不会涉及诸如多线程、DLL、API等Windows编程的内容,也没有热门的COM/DCOM。
0.2 这本书有什么?
这本书会告诉你面向对象编程的基础理论,会给你剖析VCL的部分源码,会告诉你在你开始敲键盘写代码之前应该做什么,怎样使你的代码的构架被更良好的设计以致于更容易被维护和修改,告诉你Lythm告诉我的一切,以及更多。
0.3 这本书还没有什么?
看起来,这是一本更侧重于讲设计的书。请不要误会,这本书还不会教你关于面向对象分析/设计(OOA/OOD)的内容,更没有UML
0.4 这本书究竟有什么?
就本质来说,这本书只讲OOP,当然,是用Delphi作为载体,因为它是写给Delphi程序员的。其中有设计的内容,但仅限于代码设计。本书末尾会有一章就一个实例向你展示代码构架设计的一种可能的方式,但此方式并不是唯一的。实例不需要被照搬,而需要领会。
0.5 本书章节介绍
本书第1、2、3章介绍OOP的知识基础,虽然这样的内容在很多书都会有,但本书一定会带给你不同的感觉。
第4、5章介绍VCL相关的知识。其中第4章为你剖析部分VCL的核心组件源码,第5章介绍定制、设计组件的方法。
第6、7章介绍程序构架设计。第6章介绍一般性的代码设计准则,其内容可以完全脱离Delphi,因为这些准则是跨语言的。第7章为一个完整的代码设计实例,以编写一个多工作区的文本编辑器为例,从实践角度说明程序构架设计的方法。
0.6 本书的支持网页
本书的支持网页为:http://www.sunistudio.com/nicrosoft/book/
作者Email:nicrosoft@sunistudio.com
希望你喜欢本书以及它的作者--我!谢谢。
 
预计什么时候出书?
 
这本书定价多少?
 
to 游泳的海豚:估计不会超过30,呵呵
to mlzhou:快了
 
请问一下这书是计划放在哪里出版呀?
 
to wsn:清华大学出版社
 
不超过30呀
那快出吧
肯定买
 
好的话
一定掏腰包
 
写得确实不错,我正在找一本比较好的oop的书,期待早日出版!
 
to:NicroSoft
我记得你的有一章关于Delphi对象的初始化期间抛出异常的论诉是有错误的,当时在网上csdn
还是哪里看到你发布的预览章节,我没时间回复,不知道你现在改过来没有?
 
to oskiller:我并没有觉得有错误阿,如果您觉得有错误,请帮忙指出,谢谢。
原文见此处:http://www.delphibbs.com/delphibbs/dispq.asp?lid=919260
 
先出电子版,试用一下
 
to:Nicrosoft,
对不起,这么久才来回复,因为这几天DFW的服务器好慢:(
您给的“第三章节选”(http://www.delphibbs.com/delphibbs/dispq.asp?lid=919260)那篇帖子的初
稿我在CSDN见过,当时有个叫optimizer的家伙回复的很精彩,他的意见和我的一样,也说得很清楚,但
是您好象并没有理解他的意思?好吧,不扯远了,进入正题。
您的这句话:
“构造函数与异常 这个话题在C++社区中经常会被提起,而在Delphi社区中似乎从来没有人注意过。也
许由于语言的特性,使得Delphi程序员不必关心这个问题。”
我是不同意的,恰好相反,任何真正的Delphi程序员恐怕都不会忽略这个问题吧?比如我们要构造一个对
象,假设在这个对象的constructor中我们
1、需要申请内存放成员对象,
2、需要保存打开的数据库连接,
3、需要打开某个文件。
那么我们应该为该对象构造失败的情况有所准备,如您所说,“标准”的方法是“在构造函数中抛出一个
异常”!但是,问题的焦点在于:
1、这个异常由谁来处理?
2、我们(程序员)应该做什么?
而您的回答是:
该异常是由Delphi自动处理的,而程序员该做的工作就是
“如果类的说明文档或类的作者告知你,类的构造函数可能会抛出异常,那就要记得用try…except包住
它!”
您的回答是正确的,但是忽略了一种情况,就是“半拉子”对象问题,即假如在对象构造期间已经得到
了某些资源后再申请某个资源时丢出异常这种情况。以我举的列子来说,就是假如完成了第一步成功构造
了成员对象,在第二步打开数据库连接时抛出异常。或者成功完成前两步在最后一步打开某个文件时抛出
异常。这时我们面对的就是处理“半拉子”对象的问题。即怎样释放已经得到的资源?以您的意思,如果
我没理解错的话,是:

在destructor中“如常”一样依次释放所得资源。在使用该对象的代码中用try...except包住构造部分
代码,Delphi会自动处理该异常,检查对象引用是否为空,根据结果调用其destructor等等。
遗憾的是,这种回答是错误的,我们还应该做的工作就是在destructor中依次检查每个保存资源的field
是否为空,(由于初始化期间,Delphi会首先根据field的类型自动清为 0、nil、空字符串或unassigned
等等,所以这里的检查是有依据的),如不为空则释放之。
话不多说了,转贴《Object Pascal Language Guide》中的一段话:
When an exception is raised during creation of an object, Destroy is automatically called to
dispose of the unfinished object. This means that Destroy must be prepared to dispose of
partially constructed objects. Because a constructor sets the fields of a new object to zero
or empty values before performing other actions, class-type and pointer-type fields in a
partially constructed object are always nil. A destructor should therefore check for nil
values before operating on class-type or pointer-type fields. Calling the Free method
(defined in TObject), rather than Destroy, offers a convenient way of checking for nil values
before destroying an object.
------------------------------------------------------- 引自《Object Pascal Language Guide》
这段话optimizer最开始贴给您过,我再转贴一次,希望引起您的重视。

----the end.
 
后退
顶部