C# 重复代码模式
我有特定的代码模式(记录每个函数的性能和其他变量),需要在每个函数中出现,我不想一遍又一遍地重复代码。下面是代码的样子:C# 重复代码模式,c#,c#-4.0,design-patterns,C#,C# 4.0,Design Patterns,我有特定的代码模式(记录每个函数的性能和其他变量),需要在每个函数中出现,我不想一遍又一遍地重复代码。下面是代码的样子: public OutClass FUNC-X { if (IsDebugEnabled) { Logger("Start DataLibrary: FUNC-X"); } try { CheckInitSucceeded(); GetAuthenticationTokens(); var dm = new Mana
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,无论这个名字出现在哪里,有什么样的设计模式可以遵循吗
很抱歉,如果问题含糊不清,我很乐意提供您询问的任何详细信息。您可以使用简单委托接受变量部分作为参数(如果单行函数调用的参数数量相同)
public void Function_X(Func Func)
{
如果(IsDebugEnabled)
{
记录器(“启动数据库:FUNC-X”);
}
尝试
{
checkinitsuccessed();
GetAuthenticationTokens();
var dm=新经理();
/**
*这一行是可变部分
**/
//var输出=dm.FUNC-X(…);
var输出=func(…);
如果(IsDebugEnabled)
{
变量数据=序列化(输出);
记录器(输出);
}
返回输出;
}
捕获(WebFaultException)
{
投掷;
}
捕获(其他异常除外)
{
如果(Logger.iserror已启用)
{
Logger.LogError(“FUNC-X中的异常”,ex);
}
抛出新的OtherException(“某些消息”);
}
捕获(例外情况除外)
{
如果(已启用)
{
记录器(“FUNC-X中的异常”,ex);
}
抛出新异常(“一般异常”);
}
最后
{
如果(IsDebugEnabled)
{
记录器(“End FUNC-X”);
}
}
}
您可以使用简单委托接受变量部分作为参数(如果单行函数调用的参数数量相同)
public void Function_X(Func Func)
{
如果(IsDebugEnabled)
{
记录器(“启动数据库:FUNC-X”);
}
尝试
{
checkinitsuccessed();
GetAuthenticationTokens();
var dm=新经理();
/**
*这一行是可变部分
**/
//var输出=dm.FUNC-X(…);
var输出=func(…);
如果(IsDebugEnabled)
{
变量数据=序列化(输出);
记录器(输出);
}
返回输出;
}
捕获(WebFaultException)
{
投掷;
}
捕获(其他异常除外)
{
如果(Logger.iserror已启用)
{
Logger.LogError(“FUNC-X中的异常”,ex);
}
抛出新的OtherException(“某些消息”);
}
捕获(例外情况除外)
{
如果(已启用)
{
记录器(“FUNC-X中的异常”,ex);
}
抛出新异常(“一般异常”);
}
最后
{
如果(IsDebugEnabled)
{
记录器(“End FUNC-X”);
}
}
}
是的,有很多方法可以提供好的日志代码
Func方法
和string方法名
的全局日志记录方法。假设您将日志记录方法命名为LogAndExecute
。那么要打电话,你必须写smth,比如:
LogAndExecute("func-x", () => dm.Func-X(/*your args*/))
如果函数的不同返回类型出现问题,请使用是的,有很多方法可以提供好的日志代码
Func方法
和string方法名
的全局日志记录方法。假设您将日志记录方法命名为LogAndExecute
。那么要打电话,你必须写smth,比如:
LogAndExecute("func-x", () => dm.Func-X(/*your args*/))
如果函数的不同返回类型出现问题,请使用您可以创建一个接受Func委托的公共函数:
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
[...]
}
您可以创建一个接受Func委托的公共函数:
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
[...]
}
在我看来,你只是在追求某种工厂模式。。但是如果没有更好的例子,就很难说了。因此,我想要的是,每当我创建一个新函数而不是复制和粘贴代码时,我应该能够说出函数的名称,并且它会自动将
Func-X
替换为Func-Y
。结果总是超出类吗?或者该类依赖于调用的函数?在我看来,您只是在追求某种工厂模式。。但是如果没有更好的例子,就很难说了。因此,我想要的是,每当我创建一个新函数而不是复制和粘贴代码时,我应该能够说出函数的名称,并且它会自动将Func-X
替换为Func-Y
。结果总是超出类吗?或者该类取决于调用的函数?不确定委托将如何处理此问题,我想用Func-Y
替换Func-X
,不仅在字符串部分,而且在调用外部函数dm.Func-X
时将Manager
作为委托的参数。调用类似于,func(dm,
不确定代理将如何处理此问题,我想用func-Y
替换func-X
,不仅在字符串部分,而且在对外部函数的调用中