目前位置: VCer资源中心 >>> VCer文章 >>> 软件工程

[本帖已阅读4801次 分值80 回复4次] 张贴资源 发回信箱 控制面板

白乔原创:实战软件DIY[5]

提供者:bluejoe 张贴时间:2004-04-25 11:43:49.0 出处:vcer.net 作者:不祥

白乔原创:实战软件DIY[5](2004-04-25 11:43:49.0)


白乔


 
级别: VCer师长
头衔: VCer创始人

经验: 21107
作品: 514
分会: 华北分会
注册: 2003-12-01 09:20:32.0
登录: 2009-01-02 17:21:44.0

 

4. 实战体验

经过详细的实战部署和系统设计,后面就是真枪实弹的实战了。我们按照软件实现(编码)——帮助文档——安装程序——软件打包——软件测试的顺序一一介绍。

4.1 版本管理

且慢!还是不要急着编码,在进入具体的软件实现阶段,作为常识,你应该掌握一下关于版本管理的概念。

版本管理是软件配置管理(Software Configuration Management,简写为SCM)的一个重要环节。版本管理不属于软件开发过程中某个特定的阶段,而是贯穿于整个软件开发过程中的,在软件开发过程中所有的分析、设计文档和源代码都必须有严格的版本管理来保证。

版本管理的工具软件很多,在众多的成熟产品和试验产品中,笔者推荐目前使用比较广泛、有较大用户前景且又能较易获得的版本管理器产品Microsoft公司的Visual SourceSafe(VSS)。VSS是Microsoft Visual Studio产品家族的一员,图8示出了使用Visual SourceSafe对FlashNow!进行版本管理的实况。

 clip_image001[67,964字节]

 图8 使用Visual SourceSafe进行FlashNow!版本管理

 

运用VSS进行版本控制管理的非常有效而且代价较小的解决方案是:

在一台Windows NT服务器或者是一台较为独立的Windows98/95 PC上安装VSS6.0的服务器端软件,创建一个为该整个项目存放用的数据库,然后在该数据库中创建各个项目和子项目,并由VSS管理员为小组的每个成员创建一个帐号及他们各自的权限;

在开发小组成员的PC上安装VSS的客户端软件,并创建自己的工作目录,这样在软件的开发过程中,只要通过该客户端软件登录到VSS服务器上,Check Out当前要进行工作的项目或文件,如有修改在工作结束时将其 Check In提交给VSS服务器进行统一更新。

如果你是单枪匹马,客户端和服务器端完全可以集成在同一台机器上。

4.2 软件实现

你已经有了好的软件思路,有了完整的系统设计方案,而且,你还知道了如何去维护你的软件版本,但到现在为止,你的代码还是一片空白。说干就干,我们开始编码。

1.       软件开发工具

“好马配好鞍”,选择合适的软件开发工具至关重要。有一句很流行的话:“真正的程序员用VC,聪明的程序员用DELPHI”,笔者不是聪明的程序员,然而既然我能够象使用自己的食指一样灵活地使用Visual C++,那么,我选择了VC(如图9所示)。

 

 clip_image003[70,200字节]

 

图9  使用Visual C++开发FlashNow!程序

 

FlashNow!基本上是个很正常的Windows Explorer-like SDI应用,使用MFC AppWizard(如图10所示)可以迅速得到系统的框架。

 clip_image005[108,018字节]

 图10 使用AppWizard构造FlashNow!应用框架

 

2.       天下文章一大抄

请不要误解我的意思,古人说“天下文章一大抄”,也并非是鼓励剽窃和抄袭;相反,笔者的意思是鼓励读者朋友们懂得借鉴,流行的开发工具包(SDK)不要太多,这些SDK提供了统一的用户界面和程序接口,你完全可以象使用自己的代码一样去使用它们。程序员要改掉顽固不化、闭门造车的臭脾气,该偷懒的时候就该偷懒。

确实有好多可以偷懒的地方,听说过CJ60Lib吗?我听说过。

CJ60Lib 是MFC扩展库(原名MFCXLib)针对Visual C++ 6.0进行升级的后续版本。CJ60Lib为用户提供了功能更强、界面更美观实用的类,例如CCJMenu提供了图标菜单,CJOutlookBar提供了类似于Outlook的界面。使用CJ60Lib,用户甚至可以只需要很少的代码构造出类似于Microsoft Visual DevStudio的界面来(如图11所示)。

 clip_image007[50,485字节]

 图11 CJ60Lib构造的DevStudio界面

 

CJ60Lib提供了一组文件Shell类:

CCJShell:文件Shell操作类,如获取文件信息、文件排序、枚举Shell菜单等;

CCJShellTree:Explorer文件目录树视图类,显示文件Tree列表;

CCJShellList:Explorer文件列表视图类,显示文件List列表;

使用CCJShell*可以轻松枚举出所有的文件项,包括我的文档、回收站、网上邻居等特殊文件夹,其行为完全和“资源管理器”相似。对CJ60Lib有兴趣的朋友可以参考如下地址:

http://www.codejockeys.com/codejockeys/

其中,CJ是codejockey的缩写。

笔者参考(“抄袭”)了CJ60Lib的源码,并根据FlashNow!的需求重新编写了CShell*类,事实证明,参考标准的SDK代码很容易达到事半功倍的效果。对CShell*代码有兴趣的朋友亦可以与笔者联系(但请勿应用于任何商用场合——不要做违法的事情)。

值得一提的是,仅仅“抄袭”源代码还是不够的,如果必要的话,笔者还鼓励读者朋友们抄袭一些成熟的应用的思路及实现方法。对于FlashNow!的双界面,笔者花了不少时间和经理,但最终仍很难得到满意的思路。这时候,使用Visual Studio Tools组中的SPY++,确实是另一种偷懒的办法。SPY++可以查看当前系统的所有应用的窗口(windows)、消息(messages)、进程(proccess)和线程(threads)——确实太棒了,既然acdsee已实现了双界面,而且据说效果还不错,那我们来用SPY++来窥其一二:

 clip_image009[72,870字节]

图12 使用SPY++查看acdsee

 

明白了,acdsee同时创建2个窗口,一个可见(visible),一个隐藏(hidden),好办,我们的FlashNow!也这么办,因为著名的acdsee已经证明这种方案是可行的,也是可以为用户所接受的。

还有什么可以“抄袭”的吗?有的,显示Flash有Macromedia官方的控件swflash.ocx,swflash.ocx是完全共享的,我们完全可以使用它来显示Flash动画,但还有可以改进的地方,我们完全可以将控件的界面菜单修改成中文(注意:这种“抄袭”不要应用于商用场合,否则——准备好罚金)。

用VC可以修改嵌入到.exe、.dll和.ocx的资源。启动VC,记住使用resource方式打开swflash.ocx,开始菜单的汉化,如图13所示。汉化后的菜单界面参见图2。

clip_image011[83,457字节]

 

图13 使用Visual C++修改swflash.ocx

 

FlashNow!启动时将自动检测ShockwaveFlash控件是否安装并实现自动安装。如图14所示。

 

 

图14 FlashNow!的控件自动检测画面

 

除此之外,帮助文档也可以拿来“抄袭”,这是后续内容,在此不再展开。

3.       好的编码风格

要编写最漂亮的代码。好的编码风格是软件编码设计的基础,在团体合作开发中尤为重要。一般的观点认为,好的编码风格应包括以下内容:

²        符合一定的命名规范;

²        要有至少20%的注释;

²        要为调试阶段准备足够的调试信息;

²        不要节省硬盘空间,加上合适的空白(包括Tab,空格和换行);

²        面向对象,层次清晰;

²        尽可能的模块化,消除重复与冗余;

²        逻辑清晰,不用goto语句,多用异常机制;

以下片段摘自于FlashNow!源码,仅供参考:

 

//函数FindChild,在子项中查找指定目录项

//参数hParent,父目录

//参数pSlid,指定目录项,CshellListItemData类参见Shell.h

//返回查找结果,NULL为查找失败

HTREEITEM CShellTree::FindChild(HTREEITEM hParent CShellListItemData *pSlid)

{

 //是否包含子项

 if (ItemHasChildren(hParent))

 {

  HTREEITEM hChildItem = GetChildItem(hParent);

  //查看所有子项

  while (hChildItem)

  {

   //比较子项内容

   if(!CompareStid(GetItemData(hChildItem)(LPARAM)pSlid))

    return hChildItem;

   hChildItem = GetNextItem(hChildItem TVGN_NEXT);

  }

 }

 //查找失败,返回NULL

return NULL;

}

 

保持好的编码风格,并不是严格依照死板的标准,程序员有必要在代码的可写性(不要让自己难受是首要条件)和可读性(不要让别人难受)找到一个合适的均衡点。

4.3 帮助文档

