【问题标题】:Whats the best way to refactor code that news up a POCO class重构更新 POCO 类的代码的最佳方法是什么
【发布时间】: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;
    }
}

所以我的问题很简单,我将如何重构该集合以使我的代码更干净。

  1. 我是否从集合中创建一个类。然后从类中创建一个接口,然后使用依赖注入将其引入? 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&lt;T&gt; 更适合这里。
  • Branch 是一个数据类。这个问题通常被问为“依赖倒置是否适用于数据类?”答案通常是“否。”请随意new up all data你需要在局部变量中。只需将具体引用保留在您的 API 之外。

标签: c# .net solid-principles


【解决方案1】:

选择 1。 构造函数也不错

【讨论】:

  • 这些问题在 Stack Overflow 上是题外话,所以最好不要回答它们,而是将贡献者推荐给例如代码审查堆栈交换(就像@imsmn 在 cmets 中所做的那样)。也就是说,即使这是主题,或者如果它是在 Code Review Stack Exchange 上,我们希望更多地解释为什么这些选项是首选的,而不是简单的断言。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多