Mam kod, który ma strasznie dużo duplikacji. Problem wynika z faktu, że mam do czynienia z typami zagnieżdżonymi IDisposable
. Dzisiaj mam coś, co wygląda następująco:W jaki sposób jeden kod refaktora może być użyty w zagnieżdżonych operacjach?
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();
}
}
Cały zagnieżdżona using
blok jest taki sam dla każdej z tych metod (dwa są pokazane, ale istnieje około dziesięciu z nich). Jedyną rzeczą, która jest inna, jest to, co dzieje się, gdy dojdziesz do wewnętrznego poziomu bloków using
.
Jednym ze sposobów myślałem byłoby zrobić coś wzdłuż linii:
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);
}
}
To działa, to po prostu rodzaj przylegający do analizowania (jako człowiek). Czy ktoś ma jakieś inne sugestie, w jaki sposób można zmniejszyć powielanie kodu wokół tak zagnieżdżonych bloków using
? Jeśli nie byłyby to IDisposable
, najprawdopodobniej wystarczyłaby metoda zwracania wyników b.GetC(innerId)
... ale tak nie jest w tym przypadku.
+1 Nie widzę niczego przylegający w roztworze. Jest to trochę niekonwencjonalne, bardziej funkcjonalne niż proceduralne, ale uważam to za pro, a nie con – mfeingold
Myślę, że twoja implementacja wygląda dobrze, ale może wolisz niektóre z alternatyw podanych poniżej. Jeśli okaże się, że musisz łączyć wiele artykułów jednorazowego użytku, możesz popatrzeć na przeprojektowanie rzeczy, aby nie znaleźć się w takiej sytuacji. – Thomas