流动的程序设计:流程_第1页
流动的程序设计:流程_第2页
流动的程序设计:流程_第3页
流动的程序设计:流程_第4页
流动的程序设计:流程_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、流动的程序设计:流程baidicyahoo.c n面向对象的三板斧主管要求小程设计一个简单的仓库,他毫不犹豫地选择了面向对象。 面向对象的程序设计该怎样进行呢?没错,正如教科书所讲:抽象、封装、继承小程首先抽象出【货物】、【库房】与【保管员】三个对象,然后分别为它们封装 属性和行为,结果大致如下:货物库房保管员属性:名称属性:位置属性:数量属性:库存清单行为:入库行为:出库 行为:查找货物 行为:更新库存行为:记录流水账/很简单嘛,已经可以开始使用了。然而没过几天,保管员就开始抱怨:【库房】总爱偷懒!每次入库或者出库之后, 他都得提醒【库房】去更新库存。如果一时疏忽了,他就不得不花费大量的时间

2、去重 新清点库存。这本来不就应该是【库房】的分内之事吗?唔,这个简单,修改一下【库房】的入库与出库,让它们去执行更新库存就行了。没等小程松口气,主管又要求小程为每件货物增加一个条形码,以便根据条形码来识别货物。这个就麻烦多了,需要给【货物】增加新的属性:条形码,同时给【库房】增加 新的行为:识别货物,并修改所有既有的行为,以适用于条形码方式,而且要把这些 变化告知保管员。库房行为:识别货物行为:查找货物小程正忙于修改程序,保管员又提出一个新点子:【库房】应该更勤快点,自动记录流水账,这样他就不用担心会遗漏流水账了。还有,主管要求货物分类放置,方便以后拆分仓库小程很快发现,【库房】的行为增加到了

3、十几个甚至更多,保管员对此晕头转向, 威胁说如果小程不改善仓库,他就跳槽正当小程一筹莫展时,一个叫【工场】的家伙跳了出来,声称能改变这一切使用工场先来看看工场的名片:f工场 行为:开工 其他对外保密【工场】接着做自我介绍:1. 工场(理论上)只做一件事情或者一类事情;2. 工场只开放一个单向访问入口;3. 工场(理论上)是独立的,圭寸闭的;4. 工场相对固定,不随入口数据的变化而变化;唔,貌似很单纯又很神秘的一个对象。小程决定尝试从【工场】继承一个【库房工场】:库房工场行为:开工内部属性:库存清单内部行为:入库、出库、查找货物、更新库存、识别货物、x这下保管员开心了,他只需要告诉【库房】:来货

4、物了,开工啦,或者,嘿,出 库单来了,快开工库房就会把所有的任务依次完成。不过小程就比较郁闷了,他不得不对每一种情况进行判断,如果是货物, 【库房】 需要执行入库、贴条形码、更新库存、记录流水账,如果是出库单, 【库房】需要出 库、更新库存、记录流水账而且,假如以后要添加一个行为,可能所有的流程都会受到影响想一想小程 就头大如斗保管员开心了,他却更痛苦了嘿,【工场】再次跳了出来,不要把流程放进【工场】里,那是另一个家伙【流 程】的事情,【工场】只是用来做事情的。但是,一件事往往不是简简单单的一件事, 所以,告诉你一个好消息:5. 工场具备动态执行自己的行为的能力;6. 工场按照预置流程(像一道

5、流水线一样)智能运作。智能工场小程顿时来了兴致,怎么才能让工场智能运作?首先,需要设置预置流程,外部配置文件是个不错的选择:库房工场预置流程货物入库:入库、贴条形码、更 新库存、记录流水账清单出库:出库、更新库存、记录流水账默认流程:这下轻松多了,入库货物来的时候,只需要把预置流程同时交给【库房】,由于它的动态执行能力,它就会像流水线一样从头执行到尾:入库、贴条形码、更新库存、 记录流水账;出库清单来的时候也一样。如果没有找到合适的预置流程,它就会去执 行默认路程。而且,如果以后需要更改流程,甚至不用修改设计,只需要修改预置流 程就行了。更妙的是,如果不小心发现了以前留下的问题,小程可以悄悄的

