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”);
}
}
}

是的,有很多方法可以提供好的日志代码

  • 使用。有和。你可以使用图书馆。config之后的所有方法都支持写入方法名

  • 您可以在编译之前使用并生成所有函数的代码

  • 您可以编写一个接受
    Func方法
    string方法名
    的全局日志记录方法。假设您将日志记录方法命名为
    LogAndExecute
    。那么要打电话,你必须写smth,比如:

    LogAndExecute("func-x", () => dm.Func-X(/*your args*/))
    
    如果函数的不同返回类型出现问题,请使用


  • 是的,有很多方法可以提供好的日志代码

  • 使用。有和。你可以使用图书馆。config之后的所有方法都支持写入方法名

  • 您可以在编译之前使用并生成所有函数的代码

  • 您可以编写一个接受
    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
    ,不仅在字符串部分,而且在对外部函数的调用中