在工作代码中,我们有很多魔术字符串的用法,如下面的代码片段:
if (user.HasRight("Profile.View")) {...}
所以有很多地方我们通过一个字符串作为参数来查看用户是否有特定的权限。我不喜欢这样,因为这会产生很多魔术字符串。
有什么更好的方法呢?
枚举、常量、类?
在工作代码中,我们有很多魔术字符串的用法,如下面的代码片段:
if (user.HasRight("Profile.View")) {...}
所以有很多地方我们通过一个字符串作为参数来查看用户是否有特定的权限。我不喜欢这样,因为这会产生很多魔术字符串。
有什么更好的方法呢?
枚举、常量、类?
在这种特定情况下,请使用枚举。不会有魔术字符串,如果 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"); } }
}
这会将您的“魔术字符串”保留在代码中的一个位置。枚举也可以,但在我看来不那么可读。
注意:我的示例旨在充当登录用户的属性代理,因此是静态类。如果您想要一些可以处理更直接的数据(例如,用户列表)的东西,那么这种类型的类需要是非静态的,并且需要在每个用户帐户的基础上进行实例化。
您可以在 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)
{
}