6、修改好, 而不必让任何人知道。不管小程增加、删除或者修改【库房】,在保管员看来,【库房】都没有发生变化, 他再也不用为【库房】的频繁变更而上火了。对此小程提出了一个新的想法:【库房】应该更智能点,只需要告诉它货物入库, 它会自己找到预置流程并执行。没错,这是一个非常棒的想法。由于【工场】的封闭特性,你有两个选择:1. 把预置流程作为必须的构造参数(记得保留一个默认流程);2. 使用一种类似的方式:预置工场。预置工场单例模式你一定非常熟悉,无论你怎么创建或者获取对象,它总是一个静态的唯 一的实体。这将非常适用于记录流水账一类的事情。注意下面这个单例,看看它有什么不同:class LogWork

7、# by PHPprivate static$ENTRY= null ;public fun ctio n_con struct($flows =if (! self : $ ENTR/#初始化null )As return self:$ ENTRY)似乎与把预置流程作为构造参数没太大不同 是的,除了单例,仅仅有一点使用的不同:#预置区域$log = new LogWork($flows);#后续使用$log = new LogWork();这样,通过在预置区域的预置构建,后续处理即可不必关注构建细节,而随意使 用。而且,通过不同的预置构建,可以实现不同的构建细节,而不必去修改设计。甚至不会让

8、人感觉到与普通的对象有什么区别。当然,除了应用的局限,不用把 这种用法泛化,而仅应用于适用单例的对象。然而,随着货物的种类和数量越来越多,仓库拆分成了四个,小程发现了一个新 的问题:对于拆分出来的新【库房】,显然也要使用条形码,由于【工场】的封闭性, 难道每个库房都要准备一套条形码序列?显然它们应该使用一套。当然不必,除了从基类继承,还有一种特殊的工场:露天工场。露天工场露天工场特殊在哪里呢?1. 露天工场有任意多个入口(因为它是露天的);2. 露天工场的属性与行为全部是静态的、公开的;3. 露天工场不能被继承;4. 工场能也只能访问露天工场。这样看起来,露天工场完全是一个公共属性与行为库,所

9、有的【工场】都可以直 接的不受约束的访问,而且也只能访问露天工场。可以简单的把它们理解成一个【工 场】群,露天工场就是最核心的、可以供所有【工场】自由出入的那个。好容易弄明白了这一点,小程的新麻烦又来了:主管在四个仓库之外又设立了一 个加工厂,根据库存的原料的情况加工生肉片或者火腿,如果加工厂也做成一个【工 场】,天啊,谁去访问库房?保管员?他绝对跳槽!哈哈,你终于说到重点了,这个当然是【流程】最拿手啦,他早就迫不及待要出 来晒一晒了!了解流程【流程】与【工场】有什么区别?【工场】,沉默而专注,他喜欢只做一件事,一件他最擅长的很少发生变化的事 情。你只需要给他一个消息,他就能一丝不苟地把这件事

10、做的很好。【流程】,活泼而多变,她根据情况的变化与若干不同的【工场】打交道,使他 们协作起来进而完成艰巨而又复杂多变的任务。 进一步的,她可能还需要别的【流程】 的协作。为什么要有流程?程序设计,总是希望把善变与不变分开,同时又要非常方便的做出改变。不管披上什么样的外衣,程序的基本功能往往并未改变,改变的是组织与访问他 们的方式,改变的是程序的【流程】。好像是这样,小程点点头,不管【库房】怎么改变,他的基本行为其实并没有什 么变化,只是小程的设计与使用的方式在不断的变化。唔,为了更方便维护,更易于 使用。来看看流程的名片(与工场如出一辙):流程 行为:开工 其他对外保密流程的开场白:1. 流程

