在.NET中重构大型方法

MC.*_*MC. 8 language-agnostic methods refactoring static-methods

如果我有一个大的.NET方法,我想知道将它拆分成多种方法是否是一种好的做法.我担心的是:1 - 如果只调用一次方法,是否有任何创建方法的点?
2 - 如果我在我的类中调用私有方法,我尽量不使用实例变量.这是好事还是坏事?例如:

var a, b;
public void TestMe
{
   FirstTest(a,b);
}
private void FirstTest(paramA, paramB)
{
         //code here with passed in parameters
}

//instead of:
private void FirstTest()
{
      //code here with instance variables a,b
}  
Run Code Online (Sandbox Code Playgroud)

编辑:用实例替换全局

tva*_*son 9

关于第一个问题,降低方法的复杂性是将大方法分解为小方法的充分理由.较小的方法比单个大方法更容易理解.如果做得恰当,通过将方法分解为逻辑上一致的工作单元,在几乎所有情况下,许多小方法都优于单个大方法.可能不存在的唯一条件是它是否会影响您的表现,从那个角度来看它已不再可接受.

关于第二个问题,正如@Jason指出的那样,你在类中使用的是实例变量而不是全局变量.我想说哪种做法更受欢迎取决于方法的背景.当然,如果该方法可以在许多上下文中重用,其中只有一些在实例变量上运行,那么它应该被参数化.如果您只使用实例变量,则可以选择不使用参数,并在以后根据需要进行重构以实现可用性.

在C#中,我还希望在字段上使用实例属性,以进一步将属性与使用它的方法分离.

  • 鲍勃叔叔的"清洁代码"一书很好地解释了分解方法.一个简单的经验法则是,如果您认为代码可以使用注释,则可能使用命名良好的方法. (4认同)

Jef*_*dge 5

1 - 如果只调用一次方法,是否有任何创建方法的点?

是的,有很多理由这样做.可读性可能是最重要的.如果你可以通过分解它来使方法更具可读性和可维护性,那么一定要这样做.

根据我对重构遗留代码的经验,如果方法太长,那么很少有代码会反复出现.这些通常是寻找重构机会的最佳场所.为这些部分创建单独的方法可以大大减少方法的长度,从而增加其可读性.

2 - 如果我在我的类中调用私有方法,我尽量不使用实例变量.这是好事还是坏事?

通常,变量范围越小越好.和你一样,我倾向于尽可能使用参数.如果方法仅引用其自己的参数,则可以更容易地推断该方法,验证其正确性并正确使用它.(如果一种方法可以做到这一点而不是修改任何状态,那么这会给你带来很多维护好处.)

如果通过操纵对象的字段来最好地实现方法的目的,那么这是完全可以接受的,并且在许多情况下是不可避免的.但是,正如您所指出的,对于公共方法尤其如此.当将大型方法重构为较小的方法时,我很少(如果有的话)直接在新方法中访问成员字段.这主要是为了更容易推理程序的行为.

以这种方式进行重构时,请确保将新方法标记为static不访问任何字段.这将使意图明确.


Viv*_*ath 5

引用《清洁代码》(一本优秀的书)的话,一个方法应该做一件事,并且只做一件事。如果您在一个方法中执行多项操作,那么可能意味着您需要将该逻辑提取到一个单独的方法中。它也使得遵循代码变得更加容易。所以我想说

问题 1:是的,将其分解(关注点分离)。

问题 2:总的来说,我认为拥有全局变量是一种不好的做法,除非绝对需要。至于使用私有属性(实例变量)本身而不是公共 getter 的一般问题,我没有看到使用 getter 的任何优势。例如,考虑:

function someFunc() {
  anotherFunc(this.a, this.b);
}

function anotherFunc(int paramA, int paramB) {
  //do stuff with paramA and paramB
}
Run Code Online (Sandbox Code Playgroud)

相对

function someFunc() {
  anotherFunc();
}

function anotherFunc() {
  //do stuff with this.a and this.b
}
Run Code Online (Sandbox Code Playgroud)

在某些时候,您必须使用来引用实例变量this。所以我看不出有什么优势。毕竟,您在班级内部,因此您可以完全访问私有成员。