アプリケーションモデルを論理部分「データ」、「コマンド」、「エンジン」で分割したいと思います。アプリケーションの外部にいるすべての人は、データへの読み取り専用アクセスとコマンドへのアクセスを取得する必要があります。これらのコマンドを使用して、データを操作できます。
このうち、私は自分のアプリケーションをパッケージにまとめました。
myapp.model.data
myapp.model.commands
myapp.model.engines
エンジンとコマンドの両方に、データへの書き込みアクセスが必要です。したがって、パブリックインターフェイスの形式で書き込みアクセスを公開する必要があります。これにより、外部クライアントも私のデータへの書き込みアクセス権を持っているという問題が発生しますが、これは許可されません。これに伴う問題は、コマンドがイベントを使用してエンジンを呼び出し、データの整合性をチェックすることです。クライアントはエンジンを呼び出さずにデータを操作するため、データの一貫性が失われます。
この問題の一般的な慣習はありますか?今すぐアプリケーションを作成したいので、Java8まで待たなければならないことを提案しないでください。アプリケーションの概要が失われるため、すべてのクラスを1つのパッケージに入れることもできません。
編集
木やグラフの不変性についていくつかのサイトを読みました。私はジッパーと呼ばれる素晴らしいアイデアを見てきました:http ://scienceblogs.com/goodmath/2010/01/13/zippers-making-functional-upda/ 。残念ながら、これは私の場合はうまくいかないようです。
思い出してください、私は時間の経過とともに操作される複雑なオブジェクトグラフ構造を持っています。目標は、クライアントが私のコマンドだけでデータを操作するように制限することでした。したがって、私の場合、不変性の利点はわかりません。
このために、データクラスに2つのパブリックインターフェイスを読み取り専用と書き込み可能にします。クライアントが読み取り専用インスタンスでコマンドを呼び出すときはいつでも、書き込み可能インスタンスにキャストする必要があります。このアプローチは私の問題を解決しますが、2つの大きな欠点があります。まず、すべての読み取り専用インスタンスが同時に書き込み可能なインスタンスであると想定します。これにより、いくつかの醜いバグが発生する可能性があります。次に、クライアントは同じことを行い、書き込みアクセス権を持つことができます。しかし、私が言うことができるよりも、彼ら自身のせいです。
誰かより良いアイデアがありますか?