Я смотрю на статью Мартина Фаулера под названием Работа с ролями .В ней Фаулер выделяет три основные стратегии работы с ролями для человека в организации (т. Е. Сотрудника, инженера, менеджера, продавца), которые включают подтип роли, объект роли и отношения роли.
* 1004написанный в 1997 году, он, безусловно, старый, и, будучи «рабочим проектом», он также имеет некоторые ошибки, которых в противном случае не было бы.Я запутался, просматривая пример Ролевого Объекта, через который он проходит, и включил мою интерпретацию c # некоторых его java-кодов ниже.
У меня есть три вопроса:
(1) есть многоИдентификация типа выполняется со строками, которые, кажется, должны быть заменены обобщениями, но я пока не могу понять, как это сделать.Как бы вы реализовали этот код с использованием обобщений?
(2) JobRole находится в коде как строковое имя для типа, но оно не определено специально с остальной частью кода.Я не могу сказать, является ли это базовым классом для PersonRole или нет.Какое определение для JobRole?Похоже ли модульный тест на правильный пример использования шаблона?
(3) Есть ли у кого-нибудь ссылки на более позднюю реализацию и пример использования объекта роли?
Cheers,
Berryl
public class PersonWithRoles : Person
{
private readonly IList<PersonRole> _roles = new List<PersonRole>();
public static PersonWithRoles CreatePersonWithRoles(string identifierName) {
...
}
public void AddRole(PersonRole role) { _roles.Add(role); }
public PersonRole RoleOf(string typeName) { return _roles.FirstOrDefault(x => x.HasType(typeName)); }
}
public class PersonRole
{
public virtual bool HasType(string typeName) { return false; }
}
public class Salesman : PersonRole
{
public override bool HasType(string typeName)
{
if (typeName.Equals("Salesman", StringComparison.InvariantCultureIgnoreCase)) return true;
if (typeName.Equals("JobRole", StringComparison.InvariantCultureIgnoreCase)) return true;
return base.HasType(typeName);
}
public int NumberOfSales { get; set; }
}
[TestFixture]
public class RoleUsageTests
{
[Test]
public void Test() {
var p = PersonWithRoles.CreatePersonWithRoles("Ted");
var s = new Salesman();
p.AddRole(s);
var tedSales = (Salesman) p.RoleOf("Salesman");
tedSales.NumberOfSales = 50;
}
}