状态机:在数据库初始保存之前进行验证?

时间:2014-10-13 11:51:48

标签: validation design-patterns state-machine

这是关于状态机的一般问题,我不需要实际实施方面的帮助。想象一下状态机正式化一个简单的错误报告,从开始到最终消亡。该错误可能会跨越诸如" NEW"," CONFIRMED","已解决","已重新"以及"已关闭等状态#34 ;.除了每个状态转换之外,还有一些附带的验证代码,例如,可以确保在从NEW移动到CONFIRMED时我们已经记录了谁确认了它。

我的问题与初始状态有关 - 当bug只是" NEW"。很容易说初始验证不是状态机的一部分(例如,确保错误实际上有一些描述,例如,在使用状态" NEW"在数据库中保存之前) 。但也不是一个状态转换,来自"刚创建"到"新"?难道不应该像任何其他过渡一样验证过渡吗?将初始验证与所有其他验证分开是不是人为的和次优的?

另一方面,如果我们确实创造了一个"假的"初始状态(例如," CREATED"),以及它们各自的过渡("创建" - >"新"),然后当转换不是&时会发生什么? #39; t验证?如果它经过验证,那就很好 - 我们切换状态,然后用数据库中的新状态(实际上称为" NEW" here)保存对象。但是如果它没有验证那么我们显然不想将它保存在数据库中,并且由于没有初始状态和最终状态而破坏状态机模式(我们将有一个初始状态,虽然是假的 - "创建" - 但是有两个最终状态 - " CLOSED""删除")。不仅如此,还有#34; DELETED" state也是假的,因为永远不会有任何具有该状态的持久对象(就像永远不会有任何具有状态的持久对象" CREATED")。

你如何处理这个问题?

1 个答案:

答案 0 :(得分:0)

好的,经过进一步调查后,模式看起来确实解决了我自己的问题:在某些(大多数?)状态机模型中,实际上有initial transaction 结束 初始状态。因此,就实际代码而言,实际上存在“假的”初始状态,但该状态不能被视为状态机中的真实状态。