精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>● Powerbuilder>>PFC>>PFC 详细说明

主题:PFC 详细说明
发信人: edison()
整理人: leitiger(2002-06-05 23:52:36), 站内信件
PFC的详细介绍
PowerBuilder Foundaction Class(PFC)是SyBase公司提供的一整套PB对象。整套对象都基于面向对象原则。PFC不同于VC的MFC、BC的OWL、Delphi的VCL 
。MFC、OWL、VCL都是较底层的类库。它们为WINDOWS编程提供了基本的控件、对话框等,它们都主要着眼于封装WINDOWS的API,使得使用它们的人可以不必了解API以及一些Windows结构、Windows消息的细则即可以编写出WINDOWS下的应用程序。也就是说这些类库适合各种类型的WINDOWS应?BR>贸绦蚩ⅲ舱且蛭庖坏闶沟迷诶谜庵掷嗫饨锌⑹比匀灰蛭煌挠τ霉嬖蚨直鸨嘈创罅康拇搿6鳳FC则不同,PFC是专门为PB而设计,PFC专门为数据库应用软件而设计。它有明显的针对性。它提供了几乎所有作为一个数据库应用软件开发而需要的代码。举一个最简单的
例子:作为数据库应用程序不可避免的都得具备保存数据的功能。如果你使用PFC,你继承PFC的窗口、PFC的菜单、PFC的DataWindow Control 
,将它们连在一起后,你无须编写任何代码。点击菜单上的保存,DataWindow中的数据很自然的保存起来了,并且当数据被更改后用户没有保存数据而直接关闭窗口时,窗口很自然的会出现提示框要求保存数据。所有的这一切,你都无须编码。你只要确认你的对象是PFC的子类即可,所有?BR>拇朐赑FC的父类中已经替你完成。所以可以知道PFC的着重点并不是如何实现一个窗口控件,如何封装WINDOWS 
API(与MFC、OWL、VCL的不同之处),而是为了实现作为数据库软件而应该具备的各种公共的功能。因此可以说PFC是更高一级的类库(其实PB中的各种标准控件、窗体、按钮、图片框等等都是利用MFC开发出来的),它更加贴近应用程序的开发。使用PFC开发程序只需要更少的代码、更容?BR>孜ぁFC的对象分布在Sybase公司发行的10个PBLs中。因此你完全拥有PFC的所有源代码。你可以随心所欲的更改父类脚本,你还可以从中学到许多的PB高级技巧。
1 PFC的面向对象特性
PFC是一个完全面向对象的类库。它涵盖了继承、封装、多态、函数覆盖、函数重载,所有面向对象应该具备的特性它都有。它的面向对象都体现在如下几点。
l 继承:PFC中的对象全部都是息息相关,绝对不存在一个独立的对象,任何一个对象都是整个类库链中的一员。
l 封装:PFC中的所有对象都封装了许多函数、实例变量。并且设有相应的访问权限(PFC没有一个Private类型变量)。对于那些可读的变量PFC都设有of_GetVariablename 
函数,对于布尔类型的变量PFC都设有of_IsVariablename函数。对于可修改的变量PFC都设有of_SetVariablename函数。在某些情况下PFC还将变量直接设成Public类型的变量供我们直接修改。
l 多态:PFC在许多地方都用到了多态。例如PFC中的File Service就是一个典型的例子。File Service有一个祖先n_cst_filesrv。其中定义了File 
Service的所有函数,但是其中没有任何代码。真真的代码在pfc_n_cst_filesrv子类中实现。例如关于WIN32操作系统的文件管理函数则被在n_cst_filesrvwin32类中实现、关于UNIX的文件管理函数则被在n_cst_filesrvUnix中实现。通过这种多态的利用便实现里跨平台的代码。开发人员使
用的File Service的类永远是n_cst_filesrv,PFC会自动的根据不同的操作系统创建不同的n_cst_filesrv的子类来完成不同操作系统下的文件管理。而所有的这一切,PFC开发人员都不需要知道。这就是PFC的多态的一个典型的运用。

下面是PFC的一个简要的继承关系图:

 
2 PFC的体系结构-Service-Based Architecture
PFC采用的是一种新的体系结构-基于服务的体系结构(Service-Based 
Architecture)。PFC类库设计核心就是面向服务的设计。服务(也叫Service)实际上就是PFC提供的一套功能。PFC中的服务实际上都是不可视的用户自定义对象,不过有的服务也涉及到一些可视对象,例如下拉日历与下拉计算器。这些用户自定义对象中封装了许多函数、事件、属性等等
。通过调用这些函数、事件即可完成我们想要的功能。例如WINDOWS的Resize服务。通过调用Resize服务的注册函数,注册那些需要Resize的控件,这样当窗口发生Resize事件时窗体将自动的触发Resize服务的代码。Resize服务将会依据窗口大小的变化调整那些注册过的控件的位置与大小?BR>T葱枰颐亲孕屑扑恪⒌髡鞲隹丶恢玫拇耄缃馪FC的Resize全部替我们完成了。而且它的实现全部在n_cst_resize用户自定义对象中。这就是PFC的服务结构,一个服务就是提供了一套完整功能的不可视用户自定义对象。而且所有的这些对象都不是孤立的,它们都在PFC的类库链
上。PFC提供的服务有很多。下面做一个简要的介绍:

