这样的事情:
组件(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()
只被调用一次。我控制了源代码,所以如果我需要公开某些方法或者创建一些方法的重载,我也可以这样做。
答案 0 :(得分:5)
假设FinishDisplay
的来电由于某种原因必须留在UpdateOrderView
内,您可以这样做:
private void UpdateOrderView(Whatever x, bool doDisplay)
{
// more code....
int y = this.ListCount();
//......
if (doDisplay) FinishDisplay(y);
}
如果没有,为什么不将它与自己的方法分开,并在评论中提到的foreach
之后调用一次?
答案 1 :(得分:5)
您可能需要FinishDisplay
public
并在消费者中调用它而不是UpdateOrderView
。如果您需要更通用或显式的界面,您可以实现类似Windows Form的Control.SuspendLayout
和Control.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();
}