WAP之家:为您提供最全最新的WAP技术,CP.SP.3G等行业资讯。 WAP之家交流论坛全新开放 点击进入>>
WAP资讯 | 3G动态 | SP动态 | 运营商动态 | 内容商动态 | 制造商动态 | 论坛讨论>> 每次自动访问
WAP技术 | WAP源码 | 手机编程 | 手机源码 | 无线技术 | J2ME技术 | 手机软件 添加到收藏夹
IVR技术 | SP资料 | SMS MMS技术 | 商业方案 | IVR下载 | 书籍教程 | 工具软件 语言:繁體中文

WAP之家技术文章手机编程PlamPALM开发教程-第十二章 专业编程技巧

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

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  下一页

[] [返回上一页] [打 印]
文章评论

用户名: 查看更多评论

分 值:100分 85分 70分 55分 40分 25分 10分 0分

内 容:

         (注“”为必填内容。) 验证码: 验证码,看不清楚?请点击刷新验证码