Estoy viendo un documento hecho por Martin Fowler llamado Dealing With Roles. En él, Fowler desglosa tres estrategias básicas para tratar con roles para una Persona en una organización (es decir, Empleado, Ingeniero, Gerente, Vendedor) que incluyen Subtipo de rol, Objeto de rol y Relaciones de rol.Pregunta de patrón de objeto de rol
Habiendo sido escrito en 1997, es ciertamente viejo, y al ser un "borrador de trabajo" también tiene algunos errores que de otro modo no existirían. Estoy confundido repasando un ejemplo de Role Object que él atraviesa, y he incluido una interpretación de mi C# de algunos de sus códigos java a continuación.
Tengo tres preguntas:
(1) hay un montón de identificación del tipo que se realiza con cadenas que parece que debería ser reemplazable con los genéricos, pero no puedo tener una idea de cómo hacerlo todavía. ¿Cómo implementarías este código usando genéricos?
(2) JobRole está en el código como el nombre de la cadena para un tipo pero no está específicamente definido con el resto del código. No puedo decir si esta es una clase base para PersonRole o no. ¿Cuál es la definición de JobRole? ¿La prueba unitaria parece un ejemplo correcto del uso del patrón?
(3) ¿Alguien tiene algún vínculo hacia una implementación más reciente y un ejemplo de uso de un objeto de función?
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;
}
}
I * * pensar así. ¿Podrías tachar un código de muestra o darme un enlace que lo muestre? Cheers – Berryl
del mismo documento de Fowler: "Una variación útil en este patrón es hacer que los objetos decoradores del objeto central. Esto significa que un cliente que utiliza solo las características de la persona empleado puede tratar con un solo objeto y no Necesitamos saber sobre el uso de los objetos de rol. El costo es que cuando la interfaz de la persona cambia, todos los roles necesitan ser actualizados.Ver [Bäumer et al] para más detalles sobre cómo hacer esto. " – Berryl
Aquí está el [enlace al trabajo de Baumer] (http://hillside.net/plop/plop97/Proceedings/riehle.pdf) al que hace referencia Fowler. un patrón compuesto por (3) participantes principales; usando su ejemplo, habría un programador abstracto que define la interfaz para un programador, así como la interfaz para la gestión de roles. Luego hay un Programmercore que implementa tanto la interfaz del programador como la función de gestión. Finalmente, hay un ProgrammerRole que decora una instancia de ProgrammerCore. HtmlCoderRole y SeniorDevRole son subclases de ProgrammerRole. – Berryl