gpt4 book ai didi

c# - 一个重构代码如何参与嵌套使用?

转载 作者:太空狗 更新时间:2023-10-29 17:57:29 24 4
gpt4 key购买 nike

我有一些代码有很多重复。问题来 self 正在处理嵌套的 IDisposable 类型这一事实。今天我有一些东西看起来像:

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();
}
}

对于这些方法中的每一个,整个嵌套的 using block 都是相同的(显示了两个,但大约有十个)。唯一不同的是当您到达 using block 的内部级别时会发生什么。

我想的一种方法是按照以下方式做一些事情:

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);
}
}

这是有效的,只是解析起来有点笨拙(作为人类)。 对于如何减少嵌套使用 block 的代码重复,有没有人有任何其他建议?如果它们不是IDisposable,那么一个可能只是创建一个方法来返回 b.GetC(innerId) 的结果......但这里不是这种情况。

最佳答案

我喜欢 BFree 提供的答案作为开始,但我会做一些修改。

//Give it a better name; this isn't designed to be a general purpose class
public class MyCompositeDisposable : IDisposable
{
public MyCompositeDisposable (string uri, int id, int innerid)
{
A = SomeFactory.GetA(uri);
B = A.GetB(id);
C = B.GetC(innerId);
}

//You can make A & B private if appropriate;
//not sure if all three or just C should be exposed publicly.
//Class names are made up; you'll need to fix.
//They should also probably be given more meaningful names.
public ClassA A{get;private set;}
public ClassB B{get;private set;}
public ClassC C{get;private set;}

public void Dispose()
{
A.Dispose();
B.Dispose();
C.Dispose();
}
}

完成后你可以做类似的事情:

public bool GetSomeValueById(Guid innerId)
{
using(MyCompositeDisposable d = new MyCompositeDisposable(_uri, _id, innerId))
{
return d.C.GetSomeValue();
}
}

请注意,MyCompositeDisposable 可能需要在构造函数和 Dispose 方法中包含 try/finally block ,以便正确地创建/销毁错误,确保没有任何东西最终未被处置。

关于c# - 一个重构代码如何参与嵌套使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10285490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com