2

像这样的东西:

组装(一):

private void MoveItems(someCollection)
{
   // more code....

   foreach( item x in someCollection)
   {
      int x = getXFoo();
      assemblyB.UpdateOrderView(x)
   }

   //more code....
}

组装(B):

private void UpdateOrderView(x)
{
    // more code....

    int y = this.ListCount();

    //......

    FinishDisplay(y)
}

我们调用了MoveItems()一个集合和 for-each 循环。因此,如果集合中有 600 个项目,我们也会调用FinishDisplay()方法 600 次。但这就是我需要重构的地方。我不需要FinishDisplay()每次都为集合中的每个项目调用。如果我能在最后调用一次就足够了。

所以我正在寻找一种方法来重构这段代码,以便FinishDiplay()只调用一次。我可以控制源代码,所以如果我需要公开一些方法或创建一些方法的重载,我也可以这样做。

4

2 回答 2

5

假设由于某种原因调用FinishDisplay必须留在内部,您可以这样做:UpdateOrderView

private void UpdateOrderView(Whatever x, bool doDisplay)
{
    // more code....

    int y = this.ListCount();

    //......

    if (doDisplay) FinishDisplay(y);
}

foreach如果不是,为什么不将它与它自己的方法分开并在评论中提到的类似之后调用它一次?

于 2013-01-07T16:04:07.543 回答
5

您可能想FinishDisplay public在消费者中制作和调用它,而不是UpdateOrderView. 如果您需要更通用或显式的接口,您可以实现类似 Windows 窗体Control.SuspendLayoutControl.ResumeLayout方法的模式:

private bool autoFinish = true;

public void SuspendAutoFinish() { this.autoFinish = false; }
public void ResumeAutoFinish() { this.autoFinish = true; FinishDisplay(); }

private void UpdateOrderView() {
  // ...
  if(this.autoFinish) FinishDisplay();
}

// consumer
try {
  myImpl.SuspendAutoFinish();
  myImpl.MoveItems(myCollection);
}
finally {
  myImpl.ResumeAutoFinish();
}
于 2013-01-07T16:05:15.650 回答