事後条件は、アプリケーション (または抽象化のレベルに応じてオブジェクト) の状態が、操作が成功したと見なされるためにどのような状態になるべきかを定義します。たとえば、readEmployee操作の場合、事後条件は次のようになります。
- 新しい
Employeeインスタンスが作成されます。
Employeeインスタンスには、データベース値と一致する属性が含まれています。
- データベース接続が閉じられています。
「事前条件」と「事後条件」は、それぞれ操作が実行される前後のアプリケーションの「心の状態」と考えるのが好きです。ご想像のとおり、DbC を実行するときは、コーディングの演習というよりは思考プロセスです。
(単体テストを行う場合、状態によって、テストでカバーする必要があるものが明確になります。基本的に、アプリケーションの「心の状態」をテストすることになります。)
興味深いことに、DbC の逆を考えると、アプリケーション (またはオブジェクト) が公開する必要がある操作を特定するには、アプリケーションが取り得る状態と、これらの状態間でどのように遷移するかをリストするだけの問題であることがわかります。これらの遷移を行うために実行する必要があるアクションは、操作になります。目的の状態に至らない操作をわざわざ実装する必要はありません。したがって、たとえば、アプリケーションに次の状態が必要になる可能性があります。
- 従業員の詳細が追加されました (S1)
- 従業員の詳細が読み込まれました (S2)
- 従業員の詳細が更新されました (S3)
- 従業員の詳細が削除されました (S4)
以下の状態遷移が可能です。
- S1 -> S3 (新しい従業員の追加、詳細の更新)
- S1 -> S4 (新しい従業員の追加、従業員の削除)
- S2 -> S3 (従業員の詳細を読み込み、従業員の詳細を更新)
- S2 -> S4 (従業員の詳細を読み込み、従業員を削除)
- S4 -> S1 (従業員の削除、新しい従業員の追加)
- S2 -> S1 (従業員の詳細を読み込み、新しい従業員を追加)
- S3 -> S1 (従業員の詳細の更新、新しい従業員の追加)
- S3 -> S2 (従業員の詳細の更新、従業員の詳細の読み込み)
上記に基づいて、有効な遷移のみが許可され、それ以外はエラーを引き起こすような方法で操作を記述することができます。
不可能な状態遷移:
- S4 -> S2 (従業員を削除してから詳細をロードすることはできません)
- S4 -> S3 (従業員を削除してから詳細を更新することはできません)
ステート モデリングは、おそらくオブジェクトの設計において最も重要な部分です。状態モデリングに関する優れたリソースが必要な場合は、Sally Shlaer / Stephen Mellorの Object Lifecycles Modeling the World in Statesを入手してください。これはかなり古い本であり、Amazon での価格はほとんどありませんが、この本で紹介されている原則は最新の UML の基礎を形成しています。
データベースの状態については触れていませんが、概念レベルでは、データベース層は状態の別のシステムであり、同じ原則が適用されます。
これがお役に立てば幸いです。