首先考虑一个应用场景:CSDN正在进行的“中国开发者2005大调查”(有奖品拿的,欢迎参加)。这个调查总共要填大概是8张表单,填写的过程中间还有一定的逻辑判断(例如:可能因为表单1中的某个选项而导致表单4不必填写)。这个流程实现的难度,以及实现完成之后业务逻辑的散乱程度,不难想象。我并不打算说我已经找到了解决这一问题的办法,只是把最近一周以来看到、想到的一些东西列在这里,作为一个参考的入口。
考虑另一种编写web应用的思路:一个用例被描述为一个自包含的程序模块,该模块的返回值是用例的最终结果页面。在生成此返回值的时候,需要使用来自用户的输入,此时便生成一个接受输入的表单页面,并将流程挂起等待。等用户输入完成之后,继续往下生成结果页面。如果需要多表单输入,以此类推。这样的一个程序,参见Servlet with Scheme: One Input Form。
(之所以想到这个,是因为前一阵一直在看SICP,捎带手试用了一下DrScheme提供的web server。)
这种方式被称为Continuation。ajoo同志有一篇文章介绍它:从Continuation概念说到它在开发中的应用。在Ruby参考手册中也有一章专门介绍它。同样,Python社群也有介绍它的文章。Sam Ruby有一篇题为“Continuations for curmudgeons”的blog,私以为是讲说得比较清楚的,并且用的基本都是熟悉的语言。但这个标题和第一段有点令人伤心:莫非连我都得被纳入“老家伙”一类了么?
不过,我仍然希望把学院派的概念与实际应用结合起来。IBM developerWorks有一篇题为“用Continuation开发复杂的Web应用程序”的文章,恰好是讲这个问题的。不过,这篇文章用的例子是Cocoon,而Cocoon实现Continuation的方式是JavaScript。另一份文档Scheme in The Real World: A Case Study则更合我的口味。这篇文档介绍了一个在J2EE环境下的、基于Scheme的web框架SISCWeb,这是我打算切入进去的一个项目。另一个基于Continuation的web框架是Seaside,一个Smalltalk作品,我不打算为了它再去学一门新的语言。基于Java的另一个实现是RIFE。
(值得留意的是RIFE的作者Geert Bevin在Sam Ruby那个blog下面的留言:“There are a number of situations where continuations make your life easier, however there are even more situations where they don’t feel natural in a web application. The solution continuations solve best is one where you have a multi-step ‘island of functionality’ that does one particular thing on its own and that shouldn’t be committed to the backend before the final step is finished. These are typically a wizard, a game, a multi-page admin intervention, a survey, ...”)
最后,介绍另一个关于此主题的精彩入口:Continuation-based web programming。而且,我还很乐意借用这篇blog的开篇词来作为本文的结尾:
People reading this blog might be forgiven for thinking that I don't do software development for a living, so here's some technical stuff to even up the balance.