CN1199474A - 产生计算机控制服务的方法 - Google Patents
产生计算机控制服务的方法 Download PDFInfo
- Publication number
- CN1199474A CN1199474A CN96197576A CN96197576A CN1199474A CN 1199474 A CN1199474 A CN 1199474A CN 96197576 A CN96197576 A CN 96197576A CN 96197576 A CN96197576 A CN 96197576A CN 1199474 A CN1199474 A CN 1199474A
- Authority
- CN
- China
- Prior art keywords
- code
- group
- class
- application
- application program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/30—Creation or generation of source code
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
Abstract
本发明涉及一种产生特定应用计算机控制服务的方法。一个特定应用的程序代码可以自动生成并形成提供所述服务的特定应用计算机程序。为了比以前更容易地实现改动,计算机程序分为三组。第一组(A)只包括使应用程序保持相同而不管该应用程序是什么的程序代码而第二组和第三组根据所述生成过程通过如下方式得到生成的代码,即第二组(B)只包括根据生成过程所产生的代码而第三组(C)则包括由所述生成过程产生的而在产生之后要被设计者修改的代码。该生成装置被通知所生成的代码是为第二组还是第三组生成的。
Description
本发明一般涉及类似于网络管理系统的根据软件提供服务,从而让终端用户使用的系统,如控制网络设备。更准确地说,本发明涉及一种根据所附权利要求1的引用部分来为这种系统用户产生特定应用的计算机控制服务的方法。本发明还涉及一种根据所附权利要求8来产生特定应用的计算机控制服务的系统。
市场上存在几种用来产生代码的系统。这些代码产生器通常只能用于编制程序的初期,而不能用来在已完成的应用程序中进行快速而且没有任何错误的重大修改。换句话说,已有的代码产生器不能为反复的改动和添加提供充分的支持。
有几个应用程序也是如此,它们应该可以进行尽可能快速而准确的改动。这种应用程序的例子之一是这样一个网络管理系统,它所管理的网络包括不同类型的若干装置,并且由于操作员从几家不同的厂商处获得设备和进行对已有设备或软件的更新,从而引起网络的经常改变。特别是由于电讯领域中新的自由竞争的出现,经常为用户提供新设备的需求已经产生,从而进一步增加了进行灵活改动的重要性。
已有的系统都不是很适合上面所述类型的应用程序。这是由于系统为设计者提供了许多详细的然而也是次要的信息,从中难以找到实质的部分(改动所对应的地方)。设计者应该能够控制(理解)这些信息。所以作出这些改动的人必须是编程领域的专家。
在这样一个系统中,同样存在设计者对不应改动的地方进行改动的危险。
本发明的目的是通过提供产生特定应用服务的一种新的安排来克服上述的缺陷。这一目的是由根据所附权利要求1中的特征部分所描述的本发明的方法来完成的。
本发明旨在创建一个环境,该环境中的改动对设计者来说是尽可能简单、清楚的。通过将所要产生的代码(a)分别放置在改动时设计者可能忽略(包括缺省功能)的部分(从而它是不可见的)和(b)对设计者可见并且在改动的每一状态中都需要由设计者作出改动的部分中,这一目的就可能实现了。这一分离基于特定模板文件的使用以及通过根据应用程序的描述文件的改变作出相应的改变、重新产生应用程序的框架、然后,如果需要的话,完成应由设计者手工完成的改动来完成所有的改动。与该产生过程有关的是,代码发生器根据应用程序的描述文件来修改文件模板。
由于根据本发明的安排,改动可尽可能快速而且准确无误地完成。服务中所传送给用户的产品就可以快速无误地完成。根据本发明,甚至这些改动可以由单位的一个雇员,如网络的操作员,使用设备来完成。这种情况下改动将是尽可能的简单。
上述的优点基于这样一个事实,那就是该系统增加了设计者工作的抽象等级;设计者只要关注应用程序的实质的部分(需要改动的部分)并且次要的内容(复杂的程序代码)是不可见的。因此设计者查找需要进行改动的地方也变得更容易了。同时,也减少了设计者意外地修改了不需改动部分的可能性。下面,将参照图中的例子对本发明及其最佳实施例进行非常详细的说明,其中:
图1示出了依照本发明的一个系统,
图2示出了由依照本发明的系统对一个已完成应用程序的产生过程,
图3a显示了一个示例程序的主窗口,
图3b显示了一个示例程序的一个子窗口,
图4说明了一个示例程序的一个对象模型,
图5显示了提供给代码发生器的一个应用程序的描述,
图6显示了所产生的应用程序的框架,
图7显示了一个应用程序改动后的主窗口,
图8说明了应对对象模型作出的改动,
图9示出了对应用程序做出的另一个改动,
图1示出了依照本发明的网络管理系统。一个基于对象、基于MVC++应用程序结构(以及C++编程语言的使用)的程序在这里用作例子。通常规定该方法要求使用一种简单应用程序结构,如MVC++结构。既然该结构将在后面用作例子,帮助理解后面描述的这些特征将在这里一并做出简要描述。
MVC++结构从已有的MVC(模型、视图、控制)结构修改而来,依照该结构应用程序可以分为三部分:模型、视图以及控制。模型部分是所有描述应用程序所涉及的真实世界的对象的集合。视图部分是用户可见到的应用程序的最外层。这一部分决定了用户在监视器上所能见到的。视图部分又分为可视化部分和功能部分。可视部分管理显示的布局而功能部分则控制涉及显示的功能。视图部分由控制器部分创建,对于每一个视图对象都存在一个控制器对象。控制器部分控制模型部分与视图部分之间的合作并形成特定应用逻辑。一个控制器对象可以与多个模型对象相连而同一个模型对象可以与若干个控制器对象相连。在依照MVC++结构的应用程序中,模型部分的对象并不与视图部分的对象直接相连,但一个视图对象只能通过一个控制对象与模型对象相连。因此,视图对象负责解释用户从工作站给出的命令并向控制器指出正在讨论的函数。控制器部分包括每一个命令如何处理的知识以使控制器部分请求模型部分执行相应于该命令的方法。模型部分将此方法的结果通知控制器部分,控制器部分依次请求视图部分向用户显示结果。依照MVC++结构的每一应用程序都有一个主控制器类,即一个控制其余控制器类以及整个应用程序的主控制器。同样,一个主控制器创建并控制一个主视图对象。主视图对象构成应用程序的主窗口。另外有其它独立的视图和控制器类对应于其它每一窗口(对话框)。
在A.Jaaksi发表于Software Practice & Experience,第25卷,1995年三月第三期,271页到289页的ImplementingInteractive Applications in C++一文中提供了关于MVC++结构更详细的举例描述。
依照本发明的网络管理系统可以是如图1所示的那样的例子。操作维护中心MS的网络操作员使用连于一独立工作站网络WSN的网络管理工作站WS,举例来说WSN可以是以太网。管理系统可以典型地分成工作站网络上的若干计算机,其中的一些计算机包括一个包括网络控制所需数据的数据库DB。管理系统通过一标准定义的Q3接口连接到一例如可能包括SDH设备21和PDH设备23的传输网络DCN。SDH设备之间的控制通路在实际中由以STM-N信号(N=1、4、16)开头的字节组成,以使SDH设备之间的控制信号与有效载荷信号一起(也就是在相同的物理网络中)传输。常规的PDH设备23依次请求安排,此安排对于每一厂商都不同的,因此它们必须通过一独立的协调设备22来与管理系统连接。
依照本发明的系统包括一代码发生器,能够自动地产生用于系统中的特定应用计算机程序10的一部分,以下称之为应用程序框架。这就是当操作员在其工作站上使用网络设备管理服务时所运行的程序框架。所完成的应用程序存储在服务器或工作站网络中一个独立的工作站中(或者两者都存储)。
一个高抽象级的应用程序的描述就由该发生器生成了,该描述形成了此发生器的第一输入组。该描述用索引数字12标出。该描述可以直接手工地写入到发生器可以理解的文本中并且以后可以以文件的形式存储到系统存储器中。该描述还可以由一已知的CASE(计算机辅助软件工程)设备来产生,在其中应用程序以图形描述的形式显示。这样,一个特殊的转换程序将由CASE设备存储在文件中的描述转换成发生器可以理解的形式。
发生器的另一个输入组包括作为产生应用程序框架的模型的模板文件13。代码发生器11通过根据设计者所写的描述12重新产生模板文件的代码来产生应用程序的框架。模板文件分为两部分:13a和13b,应用程序框架的一些部分将根据每一输入组来产生。模板文件为固定的文件,当应用程序发生改动时不必对它进行修改。因此,模板文件可以看成是代码发生器11的内部执行的一部分。
代码发生器根据上面所描述的两个输入组形成图1右边所示的特定应用计算机程序10(也就是应用程序框架)自己的部分(图1中用术语“生成的代码”所标出的)。依照本发明,应用程序框架可以分为三个不同的组或是层A到C,其中组A的属性继承给组B而组B的属性继承给组C。在图1中这种继承关系用一个向上的三角形箭头来表示。
第一组A(最低的层;虽然它在图中显示在最上方,对于设计者来说它是最低的层)只包括一不管应用程序如何均保持同样的程序代码。因此这是一个不必特殊创建的组,它对于各个应用程序来说应该是一样的。该组包括使应用程序保持一致的功能。即使应用程序发生了某些改变甚至应用程序完全改变了,这个组仍然将保持不变。在本例中,第一组包括MVC++的一些基类(对所有应用程序都是一样的)。
第二组B(中间层)和第三组C(顶层)中都包括代码发生器11所产生的程序代码。它们的分界是这样实现的:第二层只包括代码发生器产生的程序代码而第三层则分别包括代码发生器产生和设计者手工加入的代码。在产生过程中,第三层包括了设计者要对其做出如增加之类修改的代码。产生了代码之后,设计者对第三层作出必要的改动。因此,第三层最终分为两部分:C1部分只包括代码发生器所产生的代码而C2部分包括设计者手工加入的代码。
第二组B包括了包括特定应用的缺省功能的类。这些类根据下面所描述的方式由代码发生器来产生,设计者在任何时候都不必对其作出改动。缺省的功能依赖于应用程序的结构以及所连接的设备,它可以通过保留设计者添加到应用程序(也就是C组)的属性来进行改变。第二层是根据相应的模板文件13a和描述12来产生的。第二组的类存储于系统中它们自己的不包括任何手工加入的代码的文件之中。以下称这些类为缺省类。
第三组C包括了一些基干类,在这些类中包括了设计者为了应用程序的需要而手工写下的增加的功能。由于编程语言的技术特性,当应用程序框架重新产生时,这些基干类必须作出相应改动。出于这种原因,在含有这些基干类的文件中需要重新产生的代码(C1部分)必须与其余的代码(C2部分)分开。在这种分开中要使用到为了这一目的而特别保留的字符串,发生器根据该字符串找到改动时文件中需要重新产生的部分。
需要重新产生的代码是否是缺省类(也就是B组)或基干类(也就是C组)的一部分的信息将由模板文件提供给发生器。由于这种目的,模板文件部分13特定地包括对应于B组的一部分,即是包括缺省功能的类的模板文件13a,以及对应于C组的一部分,即是基干类的模板文件13b。缺省类的模板文件是可以根据描述文件12自动实现的功能的模型。根据基干类的模板文件13b可以产生由设计者用不能自动产生的代码来进行补充的框架。附录1使用主控器的缺省类和基干类的模板文件作为例子。
当第一次创建应用程序的框架时,代码发生器将所需的代码写入B组以及C组。当最后的应用程序发生改动时,发生器会将B组及C组进行改写。发生器会根据改变了的输入数据将B组全部改写,但必须首先读出C组(基干类)的内容来让发生器知道设计者手工加入的部分从而可以不必改动它们。
当要产生的代码包括发生器的代码时,将给要产生的代码补充一个标志符,标志符用于连接产生的代码以及手工加入的代码。下面将对此作出更详细的说明。
代码发生器将读模板文件。当发生器从模板文件中找到为此而保留的字符串时,会用它所产生的代码部分将此字符串替换。代码发生器根据自己的产生规则和应用程序的描述形成这些代码部分。产生的规则依赖于所用到的应用程序结构,但它们是独立于一个单个的应用程序的。(产生的规则为此形成一种提供结果的函数,该结果依赖于使用的参数,也就是应用程序的描述12。)
从上面所说的可以明显看出,要产生的应用程序的框架包括如下特征:
1.手工写下的代码与自动产生的代码通过将应用程序分为缺省类和基干类而彼此分开。
2.手工写下的代码与自动产生的代码在基干类中按照为此保留的字符串来彼此分开。
3.当要产生的代码中包括直接手工写入的代码时,手工写下的代码与自动产生的代码用特殊的标志符来连接。
图2示出了依照本发明的方法对一完成的应用程序进行生成的一个例子。设计者首先用一CASE设备创建一个对象图表。此描述可以手工地写入或通过一转换程序来转换成为代码发生器可以理解的形式。代码发生器然后产生由此例中的C++语言文件(控制器类和功能视图类)以及用户界面工具格式(如X-DesignerTM,Imperial Software Limited的注册商标)文件(可视化视图类)组成的应用程序框架。设计者根据人工编码和(上述的)用户界面的用户界面工具来为应用程序补充功能。该程序然后就可以通过编译和连接成可以运行的程序,例如一个通过传输网络从工作站WS控制网络和网络元件(物理设备)的网络管理系统。上述开发工具也可以位于网络管理系统的工作站中从而使操作人员可以自己完成网络管理系统所要求的改动。
下面,将通过一个假想的应用程序即涉及网络管理的无线网基站参数来举例说明应用程序的实现。该应用程序可以显示并设置涉及基站无线网的参数。
图3a显示了图1的网络管理程序中控制中心的工作站WS上显示的应用程序的主窗口。本应用程序从网络管理系统的用户主界面开始运行,然后此应用程序的主窗口就出现在显示屏上。在此应用程序的主窗口上可以读到并设置涉及基站传输功率的数据。该应用程序还包括图3b中所示的一个子窗口。可以从该子窗口中选取所要处理的基站。
设计者首先用CASE设备画出一个对象模型来描述此应用程序。所获得模型如图4所示,采用普遍应用的OMT符号,该符号在James Rumbaugh等人的Object Oriented Modelling andDesign(Prentice-Hall,New Jersey,USA,1991,chapter 3)中作为例子做出了描述。(需要指出的是,图4左方显示的不与任何类相连的框架4a提供了关于下面将要做出更详细说明的整个应用程序的附加信息。根据视图的类型定义4B和4C,继承给视图类的用户界面组件就被选中。)
此图形的描述可以手工地写入或通过一转换程序来转换成为代码发生器可以理解的形式。所获得的代码如图5所示。为了理解该描述文件,附录2说明了所用到的描述语言的语法。(图5依照附加说明的表达式说明了与图4用OMT符号所说明的相似的分层结构)。
然后就通过应用程序发生器11生成了应用程序框架10。图5所列出的内容也被生成到图6所示的应用程序框架里。图6说明了上面所描述的所产生的代码的分组形式,属于B组(也就是缺省类)的类用细框表示,属于C组(也就是基干类)的类用粗框表示。编程者因此可以从应用程序框架中看到C++源代码和各个类(视图、控制器以及抽象对(abstract partner))是用粗框表示的。设计者然后就可以在基干类中添加必要的一些代码来实现应用程序的功能。(抽象对是描述一对象对调用它的对象的需求的一个类。由于抽象对的概念不涉及实际的发明主旨,所以不再作相关的详细说明。关于抽象对的更透彻的说明在上述的MVC++的文章中给出。)
设计者通过用用户界面工具(如X-DesignerTM)编辑可视化视图类(图中用粗虚线表示的类)来实现用户界面的布局。图6中线示的其它类对设计者来说是不可见的。(图中所示的用户界面组件继承给可视化视图类可以根据在描述文件12中的视图的类型定义来选中。)
对图4和图6进行比较后,可以明显看出本发明的安排如何增加编程工作的抽象程度。基于图4的抽象层次的描述可以转换(有些复杂)为图6的类的层次。对与图6中的类来说,设计者只需要注意粗框中描述的类,然而设计者还可以看到更高抽象层次的生成的代码。
所生成的类的命名规则如下表所示。在该表中字符串"abc"为描述文件中给出的应用程序的一个三个字母的前缀(如图5所示)。
AbcDefaultProgram_c | 应用程序的缺省主程序类 |
abcProgram_c | 应用程序的基干主程序类 |
abcDefaultMainController_c | 应用程序的缺省主控制器类 |
abcMainController_c | 应用程序的基干主控制器类 |
abcDefaultMainView_c | 应用程序的缺省主视图类 |
abcMainView_c | 应用程序的基干主视图类 |
abcDefaultMainViewAbsVP_c | 应用程序的缺省主视图的抽象对类 |
abcMainViewAbsVP_c | 应用程序的基干主视图的抽象对类 |
abcDefault<Sub>Controller_c | 缺省子控制器类,其中<Sub>为描述文件给出的子控制器的名称 |
abc<Sub>Controller_c | 基干子控制器类,其中<Sub>为描述文件给出的子控制器名称 |
abcDefault<Sub>ControllerAbs_c | 缺省子控制器的抽象对类,其中<Sub>为描述文件给出的子控制器名称 |
abc<Sub>ControllerAbs_c | 基干子控制器的抽象对类,其中<Sub>为描述文件给出的子控制器名称 |
abcDefault<Sub>View_c | 缺省子视图类,其中<Sub>为描述文件给出的子视图名称 |
abc<Sub>View_c | 基干子视图类,其中<Sub>为描述文件给出的子视图名称 |
abcDefault<Sub>ViewAbs_c | 缺省子视图的抽象对类,其中<Sub>为描述文件给出的子视图名称 |
abc<Sub>ViewAbs_c | 基干子视图的抽象对类,其中<Sub>为描述文件给出的子视图名称 |
以下从A到E各条将根据模板文件以及描述文件中的数据生成缺省主控制器类(B组的abcDefaultMainController_c类)的声明的过程作为例子加以说明。各个框中指出了发生改动的文件的部分。框中有一行有一个箭头,箭头前面的部分说明了改动前的情况,而后面的部分则说明了改动后的情况。
A.通过将模板文件中类名中的字符串"fft"替换为描述文件中给出的应用程序前缀来获得该类的名称,如此例中为"abc":
class fftDefaultMainController_c=>class abcDefaultMainController |
B.通过将字符串"fftMainViewAbsVP_c"中的"fft"替换为"abc"来获得继承给缺省类的主视图的抽象对的类名。继承给主控制器的子控制器的抽象对的类名根据命名规则生成。它们形成一个字符串,其中抽象对类名用逗号和换行符隔开。然后用所得到的字符串替换掉模板文件中的字符串"INHERIT_ABS":
C.在模板文件public部分的方法的声明中,用"abc"替换
:public mvcMainControllerBase_c,public kuiConfirmationDialogControllerAbsCP_c,public fftMainViewAbsVP_cINHERIT_ABS=>:public mvcMainControllerBase_c,public kuiConfirmationDialogControllerAbsCP_c,public abcMainViewAbsVP_c,public abcSelectionControllerAbsCP_c |
{public:fftDefaultMainController_c(fftDefaultProgram_c*fftPrg);virtual~fftDefaultMainController_c();virtual errAtom_c*MVCCreate();∥从abs.view partner中继承virtual void FftWMCloseWanted();∥确认控制器抽象对∥方法virtual void KuiActionConfirmed();virtual void KuiActionNotConfirmed();=>{public:abcDefaultMainController_c(abcDefaultProgram_c*abcPrg); |
virtual~abcDefaultMainController_c();virtual errAtom_c*MVCCreate();∥从abs.view partner中继承virtual void AbcWMCloseWanted();∥确认控制器抽象对∥方法virtual void KuiActionConfirmed();virtual void KuiActionNotConfirmed(); |
D.在模板文件的protected部分的声明中用"abc"来替换字符串"fft",并且用根据命名规则所形成的主视图名替换MAINVIEW_C。而字符串SUB_CONT_DECLARATIONS则用通过如下方式得到的字符串来替换:
对定义在描述文件中的子控制器重复执行以下各步:
1.根据模板文件中子控制器定义的名称和命名规则形成一个字符串作为子控制器类的名称。
2.该字符串用一空格和星号补齐。
3.如果已经由实例定义了子控制器的一个实例名,就为它加上该字符串,否则用子控制器的定义所给出的名称加上该字符串。
4.该字符串用分号和换行符补齐。
从而将得到的字符串合并完毕。
protected:mvcMainViewBase_c*MVCGetMainView();MAINVIEW_C *view;fftDefaultProgram_c *fftProgram;∥对话框确认 |
kuiConfirmationDialogControllerC_c*confirmationDialog;SUB_CONT_DECLARATIONS=>protected:mvcMainViewBase_c*MVCGetMainView();abcMainView_c *view;abcDefaultProgram_c *abcProgram;∥对话框确认kuiConfirmationDialogControllerC_c*confirmationDialog;abcSelectionController_c*selection; |
E.通过用描述文件给出的"abc"来替换字符串"fft"从而得到private部分:
说明程序所生成的文件如下表所示:
private:fftDefaultMainController_c(const fftDefaultMainController_c&);fftDefaultMainController_c operator=(const fftDefaultMainController_c &)const;};=>private:abcDefaultMainController_c(const abcDefaultMainController_c&);abcDefaultMainController_c operator=(const abcDefaultMainController_c&)const;}; |
如本图以及图4所示,应用程序描述中的一个控制器类被转换成为两个类:基干类(属于C组)和缺省类(属于B组)。视图类则转换成为三个类,分别对应于视图的功能部分、缺省类以及基干类,而对于视图的可视化部分则只有一个基干类(因为这部分可以在高于源程序代码的层次上由用户界面工具进行处理。)
下面,给出了主控制器的缺省类和基干类的例子。首先给出的是缺省类的头文件和实现文件,然后给出的是基干类的头文件和实现文件。头文件给出了的是可见的对象的接口,也就是其它对象可以调用的函数。而实现文件包括的是当函数被调用时所执行的实际代码。
缺省主控制器类的头文件(在C++语言中)"abccontmadfmx.h"如下(当附录中所说明的模板文件已经按照上述的方式进行了修改之后):
缺省主控制器类的实现文件"abccontmadfmx.cc"说明如下:
/**************************************************************************** $RCSfile$***************************************************************************** $Author$**** Copyright(c)Nokia Telecommunications 1991-1995*************************************************************************** 应用程序框架产生的文件** 这是缺省主控制器类的头文件** 不能修改本文件!!** RUNGOXMX版本:@(#) 版本 1.9(t8mcl)***************************************************************************** $Log$***********************************************************************/ |
#ifndef ABCDEFAULTMAINTCONTROLLER_H#define ABCDEFAULTMAINTCONTROLLER_H/*模式识别************************************************/static char abccontmadfmx_rcsid[]="$Id$";#include<stdio.h>#include<stdlib.h>#include<weratomx.h> ∥错误#include<kuicocfmdlgmx.h> ∥控制器确认对话框#include"abcviewmainmx.h" ∥主视图及抽象视图对∥子控制器的头文件#include"abccoselectmx.h"class abcDefaultProgram_c;class abcDefaultMainController_c:public mvcMainControllerBase_c,public kuiConfirmationDialogControllerAbsCP_c,public abcMainViewAbsVP_c,public abcSelectionControllerAbsCP_c{public:abcDefaultMainController_c(abcDefaultProgram_c*abcPrg);virtual~abcDefaultMainController_c();virtual errAtom_c*MVCCreate();∥从abs.view对中继承virtual void AbcWMCloseWanted();∥确认控制器抽象对∥方法virtual void KuiActionConfirmed();virtual void KuiActionNotConfirmed();protected:mvcMainViewBase_c*MVCGetMainView(); |
abcMainView_c *view;abcDefaultProgram_c *abcProgram;∥确认对话框kuiConfirmationDialogControllerC_c*confirmationDialog;abcSelectionController_c*selection;private:abcDefaultMainController_c(const abcDefaultMainController_c&);abcDefaultMainController_c operator=(const abcDefaultMainController_c&)const;};#endif/*ABCDEFAULTMAINCONTROLLER_H*/ |
/*************************************************************************** $RCSfile$***************************************************************************** $Author$**** Copyright(c)Nokia Telecommunications 1991-1995*************************************************************************** Application Framework generated file** This is a implementation file for default main controller class.** You should not edit this file!!** RUNGOXMX version:@(#)Version 1.9(t8mcl)***************************************************************************** $Log$ |
**********************************************************************/∥模式识别************************************************static char rcsid[]="$Id$";#include"abccontmadfmx.h"∥该主控制器的头文件#include"abcmainprogmx.h"∥程序模块头文件∥WM关闭确认对话框时的消息文本const char*closeText="This will close the application.nDo you want to proceed?";/************************************************************************<PUBLIC>函数:abcDefaultMainController_c∷abcDefaultMainController_c()*************************************************************************构造函数************************************************************************/abcDefaultMainController_c∷abcDefaultMainController_c(abcDefaultProgram_c*abcPrg){abcProgram=abcPrg;view=0;confirmationDialog=0;selection=0;} |
/************************************************************************<PUBLIC>函数:abcDefaultMainController_c∷~abcDefaultMainController_c()*************************************************************************Destructor************************************************************************/abcDefaultMainController_c∷~abcDefaultMainController_c(){view->MVCHideFM();delete view;view=0;delete confirmationDialog;delete selection;selection=0;}/************************************************************************<PRIVATE> 函数: errAtom_c*abcDefaultMainController_c∷MVCCreate()*************************************************************************创建控制器************************************************************************/errAtom_c*abcDefaultMainController_c∷MVCCreate(){errAtom_c*err=0;∥例示主窗口 |
∥view=new abcMainView_c(this);∥初始化Motif事件(只有主视图应该这样做)∥err=view->MVCInitializeWindowingSystem();if(err)return(err);∥Create the main view∥err=view->MVCCreate();if(err)return(err);∥例示确认对话框∥confirmationDialog=new kuiConfirmationDialogControllerC_c(this);err=confirmationDialog->MVCCreate(view->MVCGetParentCandidateQM());if(err)return err;∥例示并创建子控制器∥selection=new abcSelectionController_c(this);err=selection->MVCCreate(view->MVCGetParentCandidateQM());if(err)return(err);return OK;}/************************************************************************<PROTECTED> 函数: mvcViewBase_c*abcDefaultMainController_c∷MVCGetMainView()************************************************************************* 返回到主视图************************************************************************/mvcMainViewBase_c*abcDefaultMainController_c∷MVCGetMainView(){ |
return(view);}/************************************************************************<PUBLIC> 函数: void abcDefaultMainController_c∷AbcWMCloseWanted()************************************************************************* 关闭应用程序************************************************************************/void abcDefaultMainController_c∷AbcWMCloseWanted(){if(view->MVCIsIconifiedQM()){view->MVCUnIconifyFM();}confirmationDialog->AskConfirmation((char*)closeText);}/************************************************************************<PUBLIC> 函数: void abcDefaultMainController_c∷KuiActionConfirmed()************************************************************************* 关闭应用程序************************************************************************/void abcDefaultMainController_c∷KuiActionConfirmed(){abcProgram->MVCShutdown();}/*********************************************************************** |
*<PUBLIC> 函数: voidabcDefaultMainController_c∷KuiActionNotConfirmed()************************************************************************* 关闭应用程序************************************************************************/void abcDefaultMainController_c∷KuiActionNotConfirmed(){∥不需任何操作} |
下面将对一个主控制器基干类进行描述。该基干类的头文件“abccontmainmx.h”如下(对应的模板文件在附录1中给出)。
主控制器基干类的实现文件"abccontmainmx.cc"如下:
/*************************************************************************** $RCSfile$**************************************************************************** $Author$**** Copyright(c)Nokia Telecommunications 1991-1995*************************************************************************** 产生的应用程序框架文件** 这是主控制器基干类的头文件** 在此完成所要求的功能** RUNGOXMX版本:@(#) 版本 1.9(t8mcl)***************************************************************************** $Log$***********************************************************************/ |
#ifndef ABCMAINCONTROLLER_H#define ABCMAINCONTROLLER_H/*MODULE IDENTIFICATION************************************************/static char abccontmainmx_rcsid[]="$Id$";#include"abccontmadfmx.h"class abcMainController_c:public abcDefaultMainController_c{public:abcMainController_c(abcDefaultProgram_c*abcPrg);~abcMainController_c();virtual errAtom c*MVCCreate();∥AF_TOKEN_START#public_methods#∥AFTool生成的抽象对方法∥不要在AF-TOKENS中间添加你自己的代码∥AF_TOKEN_END#public_methods#∥AF_TOKEN_START#abs_partner_methods#∥AFTool生成的抽象对方法∥不要在AF-TOKENS中间添加你自己的代码void AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower);void AbcSelectButtonActivated();void BuiExitWanted(); ∥inherited from a gui componentvoid BuiPrintSetupWanted(); ∥inherited from a gui componentvoid BuiPrintWanted(); ∥inherited from a gui componentvoid AbcControllerSelected(intID_tidentifier);∥AF_TOKEN_END#abs_partner_methods#protected: |
private:abcMainController_c(const abcMainController_c&);abcMainController_c operator=(const abcMainController_c&)const;};#endif/*ABCMAINCONTROLLER_H*/ |
/*************************************************************************** $RCSfile$***************************************************************************** $Author$**** Copyright(c)Nokia Telecommunications 1991-1995*************************************************************************** 生成的应用程序框架文件** 这是主控制器基干类的实现文件** 在此文件中完成所要求的功能** RUNGOXMX版本:@(#) 版本 1.9(t8mcl)***************************************************************************** $Log$***********************************************************************/∥模式识别************************************************static char rcsid[]="$Id$"; |
#include<wmtracmx.h>∥跟踪对象extem wmtTrace_c*trace;#include"abccontmainmx.h"∥该主控制器的头文件#include"abcmainprdfmx.h"∥该程序模型的头文件/************************************************************************ <PUBLIC> 函数: abcMainController_c∷abcMainController_c()************************************************************************* 构造函数************************************************************************/abcMainController_c∷abcMainController_c(abcDefaultProgram_c*abcPrg):abcDefaultMainController_c(abcPrg){}/************************************************************************ <PUBLIC> 函数: abcMainController_c∷~abcMainController_c()************************************************************************* 析构函数************************************************************************/abcMainController_c∷~abcMainController_c(){ |
}/************************************************************************ <PUBLIC> 函数: abcMainController_c∷MVCCreate()************************************************************************* 创建控制器************************************************************************/errAtom_c*abcMainController_c∷MVCCreate(){errAtom_c*err=abcDefaultMainController_c∷MVCCreate();∥在此添加构造控制器所需要的动作return err;}/************************************************************************ <PUBLIC> 函数: void abcMainController_c∷AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower)************************************************************************ 抽象对方法的实现*************************************************************************/∥AF_TOKEN#abc2#-不要删除此标记void abcMainController_c∷AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower){ |
AF_TRACE("void abcMainController_c∷AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower)");∥在此添加你自己的代码}/************************************************************************ <PUBLIC> 函数: void abcMainController_c∷AbcSelectButtonActivated()************************************************************************ 抽象对方法的实现*************************************************************************/∥AF_TOKEN#abc3#-不要删除此标记void abcMainController_c∷AbcSelectButtonActivated(){AF_TRACE("void abcMainController_c∷AbcSelectButtonActivated()");∥在此添加你自己的代码}/************************************************************************ <PUBLIC> 函数: void abcMainController_c∷BuiExitWanted()************************************************************************抽象对方法的实现*************************************************************************/∥AF_TOKEN#buil2#-不要删除此标记void abcMainController_c∷BuiExitWanted(){AF_TRACE("void abcMainController_c∷BuiExitWanted()");∥在此添加你自己的代码 |
}/************************************************************************<PUBLIC> 函数: void abcMainController_c∷BuiPrintSetup Wanted()************************************************************************抽象对方法的实现*************************************************************************/∥AF_TOKEN#buil3#-不要删除此标记void abcMainController_c∷BuiPrintSetup Wanted(){AF_TRACE("void abcMainController_c∷BuiPrintSetup Wanted()");∥在此添加你自己的代码}/************************************************************************ <PUBLIC> 函数: void abcMainController_c∷BuiPrint Wanted()************************************************************************抽象对方法的实现*************************************************************************/∥AF_TOKEN#buil4#-不要删除此标记void abcMainController_c∷BuiPrint Wanted(){AF_TRACE("void abcMainController_c∷BuiPrint Wanted()");∥在此添加你自己的代码}/*********************************************************************** |
*<PUBLIC> 函数: void abcMainController_c∷AbcControllerSelected(intID_tidentifier)*************************************************************************抽象对方法的实现*************************************************************************/∥AF_TOKEN#abc7#-不要删除此标记void abcMainController_c∷AbcControllerSelected(intID_tidentifier){AF_TRACE("void abcMainController_c∷AbcControllerSelected(intID_tidentifier)″);∥在此添加你自己的代码} |
主控制器基干类的实现文件"abccontmainmx.cc"如下:
设计者在基干类中添加一定数目的代码来实现应用程序所要求的功能。用户界面由前面所述的X-DesignerTM工具使用所生成的具有X-DesignerTM格式的可视化视图类描述进行补充。
模型部分中的类,BaseStation_c和BaseStationGroup_c(如图4),已经在模型部分的类库中实现,所以这里不必根据本发明再将它们实现。
从上面所述可以明显看出,代码生成器通过根据应用程序的描述文件提供的数据对相应的模板文件进行修改来自动创建缺省类和基干类。
前面已经对应用程序框架是如何生成的进行了详细的说明。本例进而说明应用程序第一次创建时的情况。然后对应用程序框架可能作出了改动的情况进行检查。本例涉及操作员通过网络管理系统请求向基站控制器添加一个新属性,如所谓优先服务时的情况。在此操作员的网络中,客户被分成两类:即拥有金卡的和拥有银卡的。当传输拥挤所有的通路都被占用,而此时又有一个金卡用户发出了呼叫请求时,则将一个银卡用户从通路中删除。这项服务要求一个说明是否使用优先服务的新的参数。
图7示出了用户界面中的变化,如图3a和图7所示,该窗口将提供一个新的二值(yes和no)“优先级”参数。
图8示出了前面在图4中说明过的对象流图中的变化。图8只给出了该流图中发生了改动的部分。该流图中提供了一个新的"BaseStationController_c"类,该类的属性为"priorityMode",方法为"SetPriorityMode"。
同样应注意到更新基站中的无线网络参数需要较长的时间。所以该应用程序必须提供一个向用户指出操作正在进行的所谓的正在工作对话框。图9示出了一个正在工作对话框窗口。
首先将对优先级服务的增加进行说明。为了实现这一改动(为发生改变的方法"ShowParametersFM"和"AbcUpdateButtonActivated"添加新的参数),需要在应用程序的描述文件12的方法声明中添加一个新的boolean_t型参数"priorityMode"。下面的表格中给出了前面所说明的描述文件的一部分。该表格中为添加优先级服务而对在描述文件中添加的部分用黑体字标出。
#...(public_method"#abc1#void ShowParametersFM(name_t name,intID_t identifier,float maxPower,float minPower,boolean_t priorityMode)" |
)(abs_partner""(abs_partner_method"#abc2#void∷AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPowerboolean_t priorityMode)")#... |
标志符#abc1#和#abc2#指出即使此声明发生改变,逻辑上仍然使用同样的方法(即为该方法编写的执行保持不变)。
对描述文件做出了所需的修改后,代码由代码生成器重新生成。代码生成器接着更新主视图基干类和主控制器类的头文件中所需要重新生成的部分。所需要重新生成的部分用标记AF_TOKEN_END和AF_TOKEN_START标出,从而可以不必处理所改动的文件的其它部分。(AF_TOKEN_START是要重新生成的部分的起始标记而AF_TOKEN_END是结束标记。)
改动之前,主视图的基干类与抽象对类的共享头文件是这样的:
改动之后,情况变成如下所示(所添加的部分用黑体字标出):
class abcMainViewAbsVP_c:public abcDefaultMainViewAbsVP_c{public:∥AF_TOKEN_START#abs_partner_methods#∥AFTool生成的抽象对方法∥不要在AF-TOKENS中间添加你自己的代码virtual void AbcUpdateButtonActivated(name_t name,intID_tidentifier,floatmaxPower,minPower)=0;virtual void AbcSelectButtonActivated()=0;∥AF_TOKEN_END#abs_partner_methods#}; |
class abcMainView_c:public abcDefaultMain View_c{public:∥...∥AF_TOKEN_START#public_methods#∥AFTool生成的抽象对方法∥不要在AF-TOKENS中间添加你自己的代码virtual void ShowParametersFM(name_t name,intID_tidentifier,float maxPower,minPower)=0;virtual void AbcSelectButtonActivated()=0;∥AF_TOKEN_END#public_methods#}; |
class abcMainViewAbsVP_c:public abcDefaultMainViewAbsVP_c{public:∥AF_TOKEN_START#abs_partner_methods#∥AFTool生成的抽象对方法∥不要在AF-TOKENS中间添加你自己的代码virtual void AbcUpdateButtonActivated(name_t name,intID_tidentifier,floatmaxPower,float minPower,boolean_t priorityMode)=0;virtual void AbcSelectButtonActivated()=0;∥AF_TOKEN_END#abs_partner_methods#};class abcMainView_c:public abcDefaultMainView_c{public:∥...∥AF_TOKEN_START#public_methods#∥AFTool生成的抽象对方法 |
∥不要在AF-TOKENS中间添加你自己的代码virtual void ShowParametersFM(name_t name,intID_tidentifier,float maxPower,float minPower,boolean_t priorityMode)=0;virtual void AbcSelectButtonActivated()=0;∥AF_TOKEN_END#public_methods#}; |
前面所述的主控制器基干类的头文件改动后如下面所示(仅给出该文件的一部分,改动过的部分用黑体字标出)。
class abcMainController_c:public abcDefaultMainController_c{public:∥...∥AF_TOKEN_START#abs_partner_methods#∥AFTool生成的抽象对方法∥不要在AF-TOKENS中间添加你自己的代码void AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower,boolean_t priorityMode);void AbcSelectButtonActivated();void BuiExitWanted(); ∥继承于-GUI组件void BuiPrintSetupWanted(); ∥继承于-GUI组件void BuiPrintWanted(); ∥继承于-GUI组件void AbcControllerSelected(intID_tidentifier);∥AF_TOKEN_END#abs_partner_methods#∥...}; |
将前面所说的参数(boolean_t priorityMode)自动添加到主控制器基干类和主视图抽象对基干类的声明中的"voidAbcUpdateButtonActivated()"方法的声明中说明了按照本发明的安排为应用程序添加一新属性是多么的容易。前面所述的添加过程只需通过在描述文件中添加内容并通过代码生成器重新生成代码。应当提出的是,缺省类也应该同时重新生成,但本例中缺省类并没有发生变化(描述文件中没有对它们做出改动)。
主控制器基干函数的实现文件需要改动的抽象对方法在AF_TOKEN之后用标志符#abc2#(描述文件中给出的)来标出。改动将按照如下方式来进行:代码生成器读文件并删去在AF_TOKEN标记与第一个"{"之间的字符,并将抽象对方法的新的声明写到该位置(根据描述文件中新的声明)。然后代码生成器搜索整个文件直到找到第一个字符串"AF_TRACE"为止。代码生成器将AF_TRACE之后的括弧内的字符替换为新方法的声明。代码生成器接着向后搜索文件直到找到字符串<PUBLIC>FUNCTION:为止。代码生成器将<PUBLIC>FUNCTION:标记与下一个换行符之间的字符删除并将新的抽象对方法的声明写到此位置。(注意:虽然下面给出的代码例子中抽象对方法的声明有多行,但是换行符只存在于方法声明的末尾。)
/*************************************************************************<PUBLIC>FUNCTION:void abcMainController_c∷AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower,boolean_tpriorityMode)*************************************************************************抽象对方法的实现**************************************************************************/∥AF_TOKEN#abc2# |
void abcMainController_c∷AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower,boolean_t priorityMode){AF_TRACE("void abcMainController_c∷AbcUpdateButtonActivated(name_tname,intID_tidentifier,float maxPower,float minPower,boolean_t priorityMode)");∥在此添加你自己的代码∥程序员自己的代码可以在此添加} |
上述方法声明的改动(也就是为该声明添加新的参数)是说明如何保持代码生成器生成的代码与程序员编写的代码之间的联系的一个例子。在此例中,字符串"abc2"是对应于该方法(UpdateButton Activated)的标志符,代码生成器生成的代码与程序员编写的代码之间的联系就是通过该字符串来保持的。程序员在为该方法生成的框架中手工写下代码来更新基站控制器参数。
上面对为应用程序添加优先级服务进行了说明。下面,将对前面所说的添加正在工作对话框进行说明。
为了实现这一改动,主控制器的头文件必须补充正在工作对话框组件的头文件,工作对话框的抽象对类必须被主控制器继承,必须声明该正在工作对话框的抽象对方法,而且必须声明一个指向该正在工作对话框的指针变量。该指针必须在主控制器类的实现文件中初始化指向此正在工作对话框,必须创建一个新的正在工作对话框对象例示,必须删除正在工作对话框的对象对话框,而且必须实现正在工作对话框的抽象对方法。
实际上,这一改动是通过在应用程序的描述文件(图1中用数字12标出的)中的主控制器的定义部分中添加如下一行
(service"Working_dialog") |
并重新生成应用程序框架来实现的。下面,将对描述文件改动所引起的重新生成过程中的改动进行说明。
代码生成器重新生成要加入正在工作对话框组件头文件的缺省类的头文件"abccontmadmx.h",正在工作对话框的抽象对类得到继承并且在该类的protected部分加入了一个指向正在工作对话框对象的指针(改动部分用黑体字标出):
∥为了使用正在工作对话框#include"kuiccwrkdlgmx.h"∥...class abcDefaultMainController_c:public mvcMainControllerBase_c,public kuiConfirmationDialogControllerAbsCP_c,public abcMainViewAbsVP_c,public abcSelectionControllerAbsCP_c,public kuiWorkingDialogControllerAbsCP_c{∥...protected:∥...∥正在工作对话框kuiWorkingDialogControllerC_c*workingDialog;}; |
代码生成器还生成了缺省类的实现文件“abccontmadfmx.cc”,其中:
1.对正在工作对话框指针进行了初始化:
2.删除正在工作对话框:
3.创建一新的正在工作对话框对象实例:
abcDefaultMainController_c∷abcDefaultMainController_c(abcDefaultProgram_c*abcPrg){∥...workingDialog=0;} |
abcDefaultMainController_c∷~abcDefaultMainController_c(){∥...delete workingDialog;workingDialog=0;} |
errAtom_c*abcDefaultMainController_c∷MVCCreate(){∥...∥创建新的正在工作对话框workingDialog=new kuiWorkingDialogControllerC_c(this);err=workingDialog->MVCCreate(view->MVCGetParentCandidateQM());if(err)return(err);} |
抽象对声明在主控制器基干类的头文件"abccontmainmx.h"中重新生成,其中包括了正在工作对话框抽象对方法:
class abcMainController_c:public abcDefaultMainController_c{public:∥...∥AF_TOKEN_START#abs_partner_methods#∥AFTool生成的抽象对方法 |
∥不要在AF-TOKENS中间添加你自己的代码void AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower,boolean_t priorityMode);void AbcSelectButtonActivated();void BuiExitWanted(); ∥继承于-GUI组件void BuiPrintSetup Wanted(); ∥继承于-GUI组件void BuiPrint Wanted(); ∥继承于-GUI组件void AbcControllerSelected(intID_tidentifier);virtual void KuiCancelWanted();∥用于正在工作对话框∥AF_TOKEN_END#abs_partner_methods#∥...} |
代码生成器通过AF_TOKEN_START和AF_TOKEN_END标出要重新生成的部分,从而可以只改变文件的一部分而其它的都可以保持不变。
主控制器基干类的实现文件“abccontmainmx.cc”中生成了一个用于实现抽象对方法的框架:
/***********************************************************************<PUBLIC>FUNCTION:void abcMainController_c∷KuiCancelWanted()*************************************************************************抽象对方法的实现************************************************************************/∥AF_TOKEN#kui3#-不要删除该标记void abcMainController_c∷KuiCancelWanted(){AF_TRACE("void abcMainController_c∷KuiCancelWanted()");∥在此添加你的代码} |
在这个抽象对方法的框架中,设计者实现了按下正在工作对话框中Cancel按钮之后要执行的功能。
设计者通过在耗费时间的操作的代码部分之前写下workingDialog->ShowLongDelay(MESSAGE_TEXT)请求来激活(显示在屏幕上)正在工作对话框,例如:
void abcMainController_c∷AbcUpdateButtonActivated(name_t name,intID_tidentifier,float maxPower,float minPower,boolean_t priorityMode){AF_TRACE("void abcMainController_c∷AbcUpdateButtonActivated(name_tname,intID_tidentifier,float maxPower,float minPower,boolean_t priorityMode)");∥Add your own code here.∥a time-consuming operaton beginsworkingDialog->ShowLongDelay(MESSAGE_TEXT);basestation->SetParameters(maxPower,minPower,priorityMode)} |
上述例子(正在工作对话框的添加)说明了为应用程序框架添加一个新的属性是多么容易。这一改动仅仅是在描述文件中添加一行然后根据改动之后的描述文件重新生成应用程序框架就实现了。由于只有用于正在工作对话框的方法"KuiCanceWanted()"和"ShowLongDelay()"在应用程序部分中是对设计者可见的,应用程序仍然保持较高的抽象级别。而更复杂的将正在工作对话框对象添加到应用程序中去的代码被生成在缺省类中(自动地),它们对设计者是不可见的。
尽管上面已经参照依照图的例子对本发明进行了描述,很清楚,本发明并不限于此,而是可以根据前面以及附录中所公开的内容对其进行修改。尽管上面已经描述了一个基于对象的应用程序,原理上在其它类型的安排中使用与此相似的安排是可能的。尽管由于开始所说明的原因本网络管理系统包括了有利的条件,但相似地,本方法也可以用于在除了网络管理系统以外的其它系统中提供服务。依照本发明的方法可以形成这样的系统,如提供服务的一部分或者该方法可以与本系统分开执行并且一个已经完成的应用程序也可以转换到该系统中。附录1-模板文件举例缺省主控制器类头文件的模板。
缺省主控制器类实现文件的模板
主控制器基干类的头文件模板
主控制器基干类实现文件的模板文件
/**************************************************************************** $RCSfile$***************************************************************************** $Author$**** Copyright(c)Nokia Telecommunications 1991-1995*************************************************************************** 产生的应用程序框架类的模板文件***************************************************************************** $Log$***********************************************************************/BODY_START#ifndef FFTDEFAULTMAINTCONTROLLER_H#define FFTDEFAULTMAINTCONTROLLER_H/*MODULE IDENTIFICATION************************************************/static char fftcontmadfmx_rcsid[]="$Id$";#include<stdio.h>#include<stdlib.h>#include<weratomx.h> ∥错误#include<kuicocfmdlgmx.h> ∥控制器确认对话框#include"MAINVIEW_H" ∥主视图以及抽象视图对∥子控制器的头文件INC_SUB_CONTROLLERSclass fftDefaultProgram_c; |
RENAMER_CLASSESclass fftDefaultMainController_c:public mvcMainControllerBase_c,public kuiConfirmationDialogControllerAbsCP_c,public fftMainViewAbsVP_cINHERIT_ABS{public:fftDefaultMainController_c(fftDefaultProgram_c*fftPrg);virtual~fftDefaultMainController_c();virtual errAtom_c*MVCCreate();∥从abs.view中继承virtual void FftWMCloseWanted();∥控制器抽象对方法确认∥methodsvirtual void KuiActionConfirmed();virtual void KuiActionNotConfirmed();protected:mvcMainViewBase_c*MVCGetMainView();MAINVIEW_C *view;fftDefaultProgram_c *fftProgram;∥确认对话框kuiConfirmationDialogControllerC_c*confirmationDialog;SUB_CONT_DECLARATIONSprivate:fftDefaultMainController_c(const fftDefaultMainController_c&);fftDefaultMainController_c operator=(const fftDefaultMainController_c&)const;};#endif/*FFTDEFAULTMAINCONTROLLER_H*/ |
/**************************************************************************** $RCSfile$***************************************************************************** $Author$**** Copyright(c)Nokia Telecommunications 1991-1995*************************************************************************** 产生的应用程序框架类的模板文件***************************************************************************** $Log$***********************************************************************/BODY_START∥MODULE IDENTIFICATION************************************************static char rcsid[]="$Id$";#include"fftcontmadfmx.h"∥该主控制器的头文件#include"fftmainprogmx.h"∥程序模型的头文件∥确认对话框关闭时的WM消息文本const char*closeText="This will close the application.nDo you want to proceed?";/*************************************************************************<PUBLIC> 函数: fftDefaultMainController_c∷fftDefaultMainController_c() |
**************************************************************************构造函数*************************************************************************/fftDefaultMainController_c∷fftDefaultMainController_c(fftDefaultProgram_c*fftPrg){fftProgram=fftPrg;view=0;confirmationDialog=0;SUB_CONTROLLERS_TO_NULL-}/*************************************************************************<PUBLIC>函数:fftDefaultMainController_c∷~fftDefaultMainController_c()**************************************************************************析构函数*************************************************************************/fftDefaultMainController_c∷~fftDefaultMainController_c(){view->MVCHideFM();delete view;view=0;delete confirmationDialog;DELETE_SUB_CONTROLLERSSUB_CONTROLLERS_TO_NULL |
}/*************************************************************************<PRIVATE> 函数: errAtom_c*fftDefaultMainController_c∷MVCCreate()**************************************************************************创建控制器*************************************************************************/errAtom_c*fftDefaultMainController_c∷MVCCreate(){errAtom_c*err=0;∥例示主窗口∥view=new MAINVIEW_C(this);∥初始化Motif事件(只有主视图应该这样做)∥err=view->MVCInitializeWindowingSystem();if(err)return(err);∥创建主视图∥err=view->MVCCreate();if(err)return(err);∥例示确认对话框confirmationDialog=new kuiConfirmationDialogControllerC_c(this);err=confirmationDialog->MVCCreate(view->MVCGetParentCandidateQM());if(err)return err;∥例示并创建子控制器∥CREATE_SUB_CONTROLLERSreturn OK;} |
/************************************************************************* <PROTECTED> 函数: mvcViewBase_c*fftDefaultMainController_c∷MVCGetMainView()**************************************************************************返回主视图*************************************************************************/mvcMainViewBase_c*fftDefaultMainController_c∷MVCGetMainView(){return(view);}/************************************************************************* <PUBLIC> 函数: void fftDefaultMainController_c∷FftWMCloseWanted()**************************************************************************关闭应用程序*************************************************************************/void fftDefaultMainController_c∷FftWMCloseWanted(){if(view->MVCIsIconifiedQM()){view->MVCUnIconifyFM();}confirmationDialog->AskConfirmation((char*)closeText);}/************************************************************************* <PUBLIC> 函数: void fftDefaultMainController_c∷KuiActionConfirmed() |
**************************************************************************关闭应用程序*************************************************************************/void fftDefaultMainController_c∷KuiActionConfirmed(){fftProgram->MVCShutdown();}/************************************************************************* <PUBLIC> 函数: voidfftDefaultMainController_c∷KuiActionNotConfirmed()**************************************************************************关闭应用程序*************************************************************************/void fftDefaultMainController_c∷KuiActionNotConfirmed(){∥不需任何操作} |
/**************************************************************************** $RCSfile$***************************************************************************** $Author$**** Copyright(c)Nokia Telecommunications 1991-1995 |
*************************************************************************** 生成应用程序框架类的模板文件***************************************************************************** $Log$***********************************************************************/BODY_START#ifndef ABCMAINCONTROLLER_H#define ABCMAINCONTROLLER_H/*MODULE IDENTIFICATION************************************************/static char abccontmainmx_rcsid[]="$Id$";#include"abccontmadfmx.h"class abcMainController_c:public abcDefaultMainController_c{public:abcMainController_c(abcDefaultProgram_c*abcPrg);~abcMainController_c();virtual errAtom_c*MVCCreate();∥AF_TOKEN_START#public_methods#∥AFTool生成的抽象对方法∥不要在AF_TOKEN之间加入你自己的代码∥AF_TOKEN_END#public_methods#∥AF_TOKEN_START#abs_partner_methods#∥AFTool生成的抽象对方法∥不要在AF_TOKEN之间加入你自己的代码∥AF_TOKEN_END#abs_partner_methods#protected: |
private:abcMainController_c(const abcMainController_c&);abcMainController_c operator=(const abcMainController_c&)const;};#endif/*ABCMAINCONTROLLER_H*/ |
/**************************************************************************** $RCSfile$***************************************************************************** $Author$**** Copyright(c)Nokia Telecommunications 1991-1995*************************************************************************** 生成的应用程序框架类的模板文件***************************************************************************** $Log$***********************************************************************/BODY_START∥MODULE IDENTIFICATION*************************************************static char rcsid[]="$Id$";TRACE_DECLARATION#include"fftcontmainmx.h"∥主控制器的头文件#include"fftmainprdfmx.h"∥程序模型的头文件 |
/*************************************************************************<PUBLIC> 函数:fftMainController_c∷fftMainController_c()**************************************************************************构造函数*************************************************************************/fftMainController_c∷fftMainController_c(fftDefaultProgram_c*fftPrg):fftDefaultMainController_c(fftPrg){}/*************************************************************************<PUBLIC> 函数: fftMainController_c∷~fftMainController_c()**************************************************************************析构函数*************************************************************************/fftMainController_c∷~fftMainController_c(){}/*************************************************************************<PUBLIC> 函数:fftMainController_c∷MVCCreate() |
**************************************************************************创建控制器*************************************************************************/errAtom_c*fftMainController_c∷MVCCreate(){errAtom_c*err=fftDefaultMainController_c∷MVCCreate();∥在此加入构造控制器时所需的操作return err;}ABS_STUBS |
附录2代码生成器的描述文件的语法
下表说明了代码生成器的描述文件的语法。斜体字印刷的符号为元符号。元符号在描述文件中并不是这样显示的,这样只不过是使语法的说明更具可读性。终端符号在引号中显示。终端符号在描述文件中也是象在下表中的形式一样显示。显示在括号"["和"]"之间的符号是可选的。显示在花括号"{"和"}"之间的符号可重复0次或若干次。注释行用标记"#"开头。
描述文件结构的设计受如下形式的配置文件的通常结构的限制:
ConfFile ∷="("item")"
item ∷=token value{"("item")"}
其中token是任何包括字母和数字字符的字符串,value为引号中的任何字符串。
ConfFile∷= "(" "application"value PrefixDeclaration FamilyldDeclaration TypeDeclaration [SkelTestDeclaration] {ServDeclaration} MainContDeclaration ")" PrefixDeclaration∷= "(""program_block_prefix value")" FamilyldDeclaration∷= "(""family_id"value")" SkelTestDeclaration∷= "(""skeleton_test"value")" ServDeclaration∷= "("service value")" <dp n="d54"/> MainContDeclaration∷= "(" "main_controller"value {PublicMethodDeclaration} [ViewDeclaration] {ServDeclaration} {SubContDeclaration} ")" ViewDeclaration∷= "(" "view" value {PublicMethodDeclaration} [FileDeclaration] TypeDeclaration {AbsPartnerDeclaration} ")" SubContDeclaration∷= "(" "sub_controller"value {InstanceDeclaration} {PublicMethodDeclaration} [FileDeclaration] [ViewDeclaration] [AbsPartnerDeclaration] {ServDeclaration} {SubContDeclaration} ")" AbsPartnerDeclaration∷= "(" "abs_partner"value {AbsMethodDeclaration} ")" AbsMethodDeclaration∷= "(""abs_partner_method"value")" PublicMethodDeclaration "(""public_method"value")" ∷= InstanceDeclaration ∷= "(""instance"value")" FileDeclaration ∷= "(""file"value")" Typedeclaration ∷= "(""type"value")" value∷= ""{any character expect"""}"""
以下的例子清楚地描述了配置文件的语义。
#应用程序名称,必须符合命名规则
(application"fooprgmx"
#应用程序类名与文件名的前缀
(program_block_prefix"foo")
#应用程序标志符。信号设备用该标志符区分处理
(family_id "FOOPRG")
#应用程序类型。"UI"用于界面、应用程序
#"BG"用于后台应用程序
(type "UI")
#指出应用程序生成的方法框架将提供给在终端上显示该方法实现的信息的程序AF_TRACE设备
(Skeleton_test"yes")
#列出了应用程序使用的设备
(service "wne_manager")
(service "process_control")
#主控制器的定义。主控制器的类名将根据命名规则自动生成
(main_control""
#主控制器的定义。主控制器的类名将根据命名规则自动生成
(view""
#主视图的类型。检查主视图可视化类继承的GUI组件
(type"basic_application_base")
#公共界面定义
(public_method"void ShowThisFM(char*txt)")
(public_method"void ShowThatFM(int valur)")
#主视图的抽象对类定义。抽象对类的名称根据命名规则
#自动生成
(abs_partner""
#抽象对方法的声明,继承自GUI组件的方法不必声明
(abs_partner_method"void∷FooIsDone()")
(abs_partner_method"void∷FooSomethingWanted()")
)
)
#主控制器用到的设备的列表
(service"Working_dialog")
#子控制器定义。子控制器名根据命名规则自动生成,
#如:Sub1=>fooSub1Controller_c
(sub_controller"sub1)
#如果子控制器存在多个实例,它们必须用不同的实例名
#彼此分开。如果只有一个实例,则可以不必定义,子控制器定义中的字符串就用做实例名
(instance"donald")
(instance"micky")
#用于生成子控制器文件名的字符串可以省去,这种情况下将使用子控制器定义中的字符串
(file"subcon")
#公共界面定义
(public_method"void Action()")
(public_method"void OtherAction()")
#子视图定义。如果没有子视图名称,则使用控制器的名称作为其类名
(view"sub1"
#子视图类型。定义子视图可视化类所继承的组件
(type"basic_yes_no_help_dialog"
#子视图抽象对类定义
(abs_partner"" (abs_partner_method" void∷FooSubViewTellsSomething()" ) ) ) ) #子控制器抽象对类定义 (abs_partner"" (abs_partner_method "void∷FooSubContWantsThis()") (abs_partner_method "void∷FooSubContWantsThat()") ) <dp n="d58"/> (sub_controller"sub2" (view"" (type"bui_ok_help_dialog") ) ) ) (sub_controller"sub3" (view"" (type"bui_ok_cancel_help_dialog") ) ) ) )
Claims (10)
1.为用户产生特殊应用计算机控制服务的一种方法,该方法包括:形成一描述文件,其中该服务所指定的应用使用所用到的应用程序结构项来描述;自动产生特定应用程序代码,使用软件生成装置(11)根据下面用到的应用程序结构规则从该代码形成特定应用的计算机程序;及运行所述计算机程序来为用户提供所述服务,其特征在于:所述计算机程序按照以下的方式分为不同的部分:第一组(A)只包括应用程序保持相同而不管应用程序是什么的程序代码,通过所述的生成过程而生成的第二组和第三组所具有的程序代码为,(a)第二组(B)只包括所述生成过程所产生的程序代码而(b)第三组(C)包括所述生成过程所产生的代码,设计者可以在生成后进行改动。通知生成装置(11)所生成的代码是为第二组还是第三组所产生的。
2.根据权利要求1所述的方法,其特征在于:应用程序是基于对象的,并且第一组的属性继承给第二组,而第二组的属性继承给第三组。
3.根据权利要求1所述的方法,其特征在于:在第三组中对于设计者所要修改的部分使用为此而保留的字符串与其余的部分分开。
4.根据权利要求1所述的方法,其特征在于:在描述文件中为信息分配一个单独的标志符,该信息是由所述生成过程使用一个代码来补充的,其中设计者所作的修改被加入。
5.根据权利要求2所述的方法,其特征在于:提供给生成装置的输入数据被分为两部分,其中一部分对应于第二组,另一部分对应于第三组。
6.根据权利要求5所述的方法,其特征在于:所述部分包括模板文件,而且生成过程通过根据应用程序描述对模板文件进行补充来完成。
7.根据权利要求1所述的方法,其特征在于:该方法产生网络管理服务,网络管理系统的用户通过该服务控制电信网络。
8.一种产生特定应用计算机控制服务的系统,该系统包括:存储在存储器中关于服务所指定的应用程序的描述,该描述由所用到的应用程序结构项构成;根据所用的应用程序结构规则生成特定应用程序代码的软件生成装置(11),其特征在于:生成装置通过这样的方式与用于将生成的代码分为不同的两组的分离装置(12,13)相连,即一组(B)只包括生成过程中产生的程序代码而另一组(C)包括所述生成过程所产生的而在生成之后被设计者修改的代码。
9.根据权利要求8所述的系统,其特征在于:该分离装置包括所述的描述并为每一组分离模板文件(13a,13b)。
10.根据权利要求8所述的系统,其特征在于:它是一网络管理系统的一部分,其中该系统用于产生网络管理服务,网络管理系统的用户通过该服务控制电信网络。
Applications Claiming Priority (2)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
FI954838 | 1995-10-11 | ||
FI954838A FI103155B1 (fi) | 1995-10-11 | 1995-10-11 | Menetelmä tietokoneohjattujen palvelujen tuottamiseksi |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1199474A true CN1199474A (zh) | 1998-11-18 |
Family
ID=8544170
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN96197576A Pending CN1199474A (zh) | 1995-10-11 | 1996-10-09 | 产生计算机控制服务的方法 |
Country Status (11)
Country | Link |
---|---|
US (1) | US6351842B2 (zh) |
EP (1) | EP0855059B1 (zh) |
JP (1) | JPH11513515A (zh) |
CN (1) | CN1199474A (zh) |
AU (1) | AU710715B2 (zh) |
BR (1) | BR9610796A (zh) |
CA (1) | CA2234463C (zh) |
DE (1) | DE69618468T2 (zh) |
ES (1) | ES2171721T3 (zh) |
FI (1) | FI103155B1 (zh) |
WO (1) | WO1997014097A1 (zh) |
Families Citing this family (7)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5999730A (en) * | 1997-10-27 | 1999-12-07 | Phoenix Technologies Limited | Generation of firmware code using a graphic representation |
JP3871832B2 (ja) * | 1999-08-20 | 2007-01-24 | 日本電気株式会社 | データ処理プログラム自動生成システム及びその方法並びにコンピュータ可読記録媒体 |
US20040015809A1 (en) * | 2001-05-18 | 2004-01-22 | Doreen Yining Cheng | Code generation for integrating devices into a middleware framework |
US20020188703A1 (en) * | 2001-06-04 | 2002-12-12 | Mckesson Information Solutions Holdings Ltd. | Graphical tool for developing computer programs via specifications |
US20050268173A1 (en) * | 2004-05-11 | 2005-12-01 | National Instruments Corporation | Programmatically analyzing a graphical program by traversing objects in the graphical program |
US7917856B2 (en) * | 2005-10-24 | 2011-03-29 | Sap Ag | Converting between user interface technologies |
EP2524304A1 (en) * | 2010-01-13 | 2012-11-21 | Tata Consultancy Services Ltd. | A computationally efficient system for developing configurable, extensible business application product lines using model-driven techniques |
Family Cites Families (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US5237688A (en) | 1987-11-18 | 1993-08-17 | International Business Machines Corporation | Software packaging structure having hierarchical replaceable units |
WO1990004227A1 (en) | 1988-10-12 | 1990-04-19 | Expressway, Inc. | Software manufacturing system |
US5075847A (en) * | 1989-05-26 | 1991-12-24 | Hewlett-Packard Company | Method and apparatus for computer program encapsulation |
EP0502975B1 (en) * | 1989-11-30 | 1997-07-16 | SEER TECHNOLOGIES, iNC. | Computer-aided software engineering facility |
US5699310A (en) * | 1990-06-29 | 1997-12-16 | Dynasty Technologies, Inc. | Method and apparatus for a fully inherited object-oriented computer system for generating source code from user-entered specifications |
US5193180A (en) | 1991-06-21 | 1993-03-09 | Pure Software Inc. | System for modifying relocatable object code files to monitor accesses to dynamically allocated memory |
JPH06332680A (ja) | 1993-05-21 | 1994-12-02 | Tadao Shogetsu | プログラム自動生成装置 |
WO1995003586A1 (en) * | 1993-07-21 | 1995-02-02 | Persistence Software, Inc. | Method and apparatus for generation of code for mapping relational data to objects |
JPH0869381A (ja) | 1994-08-30 | 1996-03-12 | Nec Ic Microcomput Syst Ltd | コンパイル方式 |
-
1995
- 1995-10-11 FI FI954838A patent/FI103155B1/fi active
-
1996
- 1996-10-09 AU AU72181/96A patent/AU710715B2/en not_active Ceased
- 1996-10-09 JP JP9514744A patent/JPH11513515A/ja active Pending
- 1996-10-09 BR BR9610796A patent/BR9610796A/pt not_active Application Discontinuation
- 1996-10-09 EP EP96933452A patent/EP0855059B1/en not_active Expired - Lifetime
- 1996-10-09 DE DE69618468T patent/DE69618468T2/de not_active Expired - Fee Related
- 1996-10-09 CN CN96197576A patent/CN1199474A/zh active Pending
- 1996-10-09 WO PCT/FI1996/000530 patent/WO1997014097A1/en active IP Right Grant
- 1996-10-09 ES ES96933452T patent/ES2171721T3/es not_active Expired - Lifetime
- 1996-10-09 US US09/051,361 patent/US6351842B2/en not_active Expired - Fee Related
- 1996-10-09 CA CA002234463A patent/CA2234463C/en not_active Expired - Fee Related
Also Published As
Publication number | Publication date |
---|---|
DE69618468T2 (de) | 2002-08-22 |
ES2171721T3 (es) | 2002-09-16 |
US20010034878A1 (en) | 2001-10-25 |
CA2234463C (en) | 2003-02-11 |
EP0855059B1 (en) | 2002-01-09 |
FI103155B (fi) | 1999-04-30 |
EP0855059A1 (en) | 1998-07-29 |
FI103155B1 (fi) | 1999-04-30 |
US6351842B2 (en) | 2002-02-26 |
WO1997014097A1 (en) | 1997-04-17 |
CA2234463A1 (en) | 1997-04-17 |
FI954838A (fi) | 1997-04-12 |
BR9610796A (pt) | 1999-07-13 |
AU7218196A (en) | 1997-04-30 |
DE69618468D1 (de) | 2002-02-14 |
FI954838A0 (fi) | 1995-10-11 |
AU710715B2 (en) | 1999-09-30 |
JPH11513515A (ja) | 1999-11-16 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107729003A (zh) | 代码的自动生成方法、装置及电子设备 | |
CN1811702B (zh) | 用于向门户服务器应用环境自动部署门户应用的系统和方法 | |
CN1208482A (zh) | 分布式处理 | |
US7093264B2 (en) | Method and apparatus for assembling Enterprise JavaBeans components | |
CN1487446A (zh) | 服务器端应用为浏览器客户端提供用户界面的方法 | |
JP2009238231A (ja) | コンポーネント基盤環境下で拡張されたメタデータを利用したソフトウェア開発方法及びその開発システム | |
CN112751692A (zh) | 业务开通方法及装置 | |
CN1199474A (zh) | 产生计算机控制服务的方法 | |
CN112083926A (zh) | 一种Web用户界面生成方法及装置 | |
CN1677932A (zh) | 网络管理配置方法及其装置 | |
CN1975669A (zh) | Xml语言描述的业务逻辑映射到应用语言的方法 | |
CN1713140A (zh) | 计算机界面生成方法及装置 | |
CN112230919A (zh) | 页面模板化配置发布方法、系统、存储介质及服务器 | |
CN109857462A (zh) | 遥感图像可视化编辑器的后台Docker任务映射方法 | |
CN108021353A (zh) | 软件产品的说明文档的生成装置、方法、设备及存储介质 | |
CN1148652C (zh) | 分层结构的控制信息编辑器 | |
CN1093954C (zh) | 计算机系统的启动系统 | |
CN111966350A (zh) | Web前端界面生成方法及装置 | |
CN111680337B (zh) | Pdm系统产品设计需求信息获取方法及系统 | |
JP2011076561A (ja) | パーツカタログ作成支援装置、プログラム、およびパーツカタログ作成支援方法 | |
CN1105508A (zh) | 动态浏览窗系统 | |
CN1516036A (zh) | 网络信息发布系统及其发布方法 | |
JP2012150740A (ja) | プログラム生成装置及び方法 | |
da Cruz et al. | Automatic generation of user interface models and prototypes from domain and use case models | |
TWI774469B (zh) | 程式編譯管理系統與其作業方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |