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,有没有我可以遵循的某种设计模式?

如果问题含糊不清,我很抱歉,我很乐意提供您询问的任何细节。

4

3 回答 3

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");
            }
        }
    }
于 2013-07-09T00:09:02.747 回答
1

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

  1. 使用面向方面的编程。有PostSharpSpring.NET。您可以使用log4net库。config 后都支持写方法名。

  2. 您可以在编译之前使用T4并为所有功能生成代码。

  3. 您可以编写一种接受Func<object> method和的全局日志记录方法string methodName。假设您命名了您的日志记录方法LogAndExecute。然后打电话给你必须写这样的东西:

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

    如果您的 func 的不同返回类型有问题,请使用泛型

于 2013-07-09T00:23:34.213 回答
1

您可以创建一个接受 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
            [...]
    }

你会把你的函数写成:

public OutClass FUNC-X(...)
{

   return CommonFunc(dm=>dm.FUNC-X(...));
}
于 2013-07-09T00:27:27.697 回答