1 | 大抵は現実的ではないが一番分かりやすいのは、EntryがAccountに挿入された時は常に、Posting Ruleは即座に適用され、全ての更新が即座に実行される事 |
2 | あるポイントで、Accountにメッセージが送られた時にPosting Rulesが適用され、最後に挿入から未処理分に対して、Entriesの挿入が実行される。 |
3 | 外部エージェントの命令によってPosting Rulesが実行される。 Posting Ruleは最後の実行から全ての未処理分を探し、挿入を行う責務がある。 |
課題: バッチスクリプトの中で暗黙的に行われるドメインロジックがあるが、だんだん複雑になってきた。
対応: バッチスクリプト自身をドメイン層から切り離し、単純レイヤとする事をmodel-driven-designで試みた。
結果:
オブジェクトとして意味を成していない、単なる手続きに成り下がってしまった為、ドメインモデルがどのようなものであるか理解できないものになってしまった。
そこで、アナリシスパターンの「Posting Rules」を読んで図11.9を閃いた。
(実行モード2のパターン)
サービスとして会計アプリケーションの機能にアクセスするFacede(Developer2)
(バッチを単純にしようとして思いついたものだが、レガシーシステムにINTENTION-REVEALING INTERFACEを与えるものとなった。)
利子の発生の時点で、バッチに挿入を依頼する為に、実行モード1を考えているが、それでは一日中、支払いが発生してしまう。(Developer2)
計算メソッドの中でバッチを呼び出すような、強い結びつきは回避したいが、異なるタイミングで挿入を行うとしても、処理が煩雑になってしまい、コンセプトに反する。
Posting-Ruleありきになっているように思えるので、バッチが実行タイミングをPosting-Ruleに教え、Posting-Ruleが処理に相応しい新しいEntriesを探し出させてはどうか?(Developer1)
ファウラー本ではAccountとPosting-Ruleが直接結びついている。それは論理的なのだが、今回の要件(AccountとEntriesをデータから毎回、生成しなければいけない)に対しては、そのまま適用しても上手く機能しない。
AccountとPosting-Ruleを結びつけるために、どういった制約を適用すべきかを考えねばならないが、これは、個々の口座の中身を知っているAssetオブジェクトが妥当だろう。(Developer2)
Methodは、金額の内訳も示すべき(例:収入に対して20%の税金がかかっている事を知らせる)
総勘定元帳の名前に一致するPosting-Ruleならば、どの勘定口座に記帳すべきかを知っているだろう。(Developer1)
そういう事ならば、恐らくMethodオブジェクトは必要ない(Developer2) 全体のビジネスの中で、毎回に正しい総勘定元帳を特定するのは、複雑になってくるし、収入の種類は資産クラス(ビジネスが個々の資産に適用するカテゴリ)で知る事ができる。
これまでの議論を反映。
AssetはAccountの性質(利子や支払い)を知っており、かつバッチにとっては自然な窓口なので、Assetを通してPosting-RuleとAccountを結びつける事にしたのだが、やっぱり
方が良い。これに関しては、今後のリファクタリングや、Deeper insight で解決していきたいらしい。
会計パターンより抜粋
Posting Rule | Determins what accounting entries to make in response to an event (イベントに対するレスポンスとして、account entriesが何を行うべきかを決定する事) |
get(assetClass)から何故、総勘定元帳名を取得する必要があるのか?’Posting-Ruleが既に知っているのでは?
p306 L8の「SINGLETON」って何をさしている?