提问者:小点点

当一个方法扩展了另一个方法的功能时,如何重构相似但不相同的方法? C#


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

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

可以看出,第二种方法稍微扩展了第一种方法的功能。 我计划增加功能,这将打印回一个文件,但我的问题是,这是相当重复和打破干燥的原则。 我如何重构这些方法,以减少重复,同时确保它们都按预期工作。

谢谢


共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
    {

    }

匿名用户

正如所建议的,您可以使用可选参数来组合您的方法。 另一种选择可能是将参数重构为,然后将该类的IEnumerable传递给ExtendTable。 这允许您向方法提供任意数量的ColumnToCopyColumnNewName,而不必修改它。

此代码段未经测试,但看起来可能是这样的。。。

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版本支持它,则可以使用valueTupleIEnumerable.。。

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