私は所有権/アクセス許可モデルをTaskList
ドメインオブジェクトにエンコードしません。そのようなビジネスロジックは外部にあるべきです。私はプロキシオブジェクトのアイデアも気に入らない。確かに動作しますが、デバッグが混乱し、少なくともこの場合は不必要に複雑になります。私はコントローラでもチェックしません。
代わりにTaskList
のアクセス許可を監督するビジネスロジックオブジェクトを作成します。だから、TaskList
は、所有者フィールドを持っているでしょうが、あなたのようなものだろう:あなたは、あなたが作成する唯一のものであるファクトリクラスを作成することができTaskList
オブジェクト上のすべての操作は、アクセサを通過することを要求する必要がある場合は
public class TaskListAccessor {
private TaskList taskList;
private User reader;
public void updateStatus(Status status) {
// everyone can do this
taskList.updateStatus(status);
}
/** Return true if delete operation is allowed else false */
public boolean isDeleteAllowed() {
return taskList.getOwner().equals(reader);
}
/** Delete the task. Only owners can do this. Returns true if worked else false */
public boolean delete() {
if (isDeleteAllowed()) {
taskList.delete();
return true;
} else {
return false;
}
}
// ... other accessors with other is*Allowed methods
}
をパッケージコンストラクタなどを使用してTaskList
DAOを使用してデータストアからTaskList
を検索する唯一の工場が工場かもしれません。
しかし、このように制御するメソッドが多すぎると、プロキシが簡単になる可能性があります。両方のケースでは、TaskList
を持つことが推奨されます。実装クラスはプロキシまたはアクセサーによって隠されています。