По-перше, зауважте, що робити щось на зразок entity.underlyingEntity.underlyingEntity.method()
вважається кодовим запахом згідно із Законом Деметера . Таким чином, ви виставляєте споживачам багато деталей щодо впровадження. І кожна потреба в розширенні чи модифікації такої системи зашкодить сильно.
Отже, враховуючи це, я рекомендую вам мати HasRole
або IsAdmin
метод для User
коментаря CodesInChaos. Таким чином, спосіб реалізації ролей на користувачеві залишається детальним для реалізації для споживача. А також більш природно запитувати користувача, яка його роль, а не розпитувати його про деталі його ролі, а потім приймати рішення на основі цього.
Будь ласка, уникайте використання string
s, якщо це не потрібно. name
є хорошим прикладом string
змінної, оскільки вміст заздалегідь невідомий. З іншого боку, щось подібне до того, role
де у вас є два чіткі значення, добре відомі під час компіляції, краще використовувати сильне введення тексту. Ось де переживає тип перерахування ...
Порівняйте
public bool HasRole(string role)
з
public enum Role { Admin, User }
public bool HasRole(Role role)
Другий випадок дає мені набагато більше уявлення про те, що мені слід пройти навколо. Це також заважає мені помилково перейти до інваліда, string
якщо я не мав уявлення про ваші константи ролі.
Далі - рішення про те, як буде виглядати роль. Ви можете використовувати enum, безпосередньо збережений у користувача:
public enum Role
{
Admin,
User
}
public class User
{
private Role _role;
public bool HasRole(Role role)
{
return _role == role;
}
// or
public bool IsAdmin()
{
return _role == Role.Admin;
}
}
З іншого боку, якщо ви хочете, щоб у вашій ролі була сама поведінка, вона, безумовно, повинна знову приховувати деталі того, як визначається її тип:
public enum RoleType
{
User,
Admin
}
public class Role
{
private RoleType _roleType;
public bool IsAdmin()
{
return _roleType == RoleType.Admin;
}
public bool IsUser()
{
return _roleType == RoleType.User;
}
// more role-specific logic...
}
public class User
{
private Role _role;
public bool IsAdmin()
{
return _role.IsAdmin();
}
public bool IsUser()
{
return _role.IsUser();
}
}
Це, однак, досить багатослівно, і складність буде зростати з кожним доповненням ролі - саме так, як правило, код закінчується, коли ви намагаєтесь повністю дотримуватися Закону Деметера. Вам слід вдосконалити конструкцію, виходячи з конкретних вимог модельованої системи.
Згідно з вашим запитанням, я думаю, вам краще піти з першим варіантом із перерахунком безпосередньо User
. Якщо вам потрібна більше логіки щодо Role
, другий варіант слід розглядати як вихідний пункт.
User.HasRole(Role.Admin)
.