11、只开放一个访问入口;2. 流程可以访问工场与其他流程;3. 流程通过有序的组织工场与其他流程,进而完成高级的复杂的任务;4. 流程相对易变,入口数据的不同可能导致流程的改变。5. 流程具备动态获取与使用工场的能力;因为【流程】与【工场】的相似性,所以【工场】的智能也适用于【流程】 小程决定使用【流程】来进一步完善他的设计。使用流程来看看新的设计图:加工流程行为:开工库房乙 行为:开工 储存生肉片 其他使用智能库房甲 行为:开工 储存生肉 其他使用智能库房丙1加工工场库房丁11行为:开工行为:开工行为:开工储存火腿其他使用智能储存配料其他使用智能J1其他使用智能J再来看看【加工流程】的流程:可以

12、开工了,看看【加工工场】的运转情况吧。好像一切正常。等等,库房甲储存的生肉已经用完了,【加工工场】还在运转小程悄悄地修改了【加工流程】的流程,在工人和保管员都不知道的情况下,工 场正确的停止了下来。因为小程的这次优秀表现,他甚至获得了奖金。不过小程并没有止步于此,他决定给流程增加智能,就像智能工场所表现的一样智能流程正如小程所想的那样,流程的智能与工程非常相似。 首先小程在外部预置文件中添加智能:流程的智能生肉:库房甲生肉片:库房乙火腿:库房丙配料:库房丁然后他就不需要告诉【加工流程】:去库房甲取生肉或者把火腿储藏到库房丙里, 只需要告诉【加工流程】去取生肉,他就会自觉地去找库房甲;如果产出了

13、火腿,他 也知道送到库房丙去。假如有一天要用库房乙不再储存生肉片,只需要修改一下流程的智能就搞定了, 是不是相当简单?几个月之后,小程又有麻烦了:主管要把这个“简单的仓库”连接到市里的运输 队系统,在缺少原料或者成品满仓的时候通知他们运送货物。还好,由于流程已经从对象中分离,原有的加工工场与仓库都不受影响,只需要 构建一个新的流程,用来通知运输队即可复合流程小程新建了一个【运输流程】:通过使用流程,小程发现了流程的一些特性:1. 流程有两种基本结构:顺序结构与跳转结构,顺序结构又分为单支结构与分 支结构;2. 流程总是顺序执行,除非遇到跳转,跳转后仍然顺序执行;是不是就像一道水流?他总是沿着河

14、床向前流动,遇到分叉就分流,遇到抽水泵就跳转,然后继续向前流动。而且,一个流程可以分出另一个流程,或者汇入另一个流程,于是逐渐的构成一 个复合的网状的超级流程。比如某一天,主管要把仓库连接到超市系统,或者同屠宰场联网,又或者要开几 家连锁店 小程彻底无语了 幸运的是,由于将基本的功能都放在工场中实现, 流程的变动总是很难影响到工 场,工场的改变不过是门庭若市或者门可罗雀。于是,小程又总结出一些注意事项:1. 流程可以访问工场,但不应包含工场;工场只能访问露天工场,且不应包含 流程(预置单支流程除外)。2. 工场总是尽可能的只完成基本的固定的事情,更进一步的,工场只做对的, 错的交给流程。3.

15、不管流程怎么改变,工场总是相对稳定不变。如果使用了所有的特性,工场 还是跟随流程而变,那就要考虑重新设计工场。所有这些,都是为了构筑易于伸缩、易于使用的程序。不幸言中,由于加工厂的红火,小程需要再次修改他的设计了:主管要求他实现 同城网上订购生肉片并送货上门的功能,并且总是保留至少一半的库存。网上订购该用【工场】还是【流程】呢?似乎都不太合适啊。是的,又一个新面孔浮出水面:服务。理解服务服务不总是在后台默默的运作吗?甚至很难让人感觉到他的存在。是的,但是,服务生呢?他总是站在你能一眼看到的地方,微笑地与众多不同的顾客打交道, 手脚麻利地 满足他们的各种合理需求。服务就是这样的一个存在,他站在最

