关于复杂任务与异常处理的设计模式探讨!

04-06-04 slant
各位大侠目前我在项目中遇到了这样一个问题,
现在把我的想法提出来探讨一下:

[项目情况]
有一类复杂的任务是由A,B,C,D,E...不同子任务组成的。
它们之间具有关联性,即执行完了A后才能执行B
它们之间不具有不可重复性,即执行完了A之后不能再执行A
并且任务有多个组合,也就是说:
任务1:Task1=A+B+C+D
任务2时:Task2=B+C+D+E

还有一个情况就是Task1执行时会产生异常
比如A后产生了异常,系统将会终止Task1,
产生新任务Task1new=B+C,(因为A任务不能重做)

[我的思考]
采用Builder模式,可以解决Task1,Task2不同产品类问题。
但,当执行Task1(A)产生异常时后续任务(B+C)将会成为一个新的产品类。
如此整个系统本来只有两个产品类现在由于异常会变成数个。
有没有更好的解决方案呢?

希望得到指点,thx!

ajoo
2004-06-05 04:48
不要想pattern,直接做,随时refactor就是了。
关于你这个问题,我觉得你的描述不是很清楚,没有讲清楚问题。

比如,任务的关联性是否是个问题?是否有维护关联性的考虑?还是硬编码进去?

再比如,task1里面的失败了,你转而继续执行B,C等,那么不就是等于在每个task里面对每个子任务catch(Exception)吗?不是说必须A执行完了才能执行B?可是A失败了,怎么还继续执行B呢?所谓创建一个新的task1new,是什么意义?

子任务是否还有子任务?

等等等等。

所以现在谈pattern还太早。先把需求的matrix或者spec写出来吧。

banq
2004-06-05 10:54
我初步推定,你这是个过程性较强的流动性应用,推荐使用状态机或状态模式实现过程的总监控,这样灵活性较大,当然可以辅助以Builder模式。

状态模式是工作流之类的应用的核心、总控制室,当然你的好像不是纯工作流,但是有些特征。所以有以上建议。

slant
2004-06-05 16:30
回ajoo:
我这个项目主要是金融方面的,所以考虑的异常情况很多。
A+B+C+D这些任务相互关联(它涉及数据库、文件生成、文件加解密、文件上传等)
事实上A完成后在进入B之前或之后都是要考虑服务器断电,死机这种极端异常的。所以它们具有连贯性和不可重复性。

另外,我这个处理框想可扩展性强一些。
因为初始只考虑了一种复杂任务,现在又加入了另一种复杂任务,不知以后还会不会有新的:(


slant
2004-06-05 16:33
回板桥兄:
的确我这个项目过程性较强,类似于工作流。

《状态机或状态模式实现过程的总监控》还没有涉及过,我研究几天再来。

thx!

banq
2004-06-05 18:10
如果有研究心得,可以在这里继续讨论,达到相互促进。

youngS
2004-06-07 16:50
不明白你为什么A/B为什么不能重复。从事务的角度来看,这些应该是同一个事务,否则你的状态就很难保证一致,就像你的两个产品变成了多个产品一样。如果你这样做的原因只是为了效率的原因,我觉得你这是在冒险,因为状态不一致带来的问题更严重。

框架是管理性质的,要想为不同的任务提供相同的管理,这些任务应该具备相似的行为,也就是要求你抽象这些任务的公共行为。

ajoo
2004-06-07 23:28
关键是你对连贯性和不可重复性没有给出明确的定义。可能你脑子里面很明确你在说什么,我却是丈二和尚了。

所以我还在试图搞清楚你到底要做什么,你却已经在说什么扩展性问题了。

wy123456789
2004-06-08 17:16
对与第一个问题,我觉得你的需求可能是需要Task对A,B,C,D的动态组合
Task1=A+B+C...
Task2=C+A+E...
.
.
.
.
此时可以用Command模式,A,B,C。。。继承一个super类,实现其中的exe()方法
在Task中保存一个super类的集合,Task执行时就是遍历调用集合中元素的exe()方法,
这样Task中的任务可以有任意多种组合顺序
Task本身也可以继承super类,这样就成了宏Command,
具体可以参考 java与模式

猜你喜欢