减少代码重复:调用具有略微不同签名的函数

时间:2010-03-31 21:13:11

标签: c# refactoring

假设我有两个看起来像这样的函数:

public static void myFunction1(int a, int b, int c, string d)
{
    //dostuff
    someoneelsesfunction(c,d);
    //dostuff2
}

public static void myFunction2(int a, int b, int c, Stream d)
{
    //dostuff
    someoneelsesfunction(c,d);
    //dostuff2
}

什么是避免重复dostuff的好方法?

我想过的想法,但不喜欢:

  1. 我可以根据类型制作一个对象并按照runtype进行投射,但这让我觉得不理想;它删除了以前在编译时发生的类型检查。
  2. 我还可以编写一个私有帮助器类,它接受一个对象并将两个签名都写为公共函数。
  3. 我可以用委托或函数调用等替换dostuff和dostuff2。

5 个答案:

答案 0 :(得分:6)

只需将“doStuff”和“doStuff2”重构为不同的方法。

他们显然做的“东西”与“personelsesfunction”方法分开,因此它们应该是单独的方法。理想情况下,每种方法都应该有一个任务。

这甚至是Visual Studio中支持的重构 - 只需突出显示“dostuff”中的代码,然后右键单击,然后选择Refactor-> Extract Method。

答案 1 :(得分:4)

我可能会这样做:

public static void myFunction1(int a, int b, int c, string d)
{
    //dostuff
    someoneelsesfunction(c, d);
    //dostuff2
}

public static void myFunction2(int a, int b, int c, Stream d)
{
    string str = d.ReadEntireString(); // no such method, but basically
        // whatever you need to do to read the string out of the stream
    myFunction1(a, b, c, str);      
}

...并将两个函数的名称更改为MyFunction(以利用重载,这与someoneelsesfunction()正在进行的操作相同。

注意:如果Stream中包含的字符串是巨大的,那么此解决方案将是不切实际的。如果是这样,您可能希望以相反的方式执行此操作:将字符串d读入流并使用stream参数调用override。

答案 2 :(得分:3)

使用Action自定义某个功能在某个特定位置的功能。

public void myF1(int a, int b, int c, int d)
{
     internalF(a, b, { someelse1(c, d); }); 
}
public void myF2 (int a, int b, int c, Stream d)
{
     internalF(a, b, { someelse2(c, d); });
}
private void internalF (int a, int b, Action action)
{
    // dostuff
    action();
    // dostuff2
}

答案 3 :(得分:1)

最终你可以创建

public static void myFunction3(int a, int b, int c, Stream d, string e)

将从function1和function2调用,d或e设置为null。然后function3将区分对某人功能的调用(c,d)。 这是一个可能的解决方案,但对于绝望:)

答案 4 :(得分:0)

我首先提取DoStuff和DoStuff2方法并从两个函数中调用它们。

然后,您可以通过将块包装在另一个方法中并将单个函数传递给该方法来开始变得时髦,但这样做太过分了。你希望事物易于阅读和改变,而不是重复。