16、显眼的前台,为不同的顾客提供同样的方便, 接受你的指示,并将结果回馈给你。f、服务属性:顾客的委托行为:开工 其他对外保密服务仍然与工场和流程非常相似:1. 服务位于程序的最前端,直接与客户打交道。他接受客户的数据和事件,委 派流程进行处理,并向客户显示和反馈信息。2. 服务由两部分组成:一部分负责组织界面,一部分负责组织信息。3. 服务可有若干个界面入口,但只有一个信息出口用于委派流程。4. 服务一直在变,因为需求一直在变。因为客户的需求从来不会得到完全的满足,不可避免的,服务的变化将是最频繁的,所以,服务必须采取最大度的最易成长的体系。幸好,成熟与开放的XHTML能不错的满足网上订购的需求

17、。用XHTML与CSS 来构筑界面,用FORM来组织信息,还可以加入 JAVASCRIPT为界面加入更多的充 满活力的元素。然后增加一个订购流程连接到仓库,并修改运输队的运输量终于,网上订购出炉了。现在,居民足不出户,就能选购生肉片了。等等,订购流程还得增加一辆专门用于送货的小型货车。运作了一段时间,反应相当的棒,不过也有许多新的需求,当然,界面改起来那 是相当的容易,因为他只影响自己。不过也有一些没那么好对付,比如增加一个手机 客户端,这样职场人士可以在下班的巴士上用手机选购了,到家的时候货物也差不多送到了。小程无奈的叹了口气,果然是越聪明越偷懒。继续,修改设计多面服务由于有些较旧的手机并不

18、能流程的浏览网页,所以,小程决定用JAVA做一个非常简单的手机选购界面。好消息是原有的系统基本不需要修改,坏消息是JAVA的界面组织并不像网页一样通用。也许今天用JAVA做了一个,明天还需要用 C做一个,后天又有了新的语可以预见的是,将来必定会进化出的统一的通用的界面组织语言, 他能简洁方便 的组织各种各样的界面,不管是网页的,还是客户端的,不管是JAVA的,还是C的 然而至少,现在没有。XML似乎有这个潜力,但还远远不够。XML较适合于组织结构简单的数据块, 然后界面刚好相反,数据非常简单,而结构非常复杂,很难用 XML表达得简单而又 清楚,很快你就会发现,使用与维护他的代价已经超过了原生语

19、言然而,即使使用原生语言,仍然可以设计出符合要求的服务。那就是只用来组织 界面和提交信息,不包含流程和功能。比如on Click事件应该是下面这个样子:private fu nctionon Click($co ntrol) # by PHP$data = null ;#收集需要的数据$this -assign($data);X这样,即使修改很频繁,也比较不易影响到后台。即使因为数据的改变影响了流 程,至少,你的工场不用在界面里挪来挪去了,那样甚至还可能诱发新的问题。小程发现,两个界面(手机客户端和网页)公用了一个流程,而且工作的很好。 是的,因为他们传递着同样的数据,所以也经过相同的流程与工

20、场。小程刚发现这一点,主管的新指示就到了,把火腿也放到网上去销售,当然,将 来也许还会更多这下有麻烦了,有些客户会订购生肉片,有些则订购火腿,还有的两样都要,该 怎么用一个出口实现呢?不要忘了流程的智能,如果是生肉片,就让他去找生肉片的库房,如果还有火腿, 就再跑一趟火腿的库房不就好了。小程原来无意中留下的流程的智能终于发挥了更大 的作用。那么,服务是不是也该来点智能呢?智能服务服务也需要智能。比如一个鲜花礼品店,没有人会愿意它和一个卖生肉片的仓库一样。 而且就近来 说,即使是火腿和生肉片,大家也更乐意他们有些不同。或许有些人乐意吃炒肉片却 讨厌看到火腿呢。同样的,小程继续添加服务的智能:服务