PFC的服务分五大部分:应用程序服务(Application Services)、窗口服务(Window Services)、数据窗口服务(DataWindow Services)、数据存储服务(DataStore Services)、全局服务(Global Services)。
2.1     应用程序服务
l 错误消息服务(Error Message Service)
错误消息的处理是所有应用程序都必须具备的功能。好的错误处理可以提高软件的可靠性、稳定性、加快软件的测试速度等等。PFC提供的错误消息处理就非常好。它允许开发人员为各种错误消息定义级别,当程序出现大于某一级别的消息时错误消息服务将会自动将错误消息记录到错误日?BR>局小U庋⑷嗽蓖ü治鱿⑷罩揪涂梢粤私獾接τ贸绦蚍⑸耸裁创砦螅约按砦蠓⑸谀母龆韵蟆⒛亩谓疟尽⒛男写搿2⑶襊FC的错误消息服务现在还具备邮件功能。这样当用户在使用软件是出现了错误后,PFC的错误消息处理将会把发生的错误消息邮寄给开发人员。这种错误消?BR>⒌拇矸浅J视糜谌禾蹇ⅰ?⑷嗽庇氩馐匀嗽倍荚谝桓鼍钟蛲匣蛟贗nternet上,软件发生的错误将会及时传到开发人员的手中。PFC的错误消息服务还提供了一种预定义消息的机制。开发人员可以利用数据库保存预定义的消息。将各种消息预先在数据库中定义好,定义好显示的内容
、标题、图表、按钮等。当要显示时只需指定要显示的消息ID。这种预定义消息机制为应用程序显示一种统一的消息而提供了方便。同一类型的消息显示的都是类似的提示(可能具体参数不一样)。同时消息的修改也方便了许多。不必再需要从大量的代码中寻找需要修改的消息。
这就是PFC提供的一个非常有用的服务之一,PFC中存在大量的这种服务。

l 应用程序安全服务(Security Service)
    
大部分的数据库应用软件都必须得进行应用程序的安全控制。PFC的应用程序安全服务为你完成了大步部分的安全管理。你可以使用PFC提供的安全扫描器定义你为了实现安全控制而涉及的对象。安全扫描器会将需要进行安全控制的对象记录到数据库中(PFC提供了5个用于实现安全控制的表
)。PFC还提供了用于设置用户使用权限的模块,你只需针对具体的应用稍做修改即可使用。然后你只需开启安全服务,在需要进行安全控制的窗体、菜单、数据窗口的构造事件中调用gnv_app.inv_security. 
of_SetSecurity(this)即可。当然PFC的安全服务仍然存在缺陷,例如PFC提供的用户管理没有密码的设置。

l 数据窗口缓存服务(DataWindow Caching)
数据窗口的缓存服务为应用程序提供了一个缓存数据的功能。可以有效的减少对数据库的访问。提高应用程序的响应速度。使用该服务非常简单只需将DataWindow或者SQL语句注册一边即可。

2.2     窗口服务
l 偏爱服务(Preference Service)
    PFC的窗口偏爱服务提供了自动保存与恢复用户设置的功能。偏爱服务一旦被开启,它会自动的记录窗体的大小、位置、工具条状态等与窗体相关的信息,当窗口再次被打开时偏爱服务会自动的恢复这些设置。所有这一切只需调用窗体函数This.of_SetPreference(True)即可。

l 状态条服务(Status bar Serice)
PB MDI窗口提供的状态条非常简单。为此PFC专门提供了一个状态条服务。利用状态条服务,可以设计出功能强大的状态条。例如你可以在状态条上显示图标,并可以响应事件。可以在状态上显示时间,可以显示进度条等,还可以显示其他的一些与系统相关信息,例如:剩余内存。

2.3     数据窗口服务
数据窗口是PFC最重要的一部分也是使用得最多的服务。

l 下拉数据窗口查询服务(DropDown DataWindow Search Service)
下拉数据窗口查询服务提供了一种自动滚动到首字符与用户输入的字符相同的数据项上。例如:当用户输入A时,下拉数据窗口查询服务会自动的滚到以字符A开头的数据项上。

