如何避免代码重复

时间:2010-12-03 09:13:25

标签: c# code-reuse

我有三种几乎执行相同的C#方法。更具体地说,存在大量的代码重复,但最后,它们执行不同的功能。

这显然非常低效,那么减少代码重复的最佳方法是什么?我应该把它全部放在一个方法中,并使用开关和放大器。枚举最终的不同功能?或者,是否有某种方式可以有3个单独的类并从另一个继承共享位?我已经做了很多关于这一点的阅读,从我可以收集到的内容来看,这只是用于从一个完全不同的类中获取属性。

9 个答案:

答案 0 :(得分:5)

没有看到代码很难给出具体的例子,但听起来你想将委托实例传递给方法

答案 1 :(得分:4)

从我的观点来看,你应该坐下来用一张纸和一支笔。绘制出方法执行的每项功能。请记住,函数/方法应该一个且只有一个

在制下每一项功能后,您将开始看到重复的事情,这些应该在一个功能中组合在一起。

答案 2 :(得分:4)

  

我主要有三种C#方法   做同样的事情。有很多   代码重复,但最后,他们   两者都执行不同的功能。

通过阅读这一行,我认为你的三种方法基于一些不同的场景有不同的实现。

所以我建议看一下可能有用的Stratgey Pattern。 See here

答案 3 :(得分:3)

这是一个很好的迹象,它会让你烦恼。

  

这显然非常低效

效率低下(额外的内存使用量)是目前最不重要的部分。什么是十分愚蠢的,这是一个维护噩梦。例如,如果您在例程中发现了一个错误并进行了修复,那么您也需要记住修复重复的代码。你绝对想要在可能的情况下分解出重复的代码。

  

或者,是否有某种方式可以有3个单独的类并从另一个继承共享位?我已经做了很多关于这一点的阅读,从我可以收集到的内容来看,这只是用于从一个完全不同的类中获取属性。

子类可以直接访问其超类的所有公共成员和受保护成员。例如,如果您的Animal类具有Poop()方法,则Dog和Cat子类可以共享该pooping代码。

但是有很多对这只猫进行剥皮的方法。没有更多细节,很难说什么是最好的。

答案 4 :(得分:2)

您可以执行以下操作:

    public void MethodBase()
    {
        Console.WriteLine("1");
        Console.WriteLine("2");
        Console.WriteLine("3");
        Console.WriteLine("4");
        Console.WriteLine("5");
    }

    public void Method1()
    {
        MethodBase();
        Console.WriteLine("Method 1");
    }

    public void Method2()
    {
        MethodBase();
        Console.WriteLine("Method 2");
    }

    public void Method3()
    {
        MethodBase();
        Console.WriteLine("Method 3");
    }

答案 5 :(得分:2)

没有适用于所有情况的解决方案,请向我们展示代码。

问题在于,当您将代码放入一个函数并在内部某处切换行为的一小部分时,会增加代码复杂性,有时最好保留一些重复的代码。

几乎相同的参数适用于继承。您可以轻松地将公共代码填充到一个共同的祖先类中,但如果您经常使用继承作为代码重用工具,您的设计可能会陷入痛苦的世界。继承意味着一段代码中的代码可以影响其他代码段中的行为,在您知道它之前,您将拥有一个相互关联的代码球,几乎不可能在不中断的情况下进行更改。

通常最好能够从这三个函数中提取或抽象代码的某些有意义的公共部分。一些有意义的东西,比如高级模式,而不仅仅是一些没有连贯工作的常见线条。一个可以帮助您的简单规则是命名提取的代码:是否有一种明显,自然的方法来命名块?它显然适合你的一个课程吗?如果是这样,那可能是一个很好的解决方案。如果你很难命名它并且几乎可以在任何地方命名,你可能想要多想一点。

答案 6 :(得分:2)

您可以尝试通过使其成为更高阶或通用函数来推广该方法。想到的其他方法是设计模式,如模板方法,它允许您定义算法的骨架,并让子类重新定义某些步骤。

答案 7 :(得分:1)

public MyCustomObject MethodBase(MyCustomObject myObj) 
{ 
    myObj.Name="FixedName";
    myObj.Surname="FixedSurname";
    myObj.Type = Types.Human;
    return myObj;
} 


public MyCustomObject SetOld(MyCustomObject  myObj) 
{ 
    MethodBase(); 
    myObj.IsOld = True;
    return myObj;
} 

public MyCustomObject SetYoung(MyCustomObject myObj) 
{ 
    MethodBase(); 
    myObj.IsOld = False;
    return myObj;
} 

public MyCustomObject SetIsDead(MyCustomObject myObj) 
{ 
    MethodBase(); 
    myObj.IsDead = True;
    return myObj;
} 
public void MainMethod(enum OperationType)
{
    MyCustomObject myObj = new MyCustomObject();
    switch(OperationType)
    {
        case OperationTypes.Old:
            myObj = SetOld(myObj);
            break;
        case OperationTypes.Young:
            myObj = SetYoung(myObj);
            break;
        case OperationTypes.Dead:
            myObj = SetDead(myObj);
            break;
    }
}

答案 8 :(得分:0)

没有人提到lambda函数,他们必须知道.NET 3.5开发人员:

public MyCustomObject SetYoung(MyCustomObject myObj) 
{ 
    GeneralMethod(myObj => myObj.IsOld = False);
    return myObj;
} 

public void GeneralMethod(Func<TSourceObjectType,TResultObjectType> func)
{
    MyCustomObject myObj = new MyCustomObject(); // MyCustomObject implements 'TSourceObjectType'
    TResultObjectType res = func(myObj);
}