对于软件开发,有两种思维模式:
- 命令式
- 说明式
命令式的思维模式是这样:按照每个步骤描述要做的工作和任务,先做什么,后做什么,顺序是不能颠倒的;
说明式的思维模式是,描述一个物体或者概念,它有什么特性,和其他物体有什么关系。
对于编程语言,实际上是命令式与说明式思维混合在一起的。
比如,我们熟悉的C语言,其中,说明式的语句包括:
- 函数定义与声明
- 变量(全局、局部、静态)的定义与说明
- struct定义
- enum定义
- typedef定义
- 分支语句(if-else, switch),循环语句,都属于说明性的部分
- 等
- GUI界面描述
- 事件处理方式
- 开始按钮按下后,停止按钮变为可用,反之亦然;
- 在播放进度上选择不同进度,播放的实际就会变化;
- 等等。
<window>
<button name="play"/>
<button name="stop"/>
<progress name="progress"/>
<label name="current_time"/>
</window>对应的状态控制的xml表述是<controller>
<variable name="play_state" type="enum">
<option value="playing"/>
<option value="stoped"/>
</variable>
<variable name="curtime" type="time"/>
<variable name="progress" type="percent"/>
</controller>play_state将绑定到play/stop button上;curtime将绑定到current_time label上,progress将绑定到progress控件上。binding player_controller(window : DOM, ctl: DOM)
{
window://button[@name='play']/@enable = expr(ctl://variable[@name='play_state'] != playing);
window://button[@name='stop']/@enable = expr(ctl://variable[@name='play_state'] != stoped);
window://progress/@postion == ctl://progress;
window://current_time/@text = ctl://curtime;
}这是利用类似C++代码表示的伪码。其中 "="表示将右边的值绑定到左边; "=="表示左右两边互相绑定。与C++语言中的赋值和比较是不一样的含义。
<window >
<import-dom name="ctl"/>
<button name="play" enable="{expr(ctl://variable[@name='play_state'] != playing}"/>
<button name="stop" enable="{expr(ctl://variable[@name='play_state'] != stoped)}"/>
<progress name="progress" postion="{ctl://progress}"/>
<label name="current_time" text="{ctl://curtime}"/>
</window>"{" "}" 分别表示的是绑定机制<bookstore>
<book category="COOKING">
<title lang="en">Everyday Italian</title>
<author>Giada De Laurentiis</author>
<year>2005</year>
<price>30.00</price>
</book>
<book category="CHILDREN">
<title lang="en">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>29.99</price>
</book>
<book category="WEB">
<title lang="en">XQuery Kick Start</title>
<author>James McGovern</author>
<author>Per Bothner</author>
<author>Kurt Cagle</author>
<author>James Linn</author>
<author>Vaidyanathan Nagarajan</author>
<year>2003</year>
<price>49.99</price>
</book>
<book category="WEB">
<title lang="en">Learning XML</title>
<author>Erik T. Ray</author>
<year>2003</year>
<price>39.95</price>
</book>
</bookstore>将该数据映射到一个listview控件中。listview由4列组成,首先,我们使用xslt的映射方式
<listview>
<import-dom name="book"/>
<foreach select="book://book"/>
<row>
<column>
<image src="{getimage('book:@category}"/>
</column>
<column>
<label text="{'book:title'}"/>
</column>
<column>
<label text="{connect(book:author)"}/>
</column>
<column>
<label text="{book:year}"/>
</column>
<column>
<label text="{book:price}"/>
</column>
</row>
</foreach>
</listview>还有另外一种方式,再不需要改变listview的定义内容的情况下,通过外部改变其结构
bind listview(row_templ : DOMTemplate, book:DOM)
{
foreach(book://book, {
DOM row = form_template(row_templ);
row:colum[0]/image/@src = getimage(book:@category);
row:column[1]/label/@text = book:title;
row:column[2]/label/@text = connect(book:author);
row:column[3]/label/@text = book:year;
row:column[4]/label/@text = book:price;
listview.append(row);
})
}推荐使用这种不直接生成的方法,它的耦合性更小。
class Display
{
public:
int width;
int height;
int depth;
};描述它的DOM化结构Node display_node(
"display" //node name,
attribute("width", OFFSET(Display, width), INT, 800,range(1,2000)),
attribute("height", OFFSET(Display,height), INT, 600,range(1,2000)),
attribute("depth", OFFSET(Display,depth), INT, 16, emu(8,16,24,32)))
);Node类描述一个Node节点,Node节点包括属性和可能存在的子节点。
- "display" 是节点的名称
- attribute会创建属性:
- "width"是属性名称
- OFFSET(Display,width) 是一个宏,它创建一个属性访问的对象,在这里,我们通过width成员相对与Display的偏移来访问
- INT 表示属性的基本类型位integer
- 800 表示默认值
- range(1,2000) 是对width值的一个约束,也就是说,该属性取值必须在1到2000之间
1169



被折叠的 条评论
为什么被折叠?



