随着程序变得越来越大,我们会发现很多问题。这些问题或许在编制几千行代码时不会出现,但是当编到上万行或更多时并且程序由不同的程序员来编写,在运行时问题就出现了。
这就要求程序有经深思熟虑的结构和详细的注释。在编制大程序时主要要考虑两点:
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 |
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
相关专题
- 保持进程在Shell退出后能继续运行方法 (3次浏览)
- BPEL的基本思想 (1次浏览)
- 在Shell中执行vi/cp/mv时自动备份源文件 (0次浏览)



