作業中のコードでは、次のコード スニペットのようにマジック ストリングが多く使用されています。
if (user.HasRight("Profile.View")) {...}
そのため、ユーザーが特定の権限を持っているかどうかを確認するために、パラメーターとして文字列を渡す場所がたくさんあります。それは多くの魔法の文字列を生成するので、私はそれが好きではありません.
それを行うより良い方法は何ですか?
列挙型、定数、クラス ?
作業中のコードでは、次のコード スニペットのようにマジック ストリングが多く使用されています。
if (user.HasRight("Profile.View")) {...}
そのため、ユーザーが特定の権限を持っているかどうかを確認するために、パラメーターとして文字列を渡す場所がたくさんあります。それは多くの魔法の文字列を生成するので、私はそれが好きではありません.
それを行うより良い方法は何ですか?
列挙型、定数、クラス ?
その特定のケースでは、Enum を使用します。マジック ストリングはなく、Enum が変更された場合 (マジック ストリング ソリューションを壊すような方法で)、アプリはコンパイルされなくなります。
public enum ProfilePermissions
{
View,
Create,
Edit,
Delete
}
次に、単純に次のことができます。
if(user.HasRight(ProfilePermissions.View)) { }
クラスを使用することもできますが、より複雑なシナリオになると、自分自身を制限することになります。たとえば、列挙型を次のように単純に変更します。
public enum ProfilePermissions
{
View = 1,
Create = 2,
Edit = 4,
Delete = 8
}
より複雑なアクセス許可にビット単位の演算子を使用できるようにします (たとえば、ユーザーが作成または削除のいずれかを必要とする状況)。
if(user.HasRight(ProfilePermissions.Create | ProfilePermissions.Delete));
これは、.NET フレームワークでも十分に一般的です。例としては、System.Windows.DataFormats と System.Net.WebRequestMethods.Http があります。読み取り専用の種類が必要です:
public static class MumbleRights {
public static readonly string ProfileView = "Profile.View";
// etc..
}
拡張方法!すべての魔法の文字列を追跡するために、それらを同じ場所に保管してください。
public static class UserRightsExtensions {
public static bool CanReadProfile(this User user)
{
return user.HasRight("Profile.View");
}
// etc..
}
次に、次のことができます。
if (user.CanReadProfile()) .....
次のように、これらのプロパティを厳密に型指定するクラスを作成します
public static class UserInfo
{
public static bool CanViewProfile { get { return User.HasRight("Profile.View"); } }
}
これにより、「魔法の文字列」がコード内の 1 か所に保持されます。列挙型も機能しますが、私の意見では読みにくいです。
注: 私の例は、ログインしているユーザー、つまり静的クラスのプロパティ プロキシとして機能することを目的としています。より直接的なデータ (たとえば、ユーザーのリスト) で機能するものが必要な場合は、このタイプのクラスを静的でなく、ユーザー アカウントごとにインスタンス化する必要があります。
C# で定数文字列を実行できます。
次のように、ヘッダー内のすべての文字列を定義できます。
const string PROFILE_VIEW "Profile.View";
これが「最善の」方法であるかどうかはわかりませんが、コードに魔法の値を含めるよりは確実に優れています。
私は「ジャスティン・ニースナー」が示した道に二番目です。しかし、場合によっては、次のようなコード構成を書きたいと思うこともあります。
public class User
{
public Permission Permission { get; set; }
}
public abstract class Permission
{
}
public class ViewPermission:Permission
{
}
そして、あなたはそれを次のように消費することができます
User user=new User();
if(user.Permission is ViewPermission)
{
}