如何重构相似但不相同的方法,其中一种方法扩展了另一种方法的功能? C#
How to refactoring similar but not identical methods where one method extends the functionality of the other? 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];
}
}
可以看出,第二种方法略微扩展了第一种方法的功能。我计划添加将其打印回文件的功能,但我的问题是这是相当重复的并且违反了 DRY 原则。我如何重构这些方法以减少重复,同时仍确保它们都按预期工作。
谢谢
您也可以使用默认参数实现一种方法。
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
{
}
正如所建议的那样,您可以使用可选参数来组合您的方法。另一种选择可能是将参数重构为 class
,然后将 class 的 IEnumerable
传递给 ExtendTable
。这允许您向方法提供任意数量的 columnToCopy
和 columnNewName
而无需修改它。
此代码段未经测试,但可能看起来像这样...
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; }
}
或者如果您不想创建 class 并且您使用的 .NET 版本支持它,您可以只使用 ValueTuple<string, string>
的 IEnumerable
.. .
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];
}
}
如果参数数量不同,"params" 是另一种选择。
可以摆脱 2 个类似的实现。
下面的伪代码
private static void ExtendTable(FileInfo file, params string[] cols)
{
}
我有两种非常相似的方法,除了第二种方法部分扩展了第一种方法的功能。例如,方法如下:
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 原则。我如何重构这些方法以减少重复,同时仍确保它们都按预期工作。
谢谢
您也可以使用默认参数实现一种方法。
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
{
}
正如所建议的那样,您可以使用可选参数来组合您的方法。另一种选择可能是将参数重构为 class
,然后将 class 的 IEnumerable
传递给 ExtendTable
。这允许您向方法提供任意数量的 columnToCopy
和 columnNewName
而无需修改它。
此代码段未经测试,但可能看起来像这样...
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; }
}
或者如果您不想创建 class 并且您使用的 .NET 版本支持它,您可以只使用 ValueTuple<string, string>
的 IEnumerable
.. .
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];
}
}
"params" 是另一种选择。 可以摆脱 2 个类似的实现。 下面的伪代码
private static void ExtendTable(FileInfo file, params string[] cols)
{
}