重入的交互设计
menucmd.c<-------------命令
main(string arg)
{
pash(arg)<-------------先入先出的堆栈
for(int loop=0; loop < sizeof(堆栈); loop++)
{
mixed 条件 = query(arg, loop)<----------依次查询参数堆栈的所有参数
if(条件不存在)
{
write("<menu(x:~menucmd )>[yes]确定|[no]否定/n");//弹出对话框向用户收集确认信息
}else if(条件不符合要求)
{
返回否定结果给用户并清空堆栈
return;
}
}
所有条件都成立
执行相应的代码。。。。
}
每次执行时如果条件为空会依次询问用户执行的条件
如果条件存在判断当时上下文内条件是否符合规定。
每次讯问的过程如下
询问条件一,
判断条件一,询问条件二,
判断条件一,判断条件二,询问条件三,
判断条件一,判断条件二,判断条件三,询问条件四。
直道所有条件全部询问满足,并判断满足后执行最后的结果
堆栈某一时刻可能的存储的结果,条件一,条件一,分别代表条件一判断所需要的参数
({({条件一,条件一}),({条件二}),({条件三,条件三,条件三})})
每次交互重入都会重新判断条件是否成立防止多线程模式下因为上下文的切换
这里的交互可不单只和用户的交互也可以用于其他多线程的异步的情况的命令交互
但因为在界面交互模式下会假设用户用同步方式等待服务器而不会执行其他操作,
如果用户在异步模式下服务端就要维护多个交互上下文块,而导致数据臃肿如果出现死锁
导致临时的数据存储模块将会不能被销毁。
可以定下如下规则防止一些情况。
同一用户的调用同一命令只保存一个数据交互堆栈,直道用户取消或销毁或条件不成立,将一直保存。
考虑一种比较官僚的交互方式。
当你拿着一个申请表,上面有需要必须填写的项目。
姓名,年龄,申请的事项。
如果你只填写了姓名,拿到窗口,窗口就会打回来说年龄和申请事项没有填写。
你要拿回这张单据继续填写年龄又递交到窗口,窗口会说申请事项没有填写。
你又拿在单据去填写申请事项。如果只有你和窗口这种方式也许显得很官僚。
考虑如果有多个窗口和多个申请人时,而表单不能放到你的手里而是放到窗口,
窗口只能用询问的方式对申请人。
首先窗口会找到你的表单,查看你已经填写的项目是否符合规定,询问你还没有填写的项目。
例如一张已经填写了姓名而没有填写年龄的表单,窗口在检查姓名符合规定并已经填写后发现你没有填写
年龄,就会返回一个要你填写年龄的反馈。然后窗口就可以继续处理其他申请人的申请直道你在再次提交年龄
,窗口会重新找出你的表单(注意这里可以是任意的窗口)查看你已经填写的项目(防止你一开始就只提交年龄而没有提交姓名,考虑如果选择有分支的情况,例如名字如果填写的是随手互动的公司名称那么下一个需要填写的就不是年龄而是公司人数)找到你没有填写的部分,如果已经全部填写完毕返回处理结果给申请人。但如果检查发现已经填写的部分有问题例如申请人填写的名字已经更改。这张表单将会作废需要申请人重新填写一张。简单的说就是处理多线程和多客户端在异步处理多命令形式下的一个方案。