C# 重构注意事项

C# refactoring considerations

我有以下疑问

对于重构,我了解到创建具有非常具体职责的方法是很好的方法,因此如果可能的话,将一个复杂的方法拆分为其他小方法是个好主意。

但想象一下我有这种情况:

我必须创建一个对象列表,除了这个对象,我还必须创建另一个对象。类似的东西:

public void myComplexMethod(List<MyTypeA> paramObjectsA)
{
    foreach(MyTypeA iteratorA in paramObjectsA)
    {
        //Create myObjectB of type B

        //Create myObjectC of type C

        myObjectB.MyPorpertyTpyeC = myObjectC;
    }
}

我可以把这个方法分成两种方法。

public void myMethodCreateB(List<MyTypeA> paramObjectsA)
{
    foreach(MyTypeA iteratorA in paramObjectsA)
    {
        //Create myObjectB of type B
    }
}



public void myMethodCreateB(List<MyTypeB> paramObjectsB)
{
    foreach(MyTypeB iteratorB in paramObjectsB)
    {
        //Create myObjectC of type C
        iteratorB.PropertyC = myObjectC;
    }
}

在第二个选项中,当我使用两种方法而不是一种方法时,单元测试不那么复杂,但问题是我使用了两个 foreach 循环,所以它比第一个只使用一个循环效率低选项。

那么,至少在一般情况下,最好的做法是使用稍微复杂一点的方法来提高效率,还是使用更多的方法?

非常感谢。

我通常将可读性置于比性能更高的优先级,除非另有证明。我现在有点概括,但根据我的经验,当人们在代码级别过多地关注性能时,结果是代码的可维护性降低,这会分散他们创建功能正确的代码的注意力,这需要更长的时间(=更多的钱),并且可能导致性能更低的代码。

所以不用担心,使用更具可读性的方法。如果你的应用程序最终真的太慢了​​,运行 它通过一个分析器并查明(并证明)它需要优化的一两个地方。我可以向你保证它不会是这个代码。

尽早在架构级别做出正确的选择更为重要,因为一旦构建了应用程序,您将无法轻松地在该级别进行更改。

通常我会在这种情况下继续使用一个for循环。 似乎您只是在创建和装饰 MyTypeB 的对象。 我更愿意在 class MyTypeB:

中创建一个工厂方法
static MyTypeB Create(MyTypeA a) { // if the creation of MyTypeB depends on A
    //Create myObjectB of type B
    //Create myObjectC of type C
    myObjectB.MyPorpertyTpyeC = myObjectC;
    return myObjectB;
}

那么你的复杂方法将变成:

public void myComplexMethod(List<MyTypeA> paramObjectsA)
{
    foreach(MyTypeA iteratorA in paramObjectsA)
    {
        MyTypeB myObjectB = MyTypeB.Create(iteratorA);
    }
}