对于程序员来说,编写帮助文档就象写情书一样令人头疼,但记住,你必须写下去!再则,帮助文档,其实也是一个签名的好机会,何乐而不为呢?

1. 帮助文档格式

如果你已经装了Windows 98或者后续版本,一定会发现它的帮助文档和以前已经完全两样了。它采用新一代基于HTML文件格式的帮助文档,文件扩展名为.chm(已编译的HTML帮助文件)。HTML帮助文档是一个统一的窗口(参见图4),改变了原有帮助文档目录窗口和文档内容窗口分离的情况,左侧是目录(Content)、索引(Index)和搜索(Search)这三个功能项,通过常见的标签栏切换。右侧是帮助信息的显示部分,显示的是完全正常的HTML源代码。

2. 使用HTML Help WorkShop制作帮助文档

制作HTML帮助文档的工具很多,最常见的是微软公司的HTML Help Workshop工具包,感兴趣的朋友可以查看以下的地址:

http://www.microsoft.com/workshop/author/HTMLhelp

HTML Help Workshop是英文版的,不过没有关系,帮助文档运行文件有简体中文版,并且运行的界面是根据用户使用的操作系统,与Workshop的语言版本没有关系。

图15示出了使用HTML Help Workshop设计FlashNow!帮助文档的实况。

 

clip_image015[60,583字节]

 

图15 使用HTML Help Workshop设计FlashNow!帮助文档

 

HTML 帮助文档的核心是充分利用HTML文件的表现能力,对分散的HTML文件(包括图片、声音文件等)作整体的包装,只要你会制作HTML文件,基本上大事已备。

要生成已编译的chm文件,需要以下源文件:

²        .htm文件:网页文件,用以描述各帮助页面;

²        .hhc文件:content文件,用以描述各帮助内容项;

²        .hhk文件:index文件,用以描述各帮助关键字项;

²        .hhp文件:工程文件,包含描述工程配置;

下面我们以FlashNow!为例,简单学习一下帮助文档的制作:

²          运行Help Workshop,新建一个“工程(Project)”FlashNow.hhp,出现工程编辑界面。在工程编辑界面的上方是3个标签栏,第一个“Project”是有关工程的编辑,第二个“Contents”是目录,第三个“Index”是索引。

²          选定“工程(Project)”标签栏,单击“改变工程选项”按钮,出现工程选项对话框,这里仅改变标题(Title)的内容,把制作内容标题“FlashNow!1.05.20用户帮助手册”写入,编译后这个标题将出现在窗口的标题栏中。其它的内容暂时用系统的默认值。然后单击“加入/删除封面文件”按钮,加入封面页的HTML文件。封面页的文件一定要有,否则编译的帮助文件运行后,系统会报错。好了,简单的工程编辑就完成了。

²          选定“目录(Contents)”标签栏,这时系统请你选定一个新目录文件的名称,指定后出现目录编辑界面。按照内容的需要添加标题(Heading)或页面目录(Page),并对每个目录选定相应的HTML文件。标题可以分为多级,并在标题上也放置需要的HTML文件,作为标题的说明内容。如图4的左侧所示的FlashNow!的Contents,通过“添加标题(Insert a head)”,依次建立“What's FlashNow!”“系统注册与安装”“功能描述与使用”“版权信息”“常见问题解答”5个标题,再在各级标题下“添加页面目录(Insert a page)”,并设定好每项页面目录所对应的页面(URL)。

²          完成目录编制后,一个HTML帮助文件已具备了雏形,什么都先别干,现在编译(File\Compile)!在当前工作目录可以找到FlashNow.chm,就是编译之后的帮助文档了,呵呵,怎么样?看到效果了吗?

²          还没有结束呢,完整的帮助系统应该还包括索引,选定“索引(Index)”标签栏,添加关键字(Add a keyword),这样,FlashNow.chm就是一个完整的帮助文档了。

上述内容简单介绍的是编制HTML帮助文件的基本步骤,上手很容易。但HTML Help Workshop的功能远非这些,如在窗口定义中可以设计你所喜爱的形式,几乎所有的窗口要素都可以改变。它还支持全文检索功能,而且很容易制作。详细的内容请参考HTML Help Workshop的帮助文档,或微软的相应网页。

如果你缺乏学习HTML Help Workshop的动力,试着想想别的办法,将往日的情书(当然是写给同一个人的)和QQ聊天记录用HTML Help Workshop封装起来,送给心爱的美眉,绝对是个好主意。

4.4 安装程序

1. 规范化的安装程序

当你完成一个应用软件的开发后,如果你的软件不要求是那种“绿色”产品(“绿色” 产品不会随便弄脏用户的硬盘),那么你还需要为分发该软件而做一个规范化的安装程序。这是使你的软件商品化所不可缺少的一步。

一般而言,一个规范化的安装程序应该满足以下几个条件:

²        只需安装一次。也就是安装完后,用户不用进行其它的设置就能使用你的软件;(应用软件内部的参数设置是另一回事。)

²        要保证目标盘上“简洁、干净”。就是说你的安装程序能根据用户所选择的功能,仅安装所需的部分,不把多余的文件复制到用户的目标盘上,特别是不向注册表中添加无用的信息;

²        要保证对注册表的正确使用,注册表实际上是一个Windows的系统数据库,所有应用软件都可用它存储一些必要的信息,例如用户注册信息、类的注册、系统配置信息等,但对注册表使用不当,就会导致系统性能的降低;

²        安全性。安装程序应具备对已安装系统进行必要检查的能力,同时还应具有卸载功能,让用户可以根据自身的需要卸载你的软件。在做这些的同时,还不应影响其他应用软件的正常运行;

2. 使用SetupBuilder制作安装程序

安装程序的制作工具很多,知名的有InstallShield和Wise。如图16为InstallShield for Microsoft Visual C++ 6的界面。

 

clip_image017[98,785字节]

 

图16 InstallShield for Microsoft Visual C++ 6

 

“萝卜青菜,各有所爱”,笔者比较喜欢使用国产的中文软件SetupBuilder(如图17所示)。感兴趣的读者朋友可以访问以下地址:

http://www.irsys.com.cn

 clip_image019[143,678字节]

 

图17 使用SetupBuilder制作FlashNow!安装程序

 

以FlashNow!为例,以下简要介绍SetupBuilder的使用步骤:

²        新建工程FlashNow.spp;

²        常规设置\安装程序基本设置:设置基本信息,如图18所示;

 

 

图18 FlashNow!的安装程序基本设置

 

²        常规设置\指定文件组、组件和安装类型:FlashNow!设置了2个文件组:Program Files包含可执行程序flashnow.exe和ShockwaveFlash控件中文版本cswflash.ocx;Movies包含范例文件flashnow.swf和版本信息文件about.swf。接下来设置组件以包含不同的文件,最后设置不同的安装类型(典型、最小、自定义)以包含不同的组件。

²        常规设置\安装程序对话框设置:设置安装时各对话框的信息内容,这一项很简单,界面完全可视化。

²        完成编译\编译安装程序:选择发布磁盘类型为1.44M,编译;

运行setup.exe,看到激动人心的界面了吗?“FlashNow!1.05.20安装程序正在启动SetupBuilder(TM)安装程序向导,以帮助完成接下来的工作,请稍候……”,yahoo!感觉如何?

FlashNow.spp还需要别的配置才算完整,因为以上的步骤生成的setup.exe除了拷贝文件这些蛮活,别的什么都不会做,没有桌面快捷方式,“开始\程序”里也没有FlashNow!,这个安装程序对于注册表没有丝毫的改动,当用户双击Flash文件的时候,如果没有合适的播放器的话,系统仍会傻乎乎地要求你选择打开方式……

好办,继续修改FlashNow.spp:

²        高级设置\指定程序组和图标:在可视化的“所见即所得(WYSIWYG)”界面中添加桌面快捷方式和程序项;其中程序项包括“白乔主页”、“FlashNow!动画浏览器”和“卸载FlashNow!动画浏览器”三项;

²        高级设置\登记注册表信息:同样的可视化“所见即所得(WYSIWYG)”界面,添加以下内容:

我的电脑\HKEY_CLASSES_ROOT\.swf = ShockwaveFlash.ShockwaveFlash

我的电脑\HKEY_CLASSES_ROOT\ ShockwaveFlash.ShockwaveFlash = ShockwaveFlash动画文件

我的电脑\HKEY_CLASSES_ROOT\ ShockwaveFlash.ShockwaveFlash\Shell\Open\Command = "<INSTALLDIR>\FlashNow.exe" "%1"

我的电脑\HKEY_CLASSES_ROOT\Folder\ Shell\启动FlashNow!动画浏览器(&F)\Command = "<INSTALLDIR>\FlashNow.exe" -B "%1"

我的电脑\HKEY_LOCAL_MACHINE\SOFTWARE\bluejoe\FlashNow.Vesion = 1.05.20

前三项操作用以注册.swf的文件类型,并指定FlashNow!为关联应用程序;最后一项注册版本信息;第四项则在文件夹Shell菜单里添加“启动FlashNow!动画浏览器(F)”项,其行为如图19所示。

clip_image023[80,525字节]

 

图19 FlashNow!在文件夹Shell菜单中的行为

 

怎么样?酷吧?

SetupBuilder什么都好,就是要注册不好,否则超过2M的软件包不给制作。要么你去缴费注册,要么你就只有去学习E文软件InstallShield。

4.5 程序打包

SetupBuilder生成出来的是一堆安装文件。打包成一个zip文件很不错,但更好的主意是打包成一个自解压文件,Winzip Self-Extractor就是这样的工具,图20示出了Winzip Self-Extractor的工作界面。

 

图20 使用Winzip Self-Extractor制作FlashNow!安装包

 

使用Winzip Self-Extractor制作软件包很简单,只要按照程序向导一路Next即可。运行打包后的文件,FlashNow.exe将自动解压并运行setup.exe开始系统的安装。

4.6 软件测试

软件开发还没有完成,还有软件测试。

不要忽略软件测试。目前国内很多软件开发公司存在一个通病,那就是开发出来的软件产品的质量一直得不到很好的保证,很多产品在正式交给用户使用后总是存在诸多的问题。其原因是多方面的,很重要的原因是软件开发的管理水平不高,尤其是一直以来忽视了对软件产品进行必要和充分的测试。

完整的测试生命周期包括测试计划、测试设计、测试开发、测试执行和测试评估。以FlashNow!为例,按照测试内容,测试可以分为:

²        功能测试(FlashNow!满足了所有的功能需求吗?)

²        用户界面测试(FlashNow!的用户界面友好吗?)

²        性能测试(FlashNow!性能稳定吗?存在“异常错误”吗?)

²        压力测试(在系统环境不正常的情况下,FlashNow!运行如何?)

²        容量测试(系统满负荷的情形下,FlashNow!的承受能力如何?)

²        配置测试(FlashNow!的软件配置和硬件配置如何?)

²        安装测试(FlashNow!安装之后,组件是否齐全,系统设置是否正确?)

测试过程包括单元测试、集成测试、系统测试和验收测试。验收测试是发布软件之前的最后一个测试操作。验收测试的目的是确保软件准备就绪,并且可以让最终用户将其用于执行软件的既定功能和任务。

实施验收测试的常用策略有三种,它们分别是:正式验收、非正式验收(α测试)和β测试。α测试是由用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的测试;β测试是由软件的多个用户在实际使用环境下进行的测试。只有当α测试达到一定的可靠程度时,才能开始β测试。β测试处在整个测试的最后阶段。同时,产品的所有手册文本也应该在此阶段完全定稿。

FlashNow!的β测试由一群热心的(也许是无奈的)网友和兄弟们帮助完成,对于他们无限的热忱和对各种bugs无限的承受力,笔者在此表达深深的敬意!

按照测试方法来分,测试包括人工测试和工具测试两种,可视测试工具有:Rational Visual Test,Rational Performance,Logiscope TestChecker 等等,在此不在赘述。

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1076417661418.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

1082687209616[385,308字节]

得意,我用他的代码;

自豪,他用我的代码!

[回复该贴] [加入个人书签]
[连载系列]

[1] 白乔原创:实战软件DIY
[2] 白乔原创:实战软件DIY[2]
[3] 白乔原创:实战软件DIY[3]
[4] 白乔原创:实战软件DIY[4]
[5] 白乔原创:实战软件DIY[5]
[6] 白乔原创:实战软件DIY[6]

[投票结果]

A: 评分 10 0% (0 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 0% (0 票)

 


re:白乔原创:实战软件DIY[5]

...

GoAndEnjoy 于 2008-10-03 19:27:36.0 编辑 [回复该贴]

re:白乔原创:实战软件DIY[5]

...

GoAndEnjoy 于 2008-10-03 19:24:44.0 编辑 [回复该贴]

re:白乔原创:实战软件DIY[5]

...

GoAndEnjoy 于 2008-10-03 19:24:22.0 编辑 [回复该贴]

re:白乔原创:实战软件DIY[5]

下次细看

funnylove 于 2007-09-01 06:00:26.0 编辑 [回复该贴]