В коде на работе у нас есть много использования волшебных строк как следующий фрагмент кода:
if (user.HasRight("Profile.View")) {...}
Таким образом, существует много мест, куда мы передаем строку в качестве параметра, чтобы видеть, имеет ли пользователь определенное право. Мне не нравится это, потому что это генерирует много волшебных строк.
Каков был бы лучший способ сделать его?
Перечисление, Постоянное, класс?
В этом конкретном случае используйте Enum.Не будет никаких волшебных строк, и если Enum изменится (таким образом, чтобы сломать решение волшебных строк), приложение больше не будет компилироваться.
public enum ProfilePermissions
{
View,
Create,
Edit,
Delete
}
Тогда вы можете просто иметь:
if(user.HasRight(ProfilePermissions.View)) { }
Вы также можете использовать класс, но тогда вы ограничиваете себя, когда дело касается более сложных сценариев. Например, простое изменение Enumeration на что-то вроде:
public enum ProfilePermissions
{
View = 1,
Create = 2,
Edit = 4,
Delete = 8
}
позволит вам использовать побитовые операторы для более сложных разрешений (например, ситуация, когда пользователю нужно создать или удалить):
if(user.HasRight(ProfilePermissions.Create | ProfilePermissions.Delete));
Это достаточно распространено и в .NET Framework. Примерами являются System.Windows.DataFormats и System.Net.WebRequestMethods.Http. Вам нужна разновидность только для чтения:
public static class MumbleRights {
public static readonly string ProfileView = "Profile.View";
// etc..
}
Я поддерживаю способ, показанный "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)
{
}
Создайте class, который строго типизирует эти свойства, например
public static class UserInfo
{
public static bool CanViewProfile { get { return User.HasRight("Profile.View"); } }
}
. Это сохранит ваши «волшебные строки» в одном месте в вашем коде. Перечисление также будет работать, но, на мой взгляд, не так читаемо.
Примечание: мой пример предназначен для использования в качестве прокси свойства для вошедшего в систему пользователя, то есть статического класса. Если вам нужно что-то, что будет работать с более непосредственными данными (например, список пользователей), этот тип класса должен быть нестатическим и создаваться для каждой учетной записи пользователя.
Методы расширения! Держите их в одном месте, чтобы отслеживать все магические струны.
public static class UserRightsExtensions {
public static bool CanReadProfile(this User user)
{
return user.HasRight("Profile.View");
}
// etc..
}
Затем вы можете:
if (user.CanReadProfile()) .....
В C # можно создавать константные строки.
Вы можете определить все строки в заголовке следующим образом:
const string PROFILE_VIEW "Profile.View";
Не уверен, что это «лучший» способ, но он определенно лучше, чем наличие магических значений в коде.