如何重构仅在内部函数调用中不同的重复代码?
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# 中(这段代码是一个抽象)
谢谢
您可以提取公共部分并分别从 Func1
和 Func2
传递委托。
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);
}
由于 CommonFunc
是 private
,您图书馆的客户不需要知道 PerformOperation
,也不需要 funcA
或 funcB
。
我会说传递一个 Action 或 Delegate 作为参数,但正如你提到的调用者不知道 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();
}
至少这可以帮助您减少重复代码并更清楚地了解如何重构您的代码。
我有一个实用程序 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# 中(这段代码是一个抽象) 谢谢
您可以提取公共部分并分别从 Func1
和 Func2
传递委托。
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);
}
由于 CommonFunc
是 private
,您图书馆的客户不需要知道 PerformOperation
,也不需要 funcA
或 funcB
。
我会说传递一个 Action 或 Delegate 作为参数,但正如你提到的调用者不知道 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();
}
至少这可以帮助您减少重复代码并更清楚地了解如何重构您的代码。