2013-07-09 43 views
0

我有某些代碼模式(哪些日誌性能和每個函數的其他變量)需要在每個函數中出現,我不想一遍又一遍地重複代碼。下面是代碼的樣子:重複的代碼模式

public OutClass FUNC-X 
{ 
if (IsDebugEnabled) 
    { 
     Logger("Start DataLibrary: FUNC-X"); 
    } 
try 
{ 
    CheckInitSucceeded(); 

    GetAuthenticationTokens(); 

    var dm = new Manager(); 

    /** 
    * THIS SINGLE LINE IS THE VARIABLE PART 
    **/ 
    var output = dm.FUNC-X(...); 

    if (IsDebugEnabled) 
    { 
     var data = Serialize(output); 
     Logger(output); 
    } 
    return output; 
} 
catch (WebFaultException) 
{ 
    throw; 
} 
catch (OtherException ex) 
{ 
    if (Logger.IsErrorEnabled) 
    { 
     Logger.LogError("Exception in FUNC-X", ex); 
    } 
    throw new OtherException("Some Message"); 
} 
catch (Exception ex) 
{ 
    if (IsErrorEnabled) 
    { 
     Logger("Exception in FUNC-X", ex); 
    } 

    throw new Exception("Generic Exception"); 
} 
finally 
{ 
    if (IsDebugEnabled) 
    { 
     Logger("End FUNC-X"); 
    } 
    } 
} 

從本質上講,我只需要FUNC-Y或FUNC-Z到處這個名字出現,以取代FUNC-X,是有某種設計模式,我可以遵循?

如果問題很模糊,我很抱歉,我很樂意提供您提出的任何細節。

+0

在我看來,你只是在某種工廠模式之後..但沒有一個更好的例子,很難說.. –

+0

所以我想要的是,只要我創建一個新的功能,而不是複製和粘貼代碼我應該能夠告訴函數的名稱,它會自動完成用'Func-Y'替換'Func-X'的部分。 –

+0

結果總是OutClass類嗎?或者那個類取決於所謂的函數? – fcuesta

回答

1

是啊,有很多方法可以提供很好的日誌代碼。

  1. 使用aspect-oriented programming。有PostSharpSpring.NET。您可以使用log4net庫。所有這些在配置之後都支持方法名稱的寫入。

  2. 您可以使用T4並在編譯前爲所有funcs生成代碼。

  3. 您可以編寫一個接受Func<object> methodstring methodName的全局日誌記錄方法。假設你命名了你的日誌記錄方法LogAndExecute。然後給你打電話必須寫水木清華這樣的:

    LogAndExecute("func-x",() => dm.Func-X(/*your args*/)) 
    

    如果你有不同的返回類型不同的funcs中的問題,用generics

1

您可以使用簡單的委託接受變量部分作爲參數(如果沒有,的參數函數調用單行相同)

public void Function_X(Func<object,..> func) 
    { 
     if (IsDebugEnabled) 
     { 
       Logger("Start DataLibrary: FUNC-X"); 
     } 
     try 
     { 
      CheckInitSucceeded(); 

      GetAuthenticationTokens(); 

      var dm = new Manager(); 

      /** 
      * THIS SINGLE LINE IS THE VARIABLE PART 
      **/ 
     // var output = dm.FUNC-X(...); 
      var output = func(...); 

      if (IsDebugEnabled) 
      { 
       var data = Serialize(output); 
       Logger(output); 
      } 
      return output; 
     } 
     catch (WebFaultException) 
     { 
      throw; 
     } 
     catch (OtherException ex) 
     { 
      if (Logger.IsErrorEnabled) 
      { 
       Logger.LogError("Exception in FUNC-X", ex); 
      } 
      throw new OtherException("Some Message"); 
     } 
     catch (Exception ex) 
     { 
      if (IsErrorEnabled) 
      { 
       Logger("Exception in FUNC-X", ex); 
      } 

      throw new Exception("Generic Exception"); 
     } 
     finally 
     { 
      if (IsDebugEnabled) 
      { 
       Logger("End FUNC-X"); 
      } 
     } 
    } 
+0

不知道代表如何處理這個問題,我想用'Func-Y'替換'Func-Y'不僅在字符串部分,而且還要調用外部函數'dm.Func-X' –

+1

通過'經理「作爲委託的參數。並調用像'func(dm,<其他參數>' – Tilak

1

您可以創建一個接受函數求委託一個共同的功能:

static public TOutClass CommonFunc<TOutClass>(Func<Manager, TOutClass> func) 
    { 
     if (IsDebugEnabled) 
     { 
      Logger("Start DataLibrary: FUNC-X"); 
     } 
     try 
     { 
      CheckInitSucceeded(); 

      GetAuthenticationTokens(); 

      var dm = new Manager(); 
      TOutClass output = func(dm); 

      if (IsDebugEnabled) 
      { 
       var data = Serialize(output); 
       Logger(output); 
      } 
      return output; 
     } 
     catch 
      [...] 
    } 

你會寫你的功能:

public OutClass FUNC-X(...) 
{ 

    return CommonFunc(dm=>dm.FUNC-X(...)); 
}