特定の動作を拡張する必要がある状況があり、それを正しく設計する方法に行き詰まっています。ユーザーはすべてのレポートのリストを表示できます。レポートは今のところ単純な POJO です
class Report {
...
}
特定のレポートで呼び出すことができる一連のアクションがあります。現在、一部のレポートでは、許可されるアクションを定義する必要があるという要件があります。たとえば、ReportOne では "ActionA" と "ActionB" を実行し、ReportTwo では "ActionB" のみを実行し、ReportThree では (現在のように) すべてのアクションを実行できます。また、レポートの表示は制限されているため、十分な権限がない場合、一部のユーザーは特定のレポートを表示できません。
以下のような Report のサブクラスを作成することを考えています。
class ReportWithCustomActionsAllowed extends Report {
private Set<Action> allowedActions;
public Set<Actions> getAllowedActions() {
return actions;
}
....
}
class ReportWithPermission extends Report {
...
private String permissionName = "ReportA.VIEW";
public boolean canShowTo(User user) {
return user.hasPermission(permissionName);
}
}
ここで間違っていることが2つあります。
1) 別のクラスを作成しない限り、許可されたカスタム アクションを使用して制限付きレポートを作成することはできません。
2)Set<Report>
ハッキングせずにアクション/レポートを制限することはできませんが、instanceof
これは明らかに間違っています。
OOPを正しく実行してこの要件を実現するにはどうすればよいですか? すべてのレポートでパーミッションを気にする必要はありません。レポートには、許可されたアクションのリストが空である可能性があります (これは、アクションに誰もアクセスできないことを意味します。すべてのアクションが許可されているわけではありません)。