21、的智能生肉片:生肉片界面 火腿:火腿界面这样,买生肉片的人会看的自己关注的,买火腿的人也不会被生肉片干扰。 想一想,加入某天主管又要销售蔬菜和水果,只需要再增加两个界面就可以了。 当然,如果主管要卖股票,那还是赶紧从新做个服务吧,他们根本不搭调。 不过,主管的想法是,再开设一个火锅店,这样可以就近的利用仓库里的生肉片 了伴随着主管雄心勃勃的发展,小程的“简单的仓库”一步一步的发展成了一个复 杂的多功能的同时又是智能的易维护和扩展的系统。他回过头来仔细的做了下总结:服务一流程一工场结构服务一流程一工场结构有两种基本模型:我们使用的大多数程序都属于第一类模型:交互结构,比如游戏、画图等等。这 类结

22、构中客户需要引导或者反馈,它总是在服务、流程和工场之间不断的绕圈子,处 理客户的请求,并返还结果。卩4服r7流工务程场J/第二类模型:深入结构,同样非常普通,比如典型的网络传输。这类结构只需要 完成指定的任务,而不管结果如何。实际上,也没办法知道结果,只能由另一端告诉 你,接收完成了,或者文件丢失了。在这个结构中,每一个成员不仅分工不同,而且个性鲜明。工场是基石也是根本,不管过程怎样,最终必然是把任务交给工场。工场是个实 干主义者,从来不去想,而只会去做,然后给出一个结果。一个工场只做一件固定的 事情,如果把多个工场合理的组合起来,嗯,一道华丽的流水线就出现了。服务是站在最前面的服务生,他跟各

23、种各样不同的客户打交道,收集他们的信息, 接受他们的请求,并整理出一张张单子交给经理来处理并把结果反馈给客户。 服务头 脑灵活,善于交际,各种客户都乐意同他们打交道并得到满意的答复。流程是核心,他从服务那里接收单子,并认真的分析数据,从而决定采用哪个方 案最佳。流程是个事业心很强的经理,他根据已经决定的最佳方案,一步一步的交给 不同的子流程或者工场来完成,从而得到最终结果,并通知服务告知客户。典型的应用一个典型的服务一流程一工场结构的应用图例:一个服务包含若干界面(也可能没有),它们采用统一的数据单,并且只交给一 个流程(请勿对数据单使用智能,虽然那样可以同多个流程打交道,但过大于功,最 好的

24、方式是用流程同多个流程打交道,或者使用多个服务)。一个工场只做一件(或者一类)事情,除了接收任务以及从露天工场借力,他从 不与外界打交道。他只能做固定的任务,但也拥有让人意想不到的智能。一个流程可以接收多个服务,也可以访问其他流程以及任意工场。 流程掌握着令 人惊叹的关系网,他根据不同的数据作出不同的选择, 复杂的事情总能被他一步步组 织起来并最终实现。使用频度毫无疑问,服务是使用频度最高的,从进入程序开始,他就一直站在最前面,从 不休息,微笑着给你提示,并等待你的指示。虽然每个事件都要交给流程处理,但大部分时间,他还是在休息,而且即使任务 到达,也不一定经过这里。相比前两位,工程简直是度假一

25、般的日子,有些工程也许一辈子也干不了几次活 当然,也有一些倒霉的家伙总是被流程抱怨转圈转的不够快。更改频度是使用频度相似,服务也是变化得最快的。没办法,那么多客户看着呢,每个客 户都希望自己的想法得到满足,每个客户的想法又总在改变。对服务来说,生存在于 应变,不变的只有变化。流程的变化直接受到数据的影响。如果只是服务界面的变化,他根本不用理会, 只有客户的信息单而不是内容发生变化,他才需要采取相应的措施。当然,有些客户 也会提出一些新的要求,来督促他拓展新业务或者改变旧做法。对流程来说,阶段性 的发展,就是成功的秘诀。不管外面怎样风起云涌,工场这里总是风平浪静,工场做的事情总是近乎一成不 变。

