c#重构注意事项
本文关键字:注意事项 重构 | 更新日期: 2023-09-27 18:11:23
我有以下疑问:
对于重构,我读到创建具有非常具体职责的方法是很好的,所以如果可能的话,将一个复杂的方法拆分为其他小方法是一个好主意。
但是假设我有这种情况:
我必须创建一个对象列表,在这个对象中,我必须创建另一个对象。像这样:
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的对象。我更喜欢在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);
}
}