Tengo un código que tiene una gran cantidad de duplicaciones. El problema proviene del hecho de que estoy tratando con tipos anidados IDisposable
. Hoy tengo algo que parece:¿Cómo podría un código de refactorización involucrarse en los usos anidados?
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
}
}
public bool GetSomeValueById(Guid innerId)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
return c.GetSomeValue();
}
}
El conjunto anidado using
bloque es el mismo para cada uno de estos métodos (se muestran dos, pero hay cerca de diez de ellos). Lo único que es diferente es lo que sucede cuando se llega al nivel interno de los bloques using
.
Una forma Estaba pensando sería hacer algo en la línea de:
public void UpdateFromXml(Guid innerId, XDocument someXml)
{
ActOnC(innerId, c =>
{
var cWrapper = new SomeWrapper(c);
cWrapper.Update(someXml);
});
}
public bool GetSomeValueById(Guid innerId)
{
var result = null;
ActOnC(innerId, c => { result = c.GetSomeValue(); });
return result;
}
private void ActOnC(Guid innerId, Action<TheCType> action)
{
using (var a = SomeFactory.GetA(_uri))
using (var b = a.GetB(_id))
using (var c = b.GetC(innerId))
{
action(c);
}
}
Esto funciona, es sólo un poco torpe para analizar (como un ser humano). ¿Alguien tiene alguna otra sugerencia sobre cómo se podría reducir la duplicación de código alrededor de bloques anidados using
de esta manera? Si no fueran IDisposable
, probablemente solo crearía un método para devolver los resultados de b.GetC(innerId)
... pero ese no es el caso aquí.
+1 no veo nada torpe en su solución. Es algo poco ortodoxo siendo más funcional que de procedimiento, pero lo consideraría como un profesional, no como un – mfeingold
Creo que su implementación se ve bien, pero tal vez prefiera algunas de las alternativas que se proporcionan a continuación. Si se ve obligado a encadenar muchos elementos desechables, puede considerar rediseñar las cosas para no terminar en esta situación. – Thomas