胡思乱想之界面-数据接口

在软件开发中,尤其是GUI开发中,我们关注比较多的是,程序的界面,毕竟,这最直观,最容易评估。

但是有一点却没有注意到:界面上的组件和元素应该如何和程序的内部逻辑交换数据呢?

 

在用C开发的GUI中,常常使用Get/Set函数操作一个GUI的元素句柄;在C++、Java开发的GUI中,这些数据常常转化为属性或者成员函数。

无论是那种方式,都是必须知道GUI元素的对象或者句柄才能操作。

 

实际上,仔细考虑下,在一个有界面的应用程序中,存在两个不同层次的需求:

   第一层,界面和程序内部交换数据,呈现数据给用户,并响应用户的操作

   第二层,界面应该华丽、有吸引力,符合人们的使用习惯

 

这两个层次,关注的角度并不相同,但是,界面的数据操作必须通过GUI元素的句柄或者对象,这样,在很多时候,我们必须同时考虑界面的基本形态和程序的内部逻辑。

 

虽然有很多的方法,如皮肤、主题等,帮助程序员解决界面的外观和内部逻辑的耦合,但是,还是很多问题难以解决的。

 

针对这个问题,我想提出一种方法,用一种描述方法,作为中介,隔离界面和内部逻辑。

 

从开发者角度看,他首先要解决的问题是整个应用程序的框架、流程,内部的数据接口,以及大致的界面。考虑界面和内部逻辑的接口,从内部逻辑上看,界面充当的输入和输出的功能,内部逻辑关心的是,在合适的时间得到希望的数据,并在合适的时间输出希望的数据。

从这个意义上看,一个窗口和scanf,printf函数并无本质的区别。

 

从最简单的例子说,比如,我们希望输入用户名和密码,按照我们的设计,可以这样描述

 

Input NamePassWord {

   Name : String, maxlen=20, Required;

   PassWord : String, maxlen=20, Required

};

 

这描述了一个输入模板,名字为NamePassWord, 有两个键值:Name和PassWord,并定义了其类型(String),最大值,是否为空(Required)。

 

这里,我们称它为一个“模板”,是因为他不是一个实际存在的对象,而是可以根据它来生成对象。

 

 

当有了这个定义后,对于内部逻辑,其代码可能是:

 

//输入数据

info = Get(NamePassWord); //根据NamePassWord模板,得到用户的输入数据

printf("name:%s, password:%s/n", info.Name, info.PassWprd);

 

这些代码是伪代码。Get方法启动一个输入,并把数据存储到info中。内部逻辑代码不需要考虑究竟是如何Get到的,只要得到即可。info对象,按照上面的定义,可以访问Name和PassWord属性。

 

那么,在界面一端,可以通过绑定的方式,把NamePassWord绑定到一个对话框上。比如,我们用xml描述了一个界面:

 

<Dialog name="NamePassWordDlg">

   <Edit name="Name"/>

   <Edit name="PassWord"/> 

</Dialog>

 

可以这样绑定:

bind NamePassWord NamePassWordDlg {

   Name : Name

   PassWord : PassWord

}

 

以上代码仅为演示,实际上这些绑定的说明都可以用xml文件描述。 上述代码演示了把一个Input模板绑定到一个窗口模板上。

窗口模板的具体形态可以任意确定,可以很简单,也可以很复杂。

 

这样一个小小的示例,展示了如何和窗口模板的间如何通过一个输入输出模板来相互交流的。

 

目前,这种绑定方式,只适合简单的对话框。而一些非对话框,会根据内部的状态改变而改变。这一点,我们在以后的胡思乱想中慢慢想

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值