2013-07-09 25 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(...)); 
}