我有两个非常相似的方法,只是第二个方法部分扩展了第一个方法的功能。 例如,方法如下:
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];
}
}
可以看出,第二种方法稍微扩展了第一种方法的功能。 我计划增加功能,这将打印回一个文件,但我的问题是,这是相当重复和打破干燥的原则。 我如何重构这些方法,以减少重复,同时确保它们都按预期工作。
谢谢
您也可以使用默认参数实现一个方法。
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
。 这允许您向方法提供任意数量的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; }
}
或者,如果您不想创建类,而您正在使用的。NET版本支持它,则可以使用valueTuple
的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];
}
}