2015-09-05 63 views
0

我有以下疑问。C#重构注意事项

对于重构,我已经读了好创建一个具有非常特殊的责任方式,因此,如果可能的话,这是一个好主意,分裂在别人的小方法复杂的方法。

但是想象一下,我有这样的情况:

我要创建对象的列表,并insdie这个对象,我要创建另一个对象。类似的东西:

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循环,所以它是低效率比只用一个像在环第一个选项。

那么,什么是最好的做法,至少在一般情况下,使用方法稍微复杂一些更有效率或使用更多的方法呢?

非常感谢。

+0

目前还不清楚myComplexMethod和myMethodCreateB过载1&2(即,这两种选择之间的关系没有提供相同的)。请更好地解释你的确切情况(=写一个代码,显示所有这些方法如何实际连接)。 – varocarbas

回答

3

我一般把可读性比性能更高的优先级,直到证明并非如此。我现在总结了一下,但根据我的经验,当人们在代码级上过多地关注性能时,结果是代码不易维护,分散了创建功能正确的代码,花费更长的时间(=更多的钱),以及可能会导致性能更低的代码。

所以不要担心,并使用更易读的方式。如果您的应用程序最终速度太慢,请通过分析器运行并精确(并证明)需要优化的一个或两个位置。我可以向你保证它不会是这个代码。

架构层面早期做出正确的选择是更重要的,因为你将不能够在这一水平可以轻松地进行一次更改您开发的应用。

+0

你怎么知道第二种选择有更好或更差的表现?这些代码完全不相关。据推测,第一个选择有两个嵌套循环,在第二个循环中被转换成两个不同的功能,但这只是一个猜测。无论如何,循环的数量似乎保持不变(否则第二个版本预计会如何提供相同的结果?)。 – varocarbas

+1

名称略有不同,可以改进,我认为它已经足够清晰。第一个示例具有一个循环,该循环创建对象并在该循环中执行父 - 子分配。第二个例子有两个循环:在第一个创建父项,在第二个创建的子项和父子分配。 – Christoph

+0

对不起Christoph,但这是不可能的:如果第一个代码只用一个循环就可以创建所有东西(即paramObjectsB不是集合),那么第二个选择中的两个循环就没有意义。唯一合乎逻辑的解释是有两个集合(paramObjectsA&paramObjectsB)。在第一个替代方案中,有两个嵌套循环(未显示;它应该是//创建类型B部分的myObjectB),而第二个嵌套循环通过调用具有两个重载的函数。在任何情况下,OP都应该发布一个实际可测试的代码(这里的情况很远)。 – varocarbas

2

通常我会继续使用一个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); 
    } 
}