zoukankan      html  css  js  c++  java
  • 《WF本质论》第一章OpenSesame我的实现

        相关的背景可以看http://www.cnblogs.com/cloudjun/archive/2009/04/04/1429299.html,有机会的建议看书。

        刚开始看这本书,第一次接触第一章的这写概念,代码省略的地方多了,看的感觉有点断层。网上初略的找了一下源代码,发现作者自己居然没有提供,能找到的其他实现都没有100%的实现,即不是一个真正可运行的示例代码。为了能够更深入的理解,我自己按照书中给出的轮廓做了一个自己的实现。我的实现中,并不是100%依照书中的描述,有一些是根据自己的理解改进的,比如我的实现中BookmarkManager类并没有Done方法,语句的状态,被定义到了ProgramStatement这个父类中,我认为Done这个动作是语句自身的状态的一种,和书签管理器本身没什么关联。书签的删除也从语句中移到了异步调用完毕(既ContinueAt方法调用之后),这样更合理,在书签管理器中删除书签。增加了一些书中提到的但是跳过的(常用理由:不是本章内容),比如BooleanExpression的实现(同样使用了代理来实现,顺带的及其简单的实现了数据绑定),BookmarkNotFoundException,钝化(使用System.Runtime.Serialization.Formatters.Binary来实现,目前发现.Net Framework也只有它能实现这个循环引用外带委托的类的序列化,其他的其中DataContractSerializer不支持循环引用,SOAP格式不支持委托,XML序列化没尝试,我想到DataContractSerializer内部似乎使用了XML序列化)等。还有一些改动是按照书中所述很难实现的改动,记不清楚是哪些地方了,这个示例代码陆陆续续的写了2个星期。

        没有实现或完整实现的内容包括,最后的几张数据库表,因为实现解析器真不是本章内容了 :) ,我简单的使用了C#本身来代替。书中提到书签恢复之间的约束等(我感觉不是重点,而且加大了示例代码的复杂度),数据绑定等。

      Program中假定了2种情况,一种是一次运行完毕(all),另一种是运行到需要输入的时候钝化(part1, part2),等待输入以后激活继续运行。实际上是可以在任何一个书签点钝化的,只不过OpenSesame中的逻辑中只有等待输入时候需要挂起,因此就按照这个逻辑设计了另外一种执行方式。

        另外,Program中的书签是面向输入和Key一致的情况,如果输入和Key不一致会引发BookmarkNotFoundException,原因是PrintGreeting没有被执行,所以没办法恢复这个书签。这种情况应该是正常的,书签是由MythicalRuntime的客户端自己保管的,如果需要可以判断然后使用不同的书签,我的实现中没有提供对这种情况的支持。

        示例代码下载

  • 相关阅读:
    BZOJ5212 ZJOI2018历史(LCT)
    BZOJ5127 数据校验
    253. Meeting Rooms II
    311. Sparse Matrix Multiplication
    254. Factor Combinations
    250. Count Univalue Subtrees
    259. 3Sum Smaller
    156. Binary Tree Upside Down
    360. Sort Transformed Array
    348. Design Tic-Tac-Toe
  • 原文地址:https://www.cnblogs.com/wenhx/p/EssentialWF_1_OpenSesame.html
Copyright © 2011-2022 走看看