【问题标题】:How to refactoring similar but not identical methods where one method extends the functionality of the other? C#如何重构相似但不相同的方法,其中一种方法扩展了另一种方法的功能? C#
【发布时间】:2020-06-12 13:35:21
【问题描述】:

我有两种非常相似的方法,除了第二种方法部分扩展了第一种方法的功能。例如方法如下:

private void ExtendTable(FileInfo file, string columnToCopy, string columnNewName) 
{
    var data = File.ReadAllLines(file.FullName).ToArray();
    if (data[1].Contains(columnToCopy)) 
    {
       var content = data[0] + Environment.NewLine + data[1] + columnNewName + Environment.NewLine + data[2];
    }
}

private void ExtendTable(FileInfo file, string columnToCopy, string columnNewName, string secondColumnToCopy, string secondColumnNewName) 
    {
        var data = File.ReadAllLines(file.FullName).ToArray();
        if (data[1].Contains(columnToCopy) && data[1].Contains(secondColumnToCopy)) 
        {
           var content = data[0] + Environment.NewLine + data[1] + columnNewName + secondColumnNewName + Environment.NewLine + data[2];
        }
    }

可以看出,第二种方法稍微扩展了第一种方法的功能。我计划添加将其打印回文件的功能,但是我的问题是这是非常重复的并且违反了 DRY 原则。我如何重构这些方法以减少重复,同时仍确保它们都按预期工作。

谢谢

【问题讨论】:

  • 使用可选参数来组合你的两种方法。见here

标签: c# methods refactoring dry


【解决方案1】:

正如建议的那样,您可以使用可选参数来组合您的方法。另一种选择可能是将参数重构为class,然后将该类的IEnumerable 传递给ExtendTable。这允许您向该方法提供任意数量的columnToCopycolumnNewName,而无需对其进行修改。

这个 sn-p 未经测试,但它可能看起来像这样......

public static void ExtendTable(string[] data, IEnumerable<ExtendTableData> extendData)
{
    if (extendData.Any() && extendData.All(ed => data[1].Contains(ed.ColumnToCopy)))
    {
        var content = data[0] + Environment.NewLine + data[1] + string.Join("" , extendData.Select(ed => ed.ColumnNewName)) + Environment.NewLine + data[2];
    }
}

public class ExtendTableData
{
    public string ColumnToCopy { get; set; }
    public string ColumnNewName { get; set; }
}

或者,如果您不想创建一个类并且您使用的 .NET 版本支持它,您可以使用 IEnumerableValueTuple&lt;string, string&gt;...

public static void ExtendTable(string[] data, IEnumerable<(string ColumnToCopy, string ColumnNewName)> extendData)
{
    if (extendData.Any() && extendData.All(ed => data[1].Contains(ed.ColumnToCopy)))
    {
        var content = data[0] + Environment.NewLine + data[1] + string.Join("" , extendData.Select(ed => ed.ColumnNewName)) + Environment.NewLine + data[2];
    }
}

【讨论】:

    【解决方案2】:

    您也可以使用默认参数实现一种方法。

    if (data[1].Contains(secondColumnToCopy)) 
    {
        if (data[1].Contains(columnToCopy))
        {
             var content = data[0] + Environment.NewLine + data[1] + columnNewName + secondColumnNewName + Environment.NewLine + data[2];}
        }
        else
        {
    
        }
    

    【讨论】:

      【解决方案3】:

      “params”是另一个选项,如果参数的数量不同。 可以摆脱2个类似的实现。 下面是伪代码

      private static void ExtendTable(FileInfo file, params string[] cols)
      {
      
      }
      

      【讨论】:

        猜你喜欢
        • 2017-01-22
        • 2020-08-14
        • 1970-01-01
        • 2012-02-29
        • 2021-05-13
        • 1970-01-01
        • 1970-01-01
        • 2021-11-14
        • 2014-07-21
        相关资源
        最近更新 更多