在工作代码中,我们对魔术字符串有很多用法,如下面的代码片段:
if (user.HasRight("Profile.View")) {...}
因此,有很多地方我们将字符串作为参数传递,以查看用户是否具有特定权限。我不喜欢这样,因为它产生了很多神奇的字符串。
这样做的更好方法是什么?
Enum,Constant,class?
答案 0 :(得分:17)
在该特定情况下,使用枚举。没有魔法字符串,如果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));
答案 1 :(得分:8)
这在.NET框架中也很常见。示例是System.Windows.DataFormats和System.Net.WebRequestMethods.Http。你想要的只读:
public static class MumbleRights {
public static readonly string ProfileView = "Profile.View";
// etc..
}
答案 2 :(得分:3)
扩展方法!将它们放在同一个地方以跟踪所有魔法弦。
public static class UserRightsExtensions {
public static bool CanReadProfile(this User user)
{
return user.HasRight("Profile.View");
}
// etc..
}
然后你可以:
if (user.CanReadProfile()) .....
答案 3 :(得分:1)
创建一个强类型的类,如
public static class UserInfo
{
public static bool CanViewProfile { get { return User.HasRight("Profile.View"); } }
}
这会将您的“神奇字符串”保存在代码中的一个位置。枚举也会起作用,但在我看来并不那么可读。
注意:我的示例旨在充当登录用户的属性代理,因此是静态类。如果您想要一些可以处理更直接数据的东西(比如用户列表),那么这种类型的类需要是非静态的,并且基于每个用户的帐户进行实例化。
答案 4 :(得分:0)
您可以在C#中执行常量字符串。
您可以在标题中定义所有字符串,如下所示:
const string PROFILE_VIEW "Profile.View";
不确定这是否是“最佳”方式,但它肯定比在代码中具有魔术值更好。
答案 5 :(得分:0)
我是“Justin Niessner”所示的第二种方式。但在某些情况下,我更愿意编写以下代码构造。
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)
{
}