Me encontré con algún código el otro día y me pregunté si esa era la mejor manera de hacerlo. Tenemos un método que toma una cadena de algunos datos de formularios web que hace algo a un objeto en función de la cadena que se transmite. Actualmente, usa la reflexión para determinar qué acción tomar, pero me preguntaba si una instrucción de cambio sería mejor. .Método Factory - caso vs. reflexión
Ejemplo:
Edición: He añadido una tercera opción para los delegados como señaló Lucerno
public class ObjectManipulator
{
private void DoX(object o) { }
private void DoY(object o) { }
private void DoZ(object o) { }
public void DoAction(string action, object o)
{
switch (action)
{
case "DoX":
DoX(o);
break;
case "DoY":
DoY(o);
break;
case "DoZ":
DoZ(o);
break;
default:
throw new Exception(string.Format(
"Cannot locate action:{0}", action));
}
}
public void DoActionViaReflection(string action, object o)
{
MethodInfo method = typeof(ObjectManipulator).
GetMethod(action, new Type[] { typeof(object) });
if (method == null)
{
throw new Exception(string.Format(
"Cannot locate action:{0}", action));
}
else
{
method.Invoke(this, new object[] { o });
}
}
private Dictionary<string, Action<object>> _methods;
public ObjectManipulator()
{
_methods = new Dictionary<string, Action<object>>()
{
{"DoX", o => DoX(o)},
{"DoY", o => DoY(o)},
{"DoZ", o => DoZ(o)}
};
}
public void DoActionViaDelegates(string action, object o)
{
if (!_methods.ContainsKey(action))
{
throw new Exception(string.Format(
"Cannot locate action:{0}", action));
}
else
{
_methods[action](o);
}
}
}
El primer ejemplo se utiliza el interruptor y como se puede ver podría ser muy detallado. El segundo es mucho más corto, pero utiliza la reflexión, que sé que algunas personas evitan como la peste.
¿Funcionará un método significativamente mejor que el otro?
¿Cambiaría el rendimiento si hubiera 100 acciones diferentes en lugar de solo 3?
¿Qué prefieres ver en tu código si lo lees?
Es más o menos una pregunta sobre el estilo de programación imperativa frente a declarativa. Kirk parece preferir el modo imperativo, mientras yo prefiero el último, como se puede ver en mi respuesta. Ninguno de los dos es "correcto" o "incorrecto", solo para aclarar esto. – Lucero