一组对象及其状态的修改和回滚方法

时间:2011-06-14 09:38:04

标签: oop architecture state rollback

在我写的系统中,我有包和服务对象的概念。

Package Service Relationship

包是服务集合的容器,具有一组固有的可配置限制。这些限制包括:

  • 支持哪种类型的服务
  • 可以分配给包的服务数
  • 需要在所述服务中设置为特定值的属性

需要能够在兼容软件包之间升级和降级。通过这样做,需要传输,修改和可能创建或删除包中的服务,以满足新包的约束。

这需要在采取任何资金以确保将某些独特资源分配给服务(以及围栏)之前完成。

如果付款失败并取消升级,则会出现问题 - 我们如何回滚修改并返回到先前的状态?

可能出现以下(非详尽的)问题清单:

  • 通过删除不再与新软件包兼容的服务,可以释放唯一约束,然后由其他软件包(在其他帐户等中)使用,可以停止回滚
  • 删除的服务很难通过完整的引用来恢复
  • 如果未删除服务,它们将继续使用可能需要由其他类似服务使用的唯一约束

目前处理此方法的方法是通过特定于程序包的一组步骤来存储对象(而不是删除它们),并保留一个步骤列表,以便在回滚时恢复状态。但是,这是基于每个案例完成的,容易出错并且感觉很笨拙。

我想知道你们中是否有人遇到类似的东西,并且知道可以在这里使用的模式或方法。基本上我们需要能够更新一组对象的状态,提交更改,但可以选择回滚到以前的版本。注意:在系统内,可以序列化和存储对象的状态。

任何“我不会那样做!”感激地收到评论。

以下是一个例子:

升级前:

Package configuration before upgrade

升级后:

Package configuration after upgrade

1 个答案:

答案 0 :(得分:1)

完成类似的事情,但是很快。

为了执行“撤消”/“回滚”,您需要做一些事情:

[1]在执行操作之前,存储/注册/序列化给定对象的值(“Package”和“Service”(s))。

如果操作成功,则可以放弃该信息,或者仅将其存储为历史数据。否则,使用它将对象返回到先前的状态。

您可能还想注册新的更改。

[2]你必须注册一个可以由你的应用程序完成的菜单或操作集合, 并最终回滚。

+----------------+            +------------------+
|................|            |..................|
|................|            |..................|
|.......App......|/\          |.....Operation....|
|................|  ----------|..................|
|................|\/          |..................|
+----------------+   1      * +------------------+

例如,如果不是“package-and-services”应用程序,那么您可以在哪里进行Paint程序。

在您的应用程序中,您将拥有一系列操作或操作,其中一个操作是“Paint filled square”。

[3]每次执行其中一个操作时,即使是重复操作,也可以使用每个操作的注册或日志来完成或回滚。

+----------------+            +------------------+
|................|            |..................|
|................|            |..................|/\   1
|.......App......|/\          |....Operation.....|  --------+
|................|  ----------|..................|\/        |
|................|\/          |..................|          |
+----------------+   1      * +------------------+          |
         /\                                                 |
         \/                                                 |
         |                    +------------------+          |
      1  |                    |..................|          |
         +--------------------|..................|          |
                          *   |.......Log........|----------+
                              |..................|    * (The same operation can be 
                              |..................|       registered in the log,
                              +------------------+       several times)

当你执行Paint app时,你会多次使用“paint filled squared”。

[4]您需要在列表中执行相反的操作,以恢复匹配的操作。

+----------------+            +------------------+
|................|            |..................|-------+ 1
|................|            |..................|       |
|.......App......|/\          |.....Operation....|       |
|................|  ----------|..................|-------+ 1  
|................|\/          |..................|
+----------------+   1      * +------------------+

使用上一个Paint应用程序。例如,你应该有一个“恢复填充平方”操作,离开该区域,就像用户绘制填充平方之前一样。

不关心它是如何完成的,关心应该有匹配的。

[5]匹配的相反操作也必须在日志中注册。