l 高级查询服务(Filter Service)
高级查询服务提供了一种非常灵活的查询方式给用户。它还可以提供类似SQL语句查询给那些高级用户。一般的用户通过使用高级查询几乎可以完成所有的查询操作。在配合DataWindow的计算列、汇总函数等,各种情况下的汇总、统计功能也都完成了。在本次项目中我就大量的使用了高级?BR>檠负跛械哪?槎加懈呒恫檠J褂酶呒恫檠穹浅<虻ィ恍璧饔肈ataWindow控件的of_SetFilter(True)函数,再调用of_SetStyle设置高级查询窗口的样式,即完成高级查询功能的制作。

l 改变大小服务(Resize Service)
Resize Service提供了一种功能使得DataWindow控件的大小发生变化相应的调整其中的控件的大小与位置。Resize Service使用起来与使用窗口的Resize服务一样方便、简单。

l 行管理服务(Row Manager Service)
行管理服务提供了一种对数据行进行有效管理的服务。例如:行管理服务提供的恢复删除的功能。你只需调用事件pfc_RestoreRow即可恢复用户已删除的数据。为数据库应用软件的开发提供了极大的方便。

2.4     全局服务
全局服务提供了一些在任何场合、任何环境中都可以使用的服务。

l 菜单服务(Menu Service)
菜单服务提供了一种方便的机制供菜单与窗口通讯。本次项目中的所有的菜单都使用了的菜单服务。使用菜单服务提供菜单的重用性、减少重复的代码。

l 改变尺寸服务(Resize Service)
Resize Service为许多可视的容器对象都提供了Resize服务的功能。例如窗口的Resize功能就是由该服务提供的。可视用户自定义对象的祖先类u_base也使用了Resize Service 。因此,如果你遵循PFC的继承策略。那么你自定义的User Object也将具备Resize功能。Resize 
Service还大量的运用在其他场合,例如u_tabpage对象中。你也完全可以在其他自定义对象或其他场合使用Resize Service,因为它是全局的。

l 文件服务(File Service)
PFC的文件服务提供了一种与平台无关的文件服务。也就说使用PFC的文件服务中的关于文件的函数可以不必考虑具体的操作系统,PFC会自动的根据应用程序所在的操作系统进行相应的API调用。

