2013-01-07 63 views
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()被調用一次。我控制了源代碼,所以如果我需要公開某些方法或者創建一些方法的重載,我也可以這樣做。

回答

5

您可能想要製作FinishDisplaypublic並在消費者中調用它,而不是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(); 
} 
+0

+1 - 更好的主意。 – Rotem

+0

謝謝。 「myImpl」是指什麼? – Bohn

+1

爲了簡潔起見,我將組件A和B的兩個方法放入'myImpl'對象中。 'SuspendAutoFinish'和'ResumeAutoFinish'進入程序集B,而我的代碼中的用戶部分進入程序集A. –

5

假設調用FinishDisplay一直呆在裏面UpdateOrderView出於某種原因,你可以這樣做:

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

    int y = this.ListCount(); 

    //...... 

    if (doDisplay) FinishDisplay(y); 
} 

如果不是,爲什麼不單獨給它自己的方法和像提到的foreach後調用一次在評論中?