0

単純なオブジェクトの場合、通常、文字列でデータベースに格納可能な「状態」属性を持つのは簡単です。たとえば、User クラスを想像してみてください。非アクティブ、未検証、およびアクティブの状態である可能性があります。これは、「アクティブ」と「検証済み」の 2 つのブール値で追跡できますが、単純なステート マシンを使用して、現在の状態をその「状態」属性に保存しながら、非アクティブから未検証、アクティブに遷移することもできます。非常に一般的ですよね?

ただし、さらにいくつかのブール属性を持ち、さらに重要なことに、それらの多くの組み合わせを持つことができるクラスを想像してみてください。たとえば、壊れている、欠落している、非アクティブ化されている、古くなっている可能性があるモノなどです。現在、単一の「状態」属性で状態を追跡することはより困難になっています。これは、おそらく、非決定性有限オートマトンまたはステート マシンです。「inactive_broken」や「active_missing_outdated」などの状態を保存したくありません。

私が思いついた最善の方法は、「状態」属性を持ち、ある種のスーパーステート (この場合は「利用可能」と「利用不可」)それぞれのブール値を格納することです。そうすれば、移行時にガードのような方法を使用できます。

他の誰かがこの問題に遭遇し、状態を追跡するための良い解決策を思いつきましたか?

4

3 に答える 3

1

「状態」をビットマスクにシリアル化し、データベースの整数列に格納することを検討しましたか?エンティティがアクティブまたは非アクティブ、使用可能または使用不可、または動作中または破損している可能性があるとしましょう。

各状態をビットとして保存できます。オンまたはオフのいずれか。このように、111の値はアクティブで、使用可能で、機能しますが、000の値は、非アクティブで、使用できず、壊れています。

次に、適切なビットマスクを使用して特定の組み合わせを照会するか、追跡する各状態のブール値を持つクラスにエンティティを逆シリアル化できます。また、オブジェクトに状態を追加することは比較的安価であり、すでにシリアル化されたオブジェクトを壊すことはありません。

于 2012-04-05T21:12:14.637 に答える