本当に問題ない...
に問題はありませんUser.isAdmin()
。私は確かにのようなものよりもそれを好む。それPermissionManager.userHasPermission(user, permissions.ADMIN)
はSRPの神聖な名前でコードをより明確にせず、価値のあるものを追加しない。
私は、SRPが文字通りに少し解釈されていると思う。クラスにリッチなインターフェースを持たせることは望ましいことです。SRPは、オブジェクトが単一の責任に該当しないものはすべて、共同作業者に委任する必要があることを意味します。ユーザーの管理者ロールがブール型フィールドよりも複雑なものである場合、ユーザーオブジェクトがPermissionsManagerに委任することは非常に適切です。しかし、それは、ユーザーがisAdmin
メソッドを保持することも良い考えではないという意味ではありません。実際、アプリケーションが単純なものから複雑なものへと変化する場合、ユーザーオブジェクトを使用するコードを変更する必要があることを意味します。IOW、クライアントはユーザーが管理者であるかどうかの質問に答えるために本当に必要なことを知る必要はありません。
...しかし、なぜあなたは本当に知りたいのですか?
とはいえ、ユーザーがウィジェットの更新など、特定のアクションの実行を許可されているかどうかなど、他の質問に答えることができる以外は、ユーザーが管理者であるかどうかを知る必要はほとんどないようです。その場合、次のようなウィジェットのメソッドを使用したいと思いisUpdatableBy(User user)
ます。
boolean isUpdatableBy(User user) {
return user.isAdmin();
}
このように、ウィジェットは、ユーザーが更新するためにどの条件を満たす必要があるかを知る責任があり、ユーザーはそれが管理者であるかどうかを知る責任があります。この設計は、その意図を明確に伝え、その時が来たときに、より複雑なビジネスロジックに簡単に移行できるようにします。
[編集]
持っていないことUser.isAdmin()
と使用していることの問題PermissionManager.userHasPermission(...)
ユーザーが管理者(または管理者ロール)であるかどうかを知りたい場合、PermissionManagerオブジェクトのメソッドを呼び出すよりもUserオブジェクトのメソッドを呼び出すことを非常に好む理由を説明するために答えに追加しようと思いました。
このユーザーが管理者であるかどうかを質問する必要がある場合は、常にUserクラスに依存すると仮定するのは公平だと思います。それはあなたが取り除くことができない依存関係です。しかし、ユーザーを別のオブジェクトに渡して質問する必要がある場合、ユーザーに既にあるオブジェクトの上にそのオブジェクトへの新しい依存関係が作成されます。質問が頻繁に聞かれる場合、それは余分な依存関係を作成する多くの場所であり、依存関係のいずれかがそれを要求する場合、変更する必要がある多くの場所です。
これを、依存関係をUserクラスに移動することと比較してください。これで、突然、クライアントコード(質問をする必要があるコードはこのユーザーadminです)が、この質問への回答方法の実装と連動していないシステムができました。許可システムは完全に自由に変更できます。変更するには、1つのクラスの1つのメソッドのみを更新する必要があります。すべてのクライアントコードは同じままです。
isAdmin
パーミッションサブシステムのUserクラスに依存関係を作成することを恐れて、Userにメソッドを持たないことを主張することは、1ドルをかけて1ドルを稼ぐことに似ています。確かに、Userクラスでは1つの依存関係を回避しますが、質問をする必要があるすべての場所で1つの依存関係を作成するというコストがかかります。お買い得ではありません。