重复代码模式

时间:2013-07-09 00:02:50

标签: c# c#-4.0 design-patterns

我有一定的代码模式(每个函数的日志性能和其他变量)需要出现在每个函数中,我不想一遍又一遍地重复代码。这是代码的样子:

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到处出现这个名称,是否有某种设计模式可供我使用?

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

3 个答案:

答案 0 :(得分: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");
            }
        }
    }

答案 1 :(得分:1)

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

  1. 使用aspect-oriented programming。有PostSharpSpring.NET。您可以使用log4net库。 config之后所有这些都支持编写方法名称。

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

  3. 您可以编写一个接受Func<object> methodstring methodName的全局日志记录方法。假设您将日志记录方法命名为LogAndExecute。然后打电话给你必须写如:

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

    如果你的func的不同返回类型出现问题,请使用generics

答案 2 :(得分: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(...));
}