Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oop 一组对象及其状态的修改和回滚方法_Oop_Architecture_State_Rollback - Fatal编程技术网

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

Oop 一组对象及其状态的修改和回滚方法,oop,architecture,state,rollback,Oop,Architecture,State,Rollback,在我正在编写的系统中,我有包和服务对象的概念 包是服务集合的容器,具有一组内在的可配置限制。这些限制包括: 支持哪些类型的服务 可以分配给包的服务数 所述服务中需要设置为特定值的属性 需要能够在兼容软件包之间进行升级和降级。通过这样做,包中的服务需要被传输、修改并可能被创建或删除,以满足新包的约束 这需要在获得任何资金之前完成,以确保将某些独特的资源分配给服务(并进行隔离) 如果支付失败,升级被取消,问题就来了——我们如何回滚修改并返回到以前的状态 可能出现以下(非详尽)问题清单: 通过

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

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

  • 支持哪些类型的服务
  • 可以分配给包的服务数
  • 所述服务中需要设置为特定值的属性
需要能够在兼容软件包之间进行升级和降级。通过这样做,包中的服务需要被传输、修改并可能被创建或删除,以满足新包的约束

这需要在获得任何资金之前完成,以确保将某些独特的资源分配给服务(并进行隔离)

如果支付失败,升级被取消,问题就来了——我们如何回滚修改并返回到以前的状态

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

  • 通过删除不再与新包兼容的服务,可以释放唯一的约束,然后由其他包(在其他帐户中等)使用,从而停止回滚
  • 删除的服务很难在引用完整的情况下恢复
  • 如果不删除服务,它们将继续使用其他类似服务可能需要使用的唯一约束
目前处理这种情况的方法是通过一组特定于包的步骤来存储对象(而不是删除它们),并保留一个步骤列表,以便在回滚时恢复状态。然而,这是在个案的基础上完成的,容易出错,而且感觉笨重

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

任何“我不会那样做!”的评论都会被其他人感激地接受

以下是一个例子:

升级前:

升级后:


做了类似的事情,但速度非常快

要执行“撤消”/“回滚”,您需要执行以下操作:

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

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

您可能还想注册新的更改

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

+----------------+ +------------------+ |................| |..................| |................| |..................| |.......App......|/\ |.....Operation....| |................| ----------|..................| |................|\/ |..................| +----------------+ 1 * +------------------+ +----------------+ +------------------+ |................| |..................| |................| |..................|/\ 1 |.......App......|/\ |....Operation.....| --------+ |................| ----------|..................|\/ | |................|\/ |..................| | +----------------+ 1 * +------------------+ | /\ | \/ | | +------------------+ | 1 | |..................| | +--------------------|..................| | * |.......Log........|----------+ |..................| * (The same operation can be |..................| registered in the log, +------------------+ several times) +----------------+ +------------------+ |................| |..................| |................| |..................| |……应用程序……|/\\|…………操作| |................| ----------|..................| |................|\/ |..................| +----------------+ 1 * +------------------+ 例如,如果您不使用“包和服务”应用程序,而是在哪里执行绘制程序

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

[3] 每次执行其中一个操作时,即使是重复的操作,也会有一个可以执行或回滚的每个操作的寄存器或日志

+----------------+ +------------------+ |................| |..................| |................| |..................| |.......App......|/\ |.....Operation....| |................| ----------|..................| |................|\/ |..................| +----------------+ 1 * +------------------+ +----------------+ +------------------+ |................| |..................| |................| |..................|/\ 1 |.......App......|/\ |....Operation.....| --------+ |................| ----------|..................|\/ | |................|\/ |..................| | +----------------+ 1 * +------------------+ | /\ | \/ | | +------------------+ | 1 | |..................| | +--------------------|..................| | * |.......Log........|----------+ |..................| * (The same operation can be |..................| registered in the log, +------------------+ several times) +----------------+ +------------------+ |................| |..................| |................| |..................|/\ 1 |…应用程序…|/\ |……操作…|--------+ |................| ----------|..................|\/ | |................|\/ |..................| | +----------------+ 1 * +------------------+ | /\ | \/ | | +------------------+ | 1 | |..................| | +--------------------|..................| | *|…….日志|----------+ |………|*(可以执行相同的操作 |登记在日志中, +------------------+(几次) 当您执行绘制应用程序时,您会多次使用“绘制填充的正方形”

[4] 在列表中,您需要一个相反的操作来恢复匹配的操作

+----------------+ +------------------+ |................| |..................|-------+ 1 |................| |..................| | |.......App......|/\ |.....Operation....| | |................| ----------|..................|-------+ 1 |................|\/ |..................| +----------------+ 1 * +------------------+ +----------------+ +------------------+ |................| |..................|-------+ 1 |................| |..................| | |……应用程序……|/\ |…………操作| |................| ----------|..................|-------+ 1 |................|\/ |..................| +----------------+ 1 * +------------------+ 使用以前的绘画应用程序。例如,您应该有一个“restore filled squared”操作,该操作将离开该区域,就像用户绘制填充的squared之前一样

不要在意它是如何完成的,要在意应该有一个匹配的

+----------------+ +------------------+ |................| |..................|-------+ 1 |................| |..................| | |.......App......|/\ |.....Operation....| | |................| ----------|..................|-------+ 1 |................|\/ |..................| +----------------+ 1 * +------------------+
[5] 匹配的反向操作也必须在日志中注册。

感谢您的帮助umlcat。这并不能直接映射到我正在做的事情,但它给了我思考的空间。