如何重构仅在内部函数调用中不同的重复代码?

How can I refactor duplicated code that differ only in a function call inside?

我有一个实用程序 class (U),我从另一个 classes 调用它。 假设我在 U:

中有这些函数
Func1(params):
/*some code*/
funcA(param1,param2)
/*some_code*/

Func2(same params as in Func1):
/*same code as in 1*/
funcB(param1,param2) //same types of params as in funcA
/*same code as in 1*/

这里如何避免重复代码?我考虑过传递 funcA 或 B 的委托,但问题是它们是在实用程序 class 内部实现的,而我是从外部调用 func1/2,因此调用者不知道 funcA 或 funcB。 有任何想法吗?我的程序在 C# 中(这段代码是一个抽象) 谢谢

您可以提取公共部分并分别从 Func1Func2 传递委托。

private delegate string PerformOperation(Type1 param1, Type2 param2);

private void CommonFunc(Type1 param1, Type2 param2, PerformOperation operation)
{
    PreSteps();
    operation(param1, param2);
    PostSteps();
}

你所有的方法都是用参数和委托

调用CommonFunc
public void Func1(Type1 param1, Type2 param2)
{
    CommonFunc(param1, param2, funcA);
}

public void Func2(Type1 param1, Type2 param2)
{
    CommonFunc(param1, param2, funcB);
}

由于 CommonFuncprivate,您图书馆的客户不需要知道 PerformOperation,也不需要 funcAfuncB

我会说传递一个 ActionDelegate 作为参数,但正如你提到的调用者不知道 funcA 或 FuncB,这是不合适的. 作为简单的建议,我会尝试 Encapsulate 重复的 2 个代码块。所以,你会 end-up 有这样的东西:

Func1(params)
{
  EncapsulatedBlockOfCode1();
  funcA(param1,param2);
  EncapsulatedBlockOfCode2();

}   
Func2(same params as in Func1)
{
  EncapsulatedBlockOfCode1();
  funcB(param1,param2) //same types of params as in funcA
  EncapsulatedBlockOfCode2();
}

至少这可以帮助您减少重复代码并更清楚地了解如何重构您的代码。