2

このようなもの:

アセンブリ (A):

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 に答える