スナップショット

ある時点でのオブジェクトのビュー

2004年3月7日

これは Enterprise Application Architecture (EAA) のさらなる開発 の一部であり、2000年代半ばに執筆しました。残念なことに、それ以降他の多くのものが私の注意を引いたので、それらをさらに進める時間がありませんでしたし、今後すぐにその時間が見つかるとも思えません。そのようなわけで、この資料は非常にドラフトの形式であり、作業を再開できる時間を見つけるまでは修正や更新は行いません。

仕組み

スナップショットは、時間的な側面をすべて削除したオブジェクトのビューにすぎません。つまり、完全な時制オブジェクトにgetAddress(date)形式のアクセサがある場合、スナップショットにはgetAddress()アクセサがあります。スナップショットのすべての質問は時制ではありません。

スナップショットを作成するときは、適切な日付を指定する必要があります。2時制が存在する場合は、実際の日付と記録の日付の両方が必要です。

スナップショットはアクセスを容易にするためのビューであるため、ほとんどの場合、不変である必要があります。ただし、スナップショットを更新してから、ある日付の時点ですぐにリアルオブジェクトに適用し直す場合は例外です。私はこれを頻繁に行うことはなく、通常は時制を認識していない外部システムと連携する場合にのみ行います。

使用時

時制は設計に多くの複雑さを加えますが、それを考慮したくない場合があります。特定のタイムポイントに関してかなりの作業を行いたいコンテキストにいる可能性があり、タイムポイントをシステムに繰り返し通知したくない場合があります。または、時制を理解していないシステムにリンクしている可能性もあります。その場合は、そのシステムで使用するスナップショットを取ることができます。

追加資料

アンディ・カールソンと plopの論文でコラボレーションしているときに、このパターンが私に明らかになりました。

例: スナップショットの実装 (Java)

スナップショットをまとめるのは本当に非常に簡単です。鍵は委譲を使用することで、スナップショットが基になるオブジェクトのアダプターとして機能することです。

図1: 委譲を使用したスナップショットの実装

class Customer...

  private TemporalCollection addresses = new SingleTemporalCollection();
  public Address getAddress(MfDate date) {
    return (Address) addresses.get(date);
  }
  public Address getAddress() {
    return getAddress(MfDate.today());
  }
  public void putAddress(MfDate date, Address value) {
    addresses.put(date, value);
  }

class CustomerSnapshot...

  private Customer base;
  private MfDate validDate;
  public CustomerSnapshot (Customer base, MfDate validDate) {
    this.base = base;
    this.validDate = validDate;
  }
  public Address getAddress() {
    return base.getAddress(validDate);
  }

この場合は、CustomerSnapshotにcustomerと実際の日にちを指定してコンストラクタを呼び出すことでスナップショットを作成することに注意してください。また、CustomerにcreateSnapshot(Date)メソッドを呼び出しても行うことができます。コンストラクタを使用すると、Customerとそのスナップショットとの依存を避けることができます。