我有很多這樣的(〜30)方法WCF服務:從簡單的方法中刪除重複的代碼 - 走得太遠?
public Foo GetFooById(string id)
{
try
{
return FooLogic.GetById(id);
}
catch (Exception ex)
{
throw LogAndThrowFaultException(ex);
}
}
的代碼,這些方法是完全不同的是將try塊一條線一樣。這很簡單,我甚至已經抽象日誌並拋出一個異常。
乾的精神,我可以再進一步,做到這一點:
public Foo GetFooById(string id)
{
return PerformServiceOperation<Foo>(() => FooLogic.GetById(id));
}
對於這項工作,這個方法會處理重複的try/catch代碼,並調用每個FUNC:
private T PerformServiceOperation<T>(Func<T> func)
{
try
{
return func.Invoke();
}
catch (Exception ex)
{
throw LogAndThrowFaultException(ex);
}
}
這太過分了嗎?代碼是否已經儘可能簡單,並且應該單獨保留?或者,將func傳遞給helper方法並讓該方法處理重複try/catch是個好主意?我也關心可讀性。我認爲對輔助方法的調用有點難看。
DRY本身並不是終點;它的目的是*降低維護成本*。多少錢一小時才能做出這樣的改變,多少錢才能做出這樣的改變,從長遠來看可以節省您的時間?我會稱這是浪費你寶貴的時間;花你的寶貴時間編寫測試用例或者查看規範或實現新功能或編寫性能監控工具;所有這些東西都會有更大的投資回報。 –
埃裏克說什麼。你的「乾的精神」的例子已經是乾的;你所做的只是增加一些額外的儀式。 –
我同意@EricLippert。而且這種抽象級別只會讓你的代碼更難閱讀,因此難以維護。沒有任何模式,原則或方法論可行。只有在他們有意義時才使用它們,並在達到遞減(甚至負數)回報點時停止。 –