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);
}
}
我有以下疑问
对于重构,我了解到创建具有非常具体职责的方法是很好的方法,因此如果可能的话,将一个复杂的方法拆分为其他小方法是个好主意。
但想象一下我有这种情况:
我必须创建一个对象列表,除了这个对象,我还必须创建另一个对象。类似的东西:
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);
}
}