Ho un codice che ha un sacco di duplicati. Il problema deriva dal fatto che ho a che fare con i tipi nidificati IDisposable
. Oggi ho qualcosa che assomiglia a:In che modo un codice refactor può essere coinvolto negli usi annidati?
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();
}
}
L'intero annidato using
blocco è lo stesso per ciascuno di questi metodi (due sono mostrati, ma ci sono una decina di loro). L'unica cosa che è diversa è ciò che accade quando arrivi al livello interno dei blocchi using
.
Un modo pensavo sarebbe quella di fare qualcosa sulla falsariga di:
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);
}
}
Questo funziona, è solo tipo di goffo per analizzare (come un essere umano). Qualcuno ha altri suggerimenti su come si potrebbe ridurre la duplicazione del codice attorno ai blocchi nidificati using
in questo modo? Se non fossero IDisposable
allora probabilmente si creerebbe un metodo per restituire i risultati di b.GetC(innerId)
... ma non è questo il caso.
+1 io non vedo nulla goffo nella soluzione. È un po 'non ortodosso essere più funzionale di procedurale, ma lo considererei un pro, non un con – mfeingold
Penso che la tua implementazione sia soddisfacente, ma forse preferirai alcune delle alternative fornite di seguito. Se ti ritrovi a dover ricorrere a un sacco di articoli usa e getta dovresti guardare a ridisegnare le cose in modo da non finire in questa situazione. – Thomas