• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

跨越边界: 延续、Web 开发和 Java 编程

发布: 2008-6-19 13:33 | 作者: 不祥 | 来源: developerworks | 查看: 67次 | 进入软件测试论坛讨论

领测软件测试网

不是乌托邦

无状态(stateless)这个简单的单词将沉重的负担从系统转移到了开发人员身上。其后果是不容质疑的:尽管由于不必为每个用户维护一个服务(或 servlet),而获得了很好的可伸缩性;但是,对状态进行管理的责任从编程语言转移到了开发人员身上。目前,可以将 Web 开发看成一系列无状态的请求,见图 1:


图 1. Web 应用程序由请求/响应对组成


采用这种模型,浏览器得到了严格控制。应用程序只对浏览器发出的请求进行响应。如果请求是小型的独立请求,那么这个模型是有效的;但不幸的是,对于驱动有多个应用组成部分的 Web 应用程序,它是不合适的。最常见的例子是在线购物。点击 Submit 按钮两次,常常会意外地重复订购同一商品。以后当您发现购物车中有重复的商品时会大感意外。

向用户提供有状态体验的方法通常是:将与一次交谈相关的所有数据放进一个会话中,并用 cookie、隐藏字段或 URL 变量在客户机上标识用户会话。对于每个新的请求,必须依次执行以下步骤:

从客户机获得用户的标识符
从会话中恢复交谈状态
处理用户的请求
构建响应
将交谈状态存储在会话中
将响应发送给用户
我对这个问题说得太轻描淡写了,因为使用无状态模型来模拟有状态应用程序可能造成更严重的问题。最严重的问题从 Web 开发刚出现时就存在了,就是如何处理 Back 按钮。

老问题的新答案

在 Web 开发中,可以利用有状态模型为用户提供无状态体验。您听到这种说法可能会感到震惊。实际上,在 Hackers and Painters(参见 参考资料)中,Paul Graham 就讨论了早在 1995 年在 ViaWeb 中使用的底层方法。这种方法使用一种称为延续(continuation) 的编程控制结构。

基本思想是:可以让编程框架在请求之前装载应用程序的状态,并在每个请求之后保存应用程序的状态。我首先介绍一下 Ruby 编程语言中的延续。

一个 Ruby 示例

如果希望执行代码,请安装 Ruby 并输入 irb。通过在 > 字符后面输入命令,定义一个称为 loop 的方法,见清单 1:


清单 1. 创建 loop 方法

irb(main):001:0> def loop(interrupt)
irb(main):002:1> for i in 1..10
irb(main):003:2> puts "Value of i: #{i}"
irb(main):004:2> callcc {|c| return c} if i == interrupt
irb(main):005:2> end
irb(main):006:1> end
=> nil
 


loop 方法接受一个称为 interrupt 的参数。它启动一个从 1 到 i 的 for 循环,打印 i 的值,然后做一些奇怪的事儿。神秘的 callcc 语句意味着用延续进行调用。可以把延续看成在某一时间点上 “冻结的” 程序状态。Ruby 调用花括号中的代码块,同时传递一个延续对象。花括号中的代码是一个闭包,它仅仅是传递给 callcc 的代码块。最终结果是,callcc 捕获执行的状态并将结果存储在 c 中。现在,可以调用这个方法并在循环的任意位置中断执行,这会捕获程序的状态。在以后,可以恢复状态。

文章来源于领测软件测试网 https://www.ltesting.net/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备2023014753号-2
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网