如果你不需要的Copy
的結果,你仍然可以使用Action<string, string>
或任何類型是:
public ActionResult Copy(string id, string targetId)
{
CopyOrMove((x, y) => Copy(x, y));
}
public ActionResult Move(string id, string targetId)
{
CopyOrMove(id, targetId, (x, y) => Move(x, y));
}
private void CopyOrMove(string id, string targetId,
Action<string, string> fileAction)
{
// lot of similar code
fileAction(sourcePageRef, destinationPageRef);
// lot of similar code
}
這是一個選項。這取決於「很多類似代碼」的確在做什麼,以及第二個塊是否需要第一個塊的結果。例如,如果你可以這樣做:
public ActionResult Copy(string id, string targetId)
{
string sourcePageRef = PrepareSourceFile(id, targetId);
string targetPageRef = PrepareTargetFile(targetId);
Copy(sourcePageRef, targetPageRef);
CleanUp(sourcePageRef, targetPageRef);
return ...;
}
public ActionResult Move(string id, string targetId)
{
string sourcePageRef = PrepareSourceFile(id, targetId);
string targetPageRef = PrepareTargetFile(targetId);
Move(sourcePageRef, targetPageRef);
CleanUp(sourcePageRef, targetPageRef);
return ...;
}
...那麼這可能比重構委託方式更簡單。
如果您可以放棄複製操作的結果,通常會使用立面模式。使用相同的簽名實現複製和移動你的外觀,然後你可以反射性地或不管你喜歡地稱它們。否則,我首先將通用代碼移動到輔助方法中。 –