26、除非这件事证明是需要改善的,或者工场要上新技术了。工场的格言是,只做正 确的事情,以不变应万变。简单的实现#流程in terfaceFlow#唯一入口public fun cti onassig n( $data);#动态调用自身方法protected fun cti oncall($eve nt, $params);#工场abstract class Work implements Flow#唯一入口abstract public functionassig n( $data);#动态调用自身方法protected fun cti oncall($eve nt, $params);#服务ab

27、stract class Service implements Flow#唯一入口abstract public functionassig n( $data);#动态调用自身方法protected fun cti oncall($eve nt, $params);#数据class Dataprivate $data = array ();public fun cti onget($key, $value) $data$key = $value;public fun cti onset($key, $value) if (isset ($data$key) return $data$key;

28、return n ull;这就像我们身处喧嚣的闹市,却在渴望山清水秀的僻静之地。心若静,何处都是水云间,都是世外桃源,都是僻静之所,心若浮躁,不管你居所何处,都难宁静。其实,很多人惧怕喧嚣,却又怕极了孤独,人实在是矛盾的载体。然而,人的最高境界,就是孤独。受得了孤独,忍得了寂寞,扛得住压力,才能成为生活的强者,才不会因为生活的暗 礁而失去对美好事物的追求。常常喜欢静坐,没有人打扰,一个人,也有一个人的宿醉。面对这喧嚣尘世,安静下来的时光,才是最贴近心底的那一抹温柔,时光如水,静静流淌。即便独自矗立夜色,不说话,也很美。这恬淡时光,忘却白日的伤感,捡起平淡,将灵魂在宁静的夜色里放空。回头看看曾经

29、走过的路,每一个脚印,都是丰富而厚重的,是对未来的希望,是对生活的虔诚。我们都是生活里的平凡之人,不管一天中多么努力,多么辛苦,老天总是会给你时不时的开个玩笑,可能有些玩笑,来的有点猛,有点不知所措,但是又怎么样呢?你要知道,人的能力和智慧是无穷的。面对生活的暗礁,我们只能用坦然的心态去接受它,然后尽量去改变它,让它激起生命的浪花。即使改变不了,只要努力了,就不言后悔。有时候,难过了,想哭就哭出来,哭又不是罪,哭完了继续努力,总有一天,时间会告诉你,你的眼泪是不会白流的。没有苦难的人生,它一定是不完美的。生命里,没有一帆风顺,总有一些看不见的暗礁等着你,既然注定要撞上,那就努力寻找岸的方向。只

30、要不放弃,一定有抵达岸边的希望,若选择放弃,那么岸依然是岸,死神只会离你越来越近。能和灾难抗衡,能珍惜生命的人,那么他的人生一定不会太灰暗。只要你不放弃自己,生 活就不会放弃你,成功的希望就会被实现。凡事成功的人,经历生活的暗礁,那是必然途径。生命路上的灾难和创伤,会让你更好的前进。行走尘世间,保持好心态,一切都有可能被改变,当别人在为你呐喊助威时,自己千万不要放弃,不要半途而废,前功尽弃。只要坚持,生命一定会被你改写。人生何其短,千万不要让过往和未来,羁绊住今天的心情,应该尊重生命,珍惜时光,活好每一天。林清玄说:“今天扫完今天的落叶,明天的树叶不会在今天掉下来,不要为明天烦恼,要努力地活在今天这一刻。”还有一句话叫,昨天的太阳晒不干今天的衣裳。假若有人问,你的一生有多长?请告诉他,只有三天,昨天,今天和明天。在这三天的生命里,昨天我们已经浪费掉了,明天不一定属于你,那你的时间就只有今天,所以不珍惜今天的 人,就不配

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论