小结:PFC的服务还有许多,而且都很有用,使用起来也很方便。例如INI文件服务提供了一种非常便利的方式访问INI文件。DataWindow的排序服务,日历、计算器服务等。 由于篇幅有限,只做了简单的介绍。
3 PFC分层的概念与用意
PFC中层的概念是PFC非常重要的一大特色。也正是PFC的层的概念吸引了我,使我开始学习PFC。PFC中层的设计使得软件开发与维护变得非常方便。下面就详细的讲述以下PFC层的概念。
3.1     PFC中的PFE层(也叫扩展层)
PFC它是一套类库。PFC的设计是为了制作一套可以提供所有使用PB开发数据库应用软件所需要的功能。但是我们都知道这是不可能的。因为,任何应用软件都可能存在一些特别情况,需要特别的运用。如果不存在PFC的扩展层或者说PFC没有分层的概念。那么我们为了具体的应用需要做修改
时,我们将会直接修改PFC的代码。如果真的是这样的话,那么便会出现一个问题,那就是当Sybase公司升级PFC时,你又不得不再次重新修改一遍,因为新版的PFC覆盖了原来的PFC文件你所做的修改也全部丢失。但是如果存在一个独立的扩展层,那么。
扩展层就是一整套完全继承PFC对象的全部对象集合。扩展层的对象保存在独立的PBLs中。PFC将PFC对象定义为PFC层对象,所有PFC层对象的前缀都带有"pfc_"(例如pfc_w_main),并且都保存在PFCxxxxx.PBL中。PFC将扩展层对象定义为PFE层,所有的PFE层对象都没有前缀(例如w_main)
,并且PFE层对象全部保存在PFExxxx.PBL中。PFE层中其实没有任何代码,只是简简单单的继承了PFC层中的对象。这样做的好处就是假设开发人员需要为特定的应用而修改PFC对象时,这时改去修改PFE中的对象就可以了。这样当Sybase公司升级PFC时,便不会再有冲突了。引入PFE层后我们
的对象也就全部改为继承PFE对象,这样如果我们需要增加一个整个应用程序都具备的特性时只需修改PFE中的对象即可完成。例如:我们程序的窗体全部继承W_Main。如果我们要在令到我们的应用程序中的全部窗口的图标都会变化(一张会笑的脸!),我们只需在W_Main窗口增加代码就可
以令到整个应用程序的所有窗口都具备这种特性。由此可以看到扩展层为我们的开发带来了极大的灵活性。其实PFC扩展层的设计也是PFC面向对象设计的一个重要特点。也正是PFC的面向对象的设计使得我们修改整个应用程序如此容易(上例中修改W_Main窗口)。
3.2     PFC的中间层
PFE层是一套完全继承PFC层对象的对象集合。按照这种思路Sybase公司又提出了中间层的概念。中间层对象就是那些继承PFC层的对象,PFE层的对象又继承中间层的对象。也就说中间层的对象是位于PFC与PFE层对象之间的对象。中间层有时也叫企业层、部门层对象。中间层提供了供开发人
员设计一种企业级或者部门级软件特色的功能。我们都知道一个软件企业或者一个软件部门开发的软件往往不止一套。而往往一个软件企业或者软件部门开发的软件都具备自己的一套特色(从外观上、功能上、操作方式上等)。如果每个企业或者每个部门做每套软件是都要在PFE层的对象?BR>屑由鲜粲谧约禾厣拇搿D敲慈砑て鹄匆膊环奖恪5侨绻颐抢弥屑洳悖扛銎笠怠⒚扛霾棵哦嘉ぷ抛约旱闹屑洳愣韵螅粲谄笠导丁⒉棵偶兜奶厣攵急嘈丛谥屑洳阒小C刻兹砑加蒙狭薖FC层、中间层、PFE层对象。这样来自不同的企业、不同的部门的软件都具备着自?BR>旱奶厣备鞲銎笠怠⒉棵盼て鹄匆卜浅7奖恪U饩褪侵屑洳愕暮么ΑN以诒敬蜗钅恐谢鄣牧瞬簧俚闹屑洳愣韵蟆?BR>3.3     PFC的继承结构
由于PFC的分层的特点,使得PFC对象之间的继承关系也带有一些特点。图1中描述的继承关系只是一个大概的样式,PFC中的对象的真真继承关系并非如此。下面图2描述的则是PFC真真的继承关系:

 
4 PFC中跨平台的设计
PFC非常注重跨平台的设计。在讲述多态时曾提到PFC利用多态实现跨平台的文件管理。与文件管理类似,PFC的平台服务(提供了一些关于操作系统调用的API)也是一个跨平台的服务。下面将着重讲述一下PFC如何实现跨平台的文件管理。PFC首先定义了一个抽象基类n_cst_filesrv 
。该基类中定义了所有PFC提供的文件管理函数,但是这些函数都没有任何实质性的代码。源代码如下:
Public Function String of_GetCurrentDirectory ()
//      Function could found in descendent
Return ""
…其他的省略…
然后PFC定义一个n_cst_filesrv类的一个子类n_cst_filesrvwin32。类n_cst_filesrvwin32的作用就是在WIN32操作系统下实现of_GetCurrentDirectory()函数以及其他函数。同样PFC为MAC操作系统定义了n_cst_filesrvMAC类,类n_cst_filesrvMAC的作用就是在MAC操作系统下实现of_Get
CurrentDirectory()函数以及其他函数。为了方便说明我只据两个操作系统的例子,至于跨多个操作系统与跨两个操作系统没有任何本质区别。
        PFC程序员在使用PFC的文件服务时是这样使用的:
1. 定义n_cst_filesrv类型的变量。
n_cst_filesrv   lnv_filesrv
2. 调用全局函数f_SetFilesrv(n_cst_filesrv anv_filesrv, Boolean ab_switch)开启文件服务
f_SetFilesrv(lnv_filesrv,True)
3. 这样PFC的文件服务便会根据不同的操作系统调用相应的文件API。对PFC的程序员来讲编写跨平台的软件的真是非常方便。
其实真真的PFC跨平台的代码就在函数f_SetFilesrv中,源代码(稍做修改):
Function f_SetFilesrv(n_cst_filesrv anv_filesrv, Boolean ab_switch)
// Argument and error checking.
If IsNull(ab_switch) Then Return -1
If IsNull(gnv_app) Or Not IsValid(gnv_app) Then Return -1

if ab_switch then
        if IsNull (anv_filesrv) or not IsValid (anv_filesrv) then
                // create file service object based on platform
        Choose Case gnv_app.ienv_object.ostype
                Case macintosh!
                        anv_filesrv = create n_cst_filesrvmac
                Case windows!, windowsnt!
                                anv_filesrv = create n_cst_filesrvwin32
        end choose
                return 1
        end if
else
        if IsValid (anv_filesrv) then
                destroy anv_filesrv
                Return 1
        end if
end if

Return 0

请注意粗体字部分,这就是PFC利用多态实现跨平台的设计。

5 总结
以上也只是对PFC作了一番介绍。并没有讲述如何着手PFC开发。对PFC开发应用程序感兴趣的朋友可以参考我们站点中的其他文章。

[email protected]

--
※ 来源:.网易 BBS bbs.netease.com.[FROM: 202.96.191.124]

[关闭][返回]