【发布时间】:2021-09-26 18:08:13
【问题描述】:
在工作中,我被要求修复一个涉及我在课堂上进行更改的错误。为了修复这个错误,我需要添加一个看起来像这样的类的集合。
public class Branch
{
public int StartNode { get; set; }
public int EndNode { get; set; }
}
收藏
List<Branch> _vistedBranch = new List<Branch>();
我担心的是,我总是被教导讨厌在我的任何课程中看到“新”,因为这将我的课程与其他课程紧密结合在一起。然而,这个类只是一个没有任何功能的 POCO 类。我只是在我正在处理的类中使用它来存储开始节点和结束节点的集合。
这就是我在课堂上使用它的方式
public class CustomerCountRequestProcessor : ICustomerCountRequestProcessor
{
List<Branch> _vistedBranch = new List<Branch>();
private INetwork _network;
public CustomerCountRequestProcessor(INetwork network)
{
_network = network ??
throw new ArgumentNullException(nameof(network));
}
public int GetCustomersForSelectedNode(IRoot request)
{
if (request == null)
throw new ArgumentNullException(nameof(request));
_network = request.Network;
return ProcessSelectedNode(request.SelectedNode);
}
private int ProcessSelectedNode(int node)
{
var nc = _network.Customers.FirstOrDefault(c => c.Node == node);
var customersForNode = nc != null ? nc.NumberOfCustomers : 0;
foreach (var subNode in _network.Branches.Where(b => b.StartNode == node))
{
bool has = _vistedBranch.Any(b => b.StartNode == subNode.StartNode
&& b.EndNode == subNode.EndNode);
if (has)
{ throw new ArgumentNullException(nameof(node)); }
_vistedBranch.Add(new Branch()
{
StartNode = subNode.StartNode,
EndNode = subNode.EndNode
});
customersForNode += ProcessSelectedNode(subNode.EndNode);
}
return customersForNode;
}
}
所以我的问题很简单,我将如何重构该集合以使我的代码更干净。
- 我是否从集合中创建一个类。然后从类中创建一个接口,然后使用依赖注入将其引入? 2.我做一个工厂班,把那个收藏贴在那里,然后在我需要班的时候新建工厂吗? 上面的这些选项对于一个简单的 POCO 类来说似乎有很多代码。 也许就像这样将新部分放入构造函数中一样简单。
List<Branch> _vistedBranch;
private INetwork _network;
public CustomerCountRequestProcessor(INetwork network)
{
_vistedBranch = new List<Branch>();
_network = network ??
throw new ArgumentNullException(nameof(network));
}
我该怎么做?
【问题讨论】:
-
既然您已经有了一些工作代码,那么codereview 站点会更合适。
-
HashSet<T>更适合这里。 -
Branch是一个数据类。这个问题通常被问为“依赖倒置是否适用于数据类?”答案通常是“否。”请随意newup all data你需要在局部变量中。只需将具体引用保留在您的 API 之外。
标签: c# .net solid-principles