欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

编写程序方法论(引用) 编程MFCVBDOSVC++ 

程序员文章站 2022-07-04 17:04:52
...
编写程序方法论

一 谁不该读此文
————
我的文章一向极具针对性,从来不会为我所看不惯的东西而保守了笔墨的犀利。
此文自然也不会例外。以下几类人忌读:凡是想要去考研究生的人别读,此文具备的
思想意识是你们淤腐脑袋所不能理解,你们应该把这点时间花在死啃教科书上。喜欢
在计算机领域玩弄图形设计,网页制作以及一切有志投身于计算机的软件应用领域的
人别读,我会*了你的理想的。平时喜欢把玩CPU和内存条于股掌之上,浑天把超
频如何如何挂在嘴上的骨灰级电脑硬件DIYer们,也别读此文章,这倒不是你们不适合
读,而是我根本就认为你们读我这篇文章是对我莫大的侮辱!
开篇结束,理性开始
——————————————————————————
二 从什么开始?
————
很多的朋友曾问过我:我应该从什么东西开始学起?我都无一例外地回答说:汇
编!可这样的回答,不能使每一个人都明白的。他们说:我也跟着教材跟着老师学习
了汇编语言呀。好,我就从对汇编教材的分析,来阐明我对汇编学习的理解。大家仔
细看看我们的汇编教材,它开宗明义的是IBM-8086宏汇编语言,而教材最致命最能毒
害学生对汇编的认识之处就在于此!相信每一位学习了汇编的同学,都明白一点,就
是在编写汇编程序时,最常用最依赖的是INT21H。而这INT21H,根本就不是8086的中
断服务例程,它是系统提供的,是DOS这个操作系统提供的!谁的汇编程序,能离得开
INT21H?离开了它,不仅失去了系统那庞大的服务例程,基本丧失了实际意义,而且
能否在DOS平台上正确运行,正确实现功能,还不能肯定。(高高手除外!)(在这里,我
引入我自己的一个名词来表述--“系统相关性”。)所以,教材在宣言自己是与系统无
关的IBM-8086汇编的同时,让学生去学的却是具有“系统相关性”的DOS汇编,这一重
大的失误,使绝大多数的同学在学习汇编的时候,注意的是对汇编语言本身语法的理解,
而忽略了与之相关而绝不可少的DOS系统原理,从而在将来运用自己所学到的知识进行
编写程序时,倍感系统相关的知识的缺乏,感觉除了教材上的例子以外,自己无从下笔。
各位读者,请认真回答我的提问,有过这种感受吗?而这绝对不能怪学生,只能怪教材
自己的缺陷和片面。对此,我开出的药方是,仔细阅读和学习我们的DOS书的后半部分
(那本四川联合大学出的《DOS实用技术大全》),你们在认真学习它之后,一定会有豁
然开朗的感觉,不会再对DOS系统的底层迷惘了,不会感觉无从下手,这对自己以后的
编程工作起的是基本性作用的。
读到这里,你们一定问我了,难道学习编写程序就一定要学习DOS系统原理吗?我
说,是的,虽然现在流行的WINDOWS里,表面已经看不见DOS的痕迹了,可是,对WINDOWS
系统有大致了解的同学却应该知道,WINDOWS9X使用的是DOS内核。而没有DOS系统知识,
是很难去了解WINDOWS9X原理的。而且,外面也没有深剖WINDOWS9X原理的书籍买,所
有对它的介绍,都是立足于DOS的。比如,树型文件管理系统的FAT和FDT,图形显示接
口的操作,都清晰可见DOS的影子。没有DOS的系统知识,的确是难于理解这几个WINDOWS
的较核心内容,甚至根本就是无从理解起。在学习了DOS的系统知识后,再谈对WINDWOS
系统的理解和学习,就是事半功倍了。我自己从高一开始用DOS,大一认真学习了DOS的
系统原理,所以我今天才能较快地进入WINDWOS世界的,而DOS在其中起的作用,我简直
是无法用言语来形容。
——————————————————————————
二 明天是哪方
————
在DOS系统原理被学习完后,的确应该考虑下一步该如何了。因为没有人天生是喜欢
用又臭又长的汇编语言来写有实际意义的程序的,包括我。我的建议是C。第一步是TurboC2.0。
原因有二:其一,深刻理解C的概念,对以后的学习绝对是有前导作用的。其二,TC提供
了对汇编的编程接口,这为大家去实际使用所学的“系统相关”的汇编知识,提供了极其
广阔而方便的舞台。究竟学到哪个程度呢?有一本书,叫《C语言高级编程技巧》,只要
能理解它里面80%以上的内容,你的TC就过关了。
这时候,完全可以开始WINDOWS的程序编写了。
而一旦进入了Windows那五彩缤纷的编程世界,多半会有一种眼花缭乱的感觉的。我
当时就是如此。所以,Windows编程的第一门语言尤其重要。我的建议是VB。虽然VB有这
样那样的不足和缺陷,(比如运行缓慢,属于解释性语言,内部完全封闭等等)可VB作为
Windows编程的入门级语言,它的启蒙作用不可小看。它能勉强让你理解Windows系统独特
的消息驱动模式,理解窗口的基本概念,理解可视化编程的初步,可知这些概念的感性理
解,对后面的学习不无有利。这个阶段应该不能太长,2--3周就可以了,此时,不要满足
于自己基本能做出些漂亮的Windows程序,更不要拼命在VB上下功夫,因为最美丽最有诱
惑力的在下面!
——————————————————————————
三 一头拜倒在VC脚下
————
对一个真正的程序员来说,VC是将你同一般编程爱好者划分开来的标志!
而VC的世界里,却存在着MFC和Win32 API那有争议的较量,虽然他们根生同处。我个
人的建议是:Win32 API是绝对的选择!在Win32 API的知识领域里,全面解释了Windwos
系统里一个程序的一切。对于这个级别上的程序,只有你暂时不能理解的,没有它不能解
释的。从前台桌面到后台进程,从图形处理到文件打印,从句柄,内核对象到互斥量,临
界区,从网络通信到设备驱动设计,Windows系统的里里外外基本都在这里留下编程接口,
你在日常使用Windows时留下的疑问,你在使用VB时不能实现的技巧和功能,此时都可以明
白和实现了。不过,你应该有充分的信心和毅力去坚持学习,Win32 API编程号称Windows
系统下的汇编,所以,对它的广阔和精深,应该有准备。学习的时间不短,1年算快了。
我当初接触它时,就不信它要如此多的时间和精力,可最后我却学了一年半。
学成它的标志是:从此你在打大部分游戏时,你会发觉你已经不自觉地去考虑别人的
游戏是如何编写的。因为你的眼里没有游戏,只有程序!而在使用一些别人写的不是很优
秀的程序时,你会有底气说:“有时间,我也重写一个!”此时,你会发觉自己经常性地
在心里揣摩别人的程序,比如网络蚂蚁,比如Foxmail3.0,比如Winamp等等。
在这里,我着重讨论一下MFC和Win32 API的优劣区别,这一点,相信很多的同学是模
糊的。如果用VC编辑器写一个Windows程序,使用MFC的话,MFC的编程向导能提供一些框架
服务,使得在程序建立的初期,感觉很是方便。而当程序的代码增长后,MFC在初期提供的
方便,便没有痕迹了。相反,MFC的一大缺陷就会在此时出现了。我概括如下:“MFC所支
持的功能,使用是方便的,而没有提供的功能,自己通过兼容API函数的模式去实现,比一
开始就使用Win32 API还要麻烦。”使用过MFC的同学,可以去考虑如何实现比如,自定义
消息的处理,多线程的实现,托盘区的使用,右键弹出式菜单,物主绘图窗口和菜单,子
窗口的子类和超类处理,是不是极其麻烦?这样的问题我还可以提出很多,而在Win32 API
的编程思维和实现里,这些却都是很顺理成章的了。
再一个,从编译的角度来看MFC和Win32 API的区别。MFC中封装的各个类的绝大部分的
成员函数,其实都是API函数的二次使用。是MFC的LIB库将其打包成了可供调用的类代码,
否则,为何在生成Release版时,都要将其设置为静态的链接库呢?说透去,MFC的类库只是
API的一个真子集,对MFC学得再好,理解得再深刻,也只是间接地在理解API,所以一开始
就应该学习和使用API。
我再用一个比喻来结束我对MFC和API的评论。“MFC为编程人员提供的自生成代码,是
一个分数的分子,而程序代码的长度是分母。而这个分数的值就是MFC所提供的方便值。在
程序代码不长的情况下,MFC提供的方便之处就很明显;而随着代码的增长,方便值的实际
意义就立刻减小而副作用增加了。”
我自己在进行了一年半的Win32 API编程学习后,深感通过它,自己对Windows系统原理
和Windwos的编程机理比从前有了质的提高,从前不了解和模糊的编程想法和实施细节,都
得到了很好的满足,自己可以明显感觉编写程序的水平上了一个台阶。
——————————————————————————
四 广阔地运用已学知识
————
到这个层次,应该能编写些程序了。比如写局域网上的类似ICQ的聊天程序,写自己的
FTP上传下载的网络程序,写自己的屏幕保护程序,写......太多了!
我提醒大家,到时候不要怀疑自己的水平,不要迷信课本的片面,认真地去写,充满信
心和激情地去写,你会发现,自己原来也是可以做出如此好的程序,从前许多自己想都不敢
想的东西,如今也通过自己的努力而实现了。有时也不要吝于怀疑,可知我们青年人的有些
想法,有时不知要比教材和权威们高明多少倍啊!
——————————————————————————
五 一山更有一山高
————
学了Win32 API,可千万不能以为自己已经掌握技术的精髓,在追求技术的无限里,没
有最好,只有更好。
我举一二例。VxD会吗?编写基于CPU的Ring0级的系统DLL,会吗?这些属于Windows
系统极其深刻的内容,不但没有出现在市面上可见的书籍上,就连文档资料都是MicroSoft公
司发布的英文版。比如Windwos9x系列的DDK文档。杀毒软件的技术原理就在这个级别上,CIH
病毒的原理也在这个级别。杀毒软件的“实时监控”原理就是基于文件系统的底层中断的提前
截取和处理的技术。
这时,对网络的理解也应该是去更上一层楼了。不要满足于简单地使用网络编程接口,
应该试图去理解TCP/IP协议,去理解FTP,HTTP,POP3,SMTP等等遍布在Internet各处的协议,
去编写自己的各类网络服务程序。OICQ的原理就在这个级别上。
——————————————————————————
六 再看看四周:实践!
————
“乱花渐欲迷人眼”是当前各种编程工具所构成的现状。VB,VC,VFP,C++Builder,Dehil,
MS-C++,SQL等等,实在是太多了。其实,对一个程序员来说,能熟练掌握一门语言,是基本要
求。能用多门语言,是社会上的流行大趋势。我个人的情况是:能基本掌握VC编辑环境下的各类
编程方式,而VB,VFP,C++Builder等语言的代码我能阅读,关键时刻我也可以用它们来开发我
的软件。用多种多语言共同开一个发软件,其实是社会流行的另一个趋势。一个合格的程序员,
应该是对所开发的软件有一个统筹的规划和安排,这样的素质,只有是在学会多种语言的前提
下才能实现的。
上面的学习,归根到底也只是理论知识的学习,而只有在亲自地编写大量的程序后,知识
才能真正的形成网状,才能达到融会和贯通。计算机的学习讲究的是理解,而只有这个层次上
的理解,才是对计算机软件的真正理解。
——————————————————————————
七 再回首:看看教材
————
这个时候,再来看看教材,猛发现教材中原来还是有东西可学的。可是,这个认识,却只
是建立在具备了一些教材外的知识后,才能可悲地发现到。
世界本来就应该没有可以让人一次学到家的书本知识,教材当然也不例外!于是,我这才
真正发现了教材中那可贵的东西,可算是“只是当时已惘然”吧。可,没有学习教材之外的知
识,我能发现它吗?我自己认为不能。因为那样的话,就是“不识庐山真面目,只缘身在此山
中”。不出教材的框架,不见教材的全貌!蓦然间,我发现了自己也庆幸着自己?