En este caso, lo importante es que si se comparan dos objetos , vuelvas resultado .
Básicamente, debe desacoplar esta comparación de tal forma que no solo pueda agregar un nuevo tipo de objeto a la mezcla, sino también agregar reglas de comparación en la mezcla que pueda manejar este objeto.
Ahora, también comentó sobre su pregunta diciendo que "A veces, las preguntas pueden ser demasiado genérico", y el problema aquí es que no importa cuánto te digo cómo hacer lo que usted pregunta por, se no te ayudará ni un poco sobre el problema real.
A menos que esté construyendo un juego de piedra-papel-tijera-X.
Personalmente, haría lo siguiente, con mi propio contenedor IoC.
ServiceContainer.Global.RegisterFactory<IHandType>()
.FromDelegate(() => RandomRockScissorPaper());
ServiceContainer.Global.RegisterFactory<IHandComparison, DefaultHandComparison>();
(o más bien, me gustaría configurar hasta lo anterior en el archivo app.config o similar, de modo que pudiera ser cambiado después de que el proyecto se ha construido).
Luego, si un usuario/cliente/punto final necesita sobrescribir, para agregar otro tipo, aumentaría los registros de la siguiente manera (recuerde que los anteriores están en app.config, entonces los reemplazaría con los que están a continuación):
ServiceContainer.Global.RegisterFactory<IHandType>()
.FromDelegate(() => RandomRockScissorPaper())
.ForPolicy("original");
ServiceContainer.Global.RegisterFactory<IHandType>()
.FromDelegate((IHandType original) => RandomRockScissorPaperBlubb(original))
.WithParameters(
new Parameter<IHandType>("original").WithPolicy("original"))
.ForPolicy("new")
.AsDefaultPolicy();
Aquí añado una nueva manera de resolver IHandType, no sólo por mantener la forma original, pero añadiendo uno nuevo también. A este nuevo se le dará el resultado de llamar al anterior, y luego tendría que decidir internamente si una posibilidad aleatoria debería devolver el cuarto tipo, o el tipo original (uno de los tres originales).
Entonces yo también anular la regla original comparación:
ServiceContainer.Global.RegisterFactory<IHandComparison, DefaultHandComparison>()
.ForPolicy("original");
ServiceContainer.Global.RegisterFactory<IHandComparison, NewHandComparison>()
.ForPolicy("new")
.AsDefaultPolicy()
.WithParameters(
new Parameter<IHandType>("original"));
Así es como se utilizaría:
IHandType hand1 = ServiceContainer.Global.Resolve<IHandType>();
IHandType hand2 = ServiceContainer.Global.Resolve<IHandType>();
IHandComparison comparison = ServiceContainer.Global.Resolve<IHandComparison>();
if (comparison.Compare(hand1, hand2) < 0)
Console.Out.WriteLine("hand 1 wins");
else if (comparison.Compare(hand1, hand2) > 0)
Console.Out.WriteLine("hand 1 wins");
else
Console.Out.WriteLine("equal");
Así es como para poner en práctica:
public interface IHandComparison
{
Int32 Compare(IHandType hand1, IHandType hand2);
}
public class DefaultHandComparison : IHandComparison
{
public Int32 Compare(IHandType hand1, IHandType hand2)
{
... normal rules here
}
}
public class NewHandComparison : IHandComparison
{
private IHandComparison _Original;
public NewHandComparison(IHandComparison original)
{
_Original = original;
}
public Int32 Compare(IHandType hand1, IHandType hand2)
{
if hand1 is blubb or hand2 is blubb then ...
else
return _Original.Compare(hand1, hand2);
}
}
Después de escribir todo esto me doy cuenta de que la configuración de app.config no será capaz de manejar delegados, por lo que un objeto de fábrica w debería ser necesario, pero lo mismo sigue siendo válido.
Necesita poder resolver la forma de obtener nuevas manos, así como también resolver las reglas de las manos ganadoras.
A veces, las preguntas pueden ser * demasiado * genéricas. –
Sí. Es por eso que puse un ejemplo muy concreto. Resolvamos este ejemplo, y me imagino que podremos generalizar la solución. – wilhelmtell
El problema es que hay muchas "soluciones" para cualquier ejemplo dado, y no siempre se puede generalizar. Tal vez si tuviera varios ejemplos diferentes, sería razonable considerar una solución generalizada (realmente solo un patrón de diseño) – Tom