PALM开发教程-第十二章 专业编程技巧 |
| 作者:palmheart 来源:palmheart.net 发布时间:2005-12-21 3:39:54 |
|
随着程序变得越来越大,我们会发现很多问题。这些问题或许在编制几千行代码时不会出现,但是当编到上万行或更多时并且程序由不同的程序员来编写,在运行时问题就出现了。 这就要求程序有经深思熟虑的结构和详细的注释。在编制大程序时主要要考虑两点: 1 怎样使程序容易维护 2 怎样使程序可重用(reuse) 当然,我们想使程序可以被任何一个人都看得懂,容易维护并重用。特别是对Palm OS来说,由于它的很多应用窗体都十分相似,采取这样的策略将带来很大的效率。虽然PC的处理器速度和内存都在飞速的发展,但是就Palm OS现在的情况来看,必须要聪明的使用处理器和内存。但也不能忽视可维护性,只有具备好的可维护性,才能使代码更容易被优化。 这一章中,我们将接触到很多专业的编程策略。在学习的过程中,我们还将根据这些策略建立一些可重复使用的模块,希望你能在这些编程策略中得到益处。 通过这一章的学习,可为你创建Palm OS应用程序打下一个坚实的基础。 类型保护变量和可移植性 可移植性是代码可重复使用的关键因素之一。可移植性是指代码可以做很少的修改就能被不同的编译器所编译;并且只有将界面和代码分离(因为界面一般都是基于系统的,而代码要工作在不同的平台上)才能提高可移植性。 下几章中我们将以计算器的例子来证明下面讲到的内容。计算器的用户界面和程序代码被分离开来,这样就可以很容易将计算器程序应用到Windows 或Macintosh平台上。 为使程序工作在不同的编译器和系统下,使用类型保护变量是主要途径之一。或许你还不知道什么是类型保护变量,但是在本书中我们一直在使用类型保护变量——至少是使用Palm OS版本的类型保护变量。类型保护变量就是指:不是使用标准C中的数据类型如int或char,而是使用命令typedef来自定义的数据类型。 为什么类型保护是如此重要呢?这是因为在标准C中,如int在CodeWarrior C编译器中是16位,而在其它的一些常用编译器中包括GCC,它的长度都是32位。如果你在很多地方都使用了数据类型int而又想从CodeWarrior转换到GCC,那么由于类型int的长度问题就会引起很多的bug,数据结构要改变,数据库记录的大小也要改变。情况严重的话,程序将根本就不能运行。 不仅仅是类型int可以造成可移植性的问题。还有一些其它的类型存在此类问题,例如数据类型char,在日本,char是16位,而不是一般所指的8位。因此,如果要使所编制的程序国际化,那就需要重新做大量的工作。 有关类型保护变量和Palm OS,我的意见是如果你在写基于Palm OS的用户界面代码,就要使用Palm OS的类型保护变量。在Palm OS以后的发展中,其开发人员会小心的处理这些类型保护变量。这样你会发现只要使用了正确的类型保护变量,就可以很容易的将现有的版本升级到新版本。 如果你写的代码也将工作在其它的操作系统平台上,也应该使用自己定义的数据类型。当然,也不能再直接调用Palm OS的函数,利用自己的定义的函数名调用这些函数,或者在头文件中使用#define语句修改函数名来调用这些函数。 使用匈牙利符号(Hungarian Notation) 在看一个大块的代码时,很容易将在函数头部定义的变量的数据类型忘掉。使用匈牙利符号是解决这个问题的一个好方法,因为它可以使别人很容易看懂。在匈牙利符号中,它使用了一些字母在变量的开头,可以使你能记住变量的数据类型。例如,“c”代表char,“p”代表指针,所以cpBuffer代表指向一个缓冲区的char*变量。 匈牙利符号有很多样式。在表12-1中,是我的两个版本,我发现它们可以很好的应用在C、C++和Mac、Windows、Unix中,当然还包括Palm OS。在接下来的部分中,我将全部使用这些符号来定义变量。 字母 数据类型 描述和例子 a [] 数组符号:Char caBuffer[20] b Byte 8字节的数字变量:Byte bFlags c Char 字节:char c d Dword 32字节的数字变量:Dword dCounter e enum 枚举类型的变量:spEvent->eType f float 32字节浮点数:float fResult g global 全局性变量,即可以在所有的模块中使 用:app_t gsApp h handle 在一些系统中是void*,其它的为Int:VoidHand hRecord i int 整型变量:Int iCounter j k const 在C++中为常量定义或返回值定义 l long 长整型:long Ivalue m member 结构或类的成员变量:char mcaBuffer[20] n double 64位的浮点数:double nBigNum o Boolean 布尔值,真或假:Boolean oFirstPass p pointer 指针:void* vpPointer q r raw 二进制数据类(C++) s struct 结构或类:sEvent t text 文本型类(C++) u unsigned 无符号数:unsigned bong ulNumber v void 空数据类型:void* vpPointer w Word 字,一般为16字节:Word wNumber x y z 可重复使用的主模块 我们将重新从头开始,虽然有些烦但是你将有很大的收获。第一步我们先创建一个象在第二章中的Hello程序的例程。但是我们的新程序将更容易被重用并扩展至更大的程序。学习如何创建一个这样的主程序框架并不是什么困难的事。 首先打开CodeWarrior IDE创建一个叫计算器(Caculator)的程序。将源文件和资源文件夹中的文件全部删除,并清除Src文件夹中的所有文件。 从构造器中创建一个新的资源工程,将其保存为Calculator.rsrc。按下CTRL-K新建一个窗体。打开窗体并放置一个按钮到窗体的中间。使用这个按钮将可以测试到我们的程序是不是在运行。然后我们将为计算器创建一个真正的用户界面。程序的界面如图12-1所示: 我们也添加一个叫做LowROMVersionError的警告。当在我们使用的 Palm设备版本太老不能支持程序中使用的函数时,就弹出此警告框,如图-12所示: 现在向工程中添加一些源代码。 1. 打开CodeWarrior IDE并选中Project | Create New Group; 2. 将其命名为AppIncludes。这里面将放头文件。工程将缺省的创建一个叫Caculator_res.h的头文件放到文件夹中; 3. 将Caculator_res.h添加到这个新组中。 main.c模块 现在创建一个叫main.c的新文件,将其放在AppSource组中。这个模块包含着应用程序及事件循环(event loop)的入口以便能重复使用。详细内容如下: ////////////////////////////////////////////////////////////////////////////// // main.c // Main entry point and event loop. // Copyright (c) 1999, Robert Mykland. All rig |
| [] [返回上一页] [打 印] |
|
文章评论 |
