如何在两个方法中避免代码重复?

时间:2016-01-12 17:12:27

标签: c#

我有两个相同的方法,但其中一个方法在try catch

中有return语句
public void A(Guid agentId)
{
     var agent = _agentsProvider.GetAgentById(agentId);
     var updateCompletionSource = C(agentId);
     try
     {
         var cacheEntry = UpdateAgentMetadataCacheEntry(agent, true, false);
         updateCompletionSource.SetResult(cacheEntry);
     }
     catch (Exception e)
     {
         updateCompletionSource.SetException(e);
     }
}

private Entry B(IAgent agent)
{
     var updateCompletionSource = C(agent.Id);
     try
     {
          var cacheEntry = UpdateAgentMetadataCacheEntry(agent, false, false);
          updateCompletionSource.SetResult(cacheEntry);
          return cacheEntry;
      }
      catch (Exception e)
      {
          updateCompletionSource.SetException(e);
          return GetPreviousCacheEntry();
      }
}

如何使用此部件收集相同的部件并创建新方法?

2 个答案:

答案 0 :(得分:11)

除非GetPreviousCacheEntry可能会产生有问题的副作用,否则我觉得您根本不需要方法A

如果您对它不感兴趣,只需调用方法B并忽略返回值。

正如评论中所指出的那样,方法除了返回语句之外不是 - 因为它们对UpdateAgentMetadataCacheEntry使用不同的第二个参数,并且它们也有不同的参数(一个有Guid,一个有Agent)。您可以将其重构为:

private Entry B(IAgent agent, bool foo)
{
     var updateCompletionSource = C(agent.Id);
     try
     {
          var cacheEntry = UpdateAgentMetadataCacheEntry(agent, foo, false);
          updateCompletionSource.SetResult(cacheEntry);
          return cacheEntry;
      }
      catch (Exception e)
      {
          updateCompletionSource.SetException(e);
          return GetPreviousCacheEntry();
      }
}

... foo的名字很明显。我假设参数类型的不同并不是现实中的问题。

答案 1 :(得分:0)

像Jon说的那样,你不需要方法A.只需为布尔值添加另一个参数。

public void A(Guid agentId)
{
    var agent = _agentsProvider.GetAgentById(agentId);
    AnotherA(agent, true);
}

private Entry B(IAgent agent)
{
    return AnotherA(agent, false);
}

private Entry AnotherA(IAgent agent, bool a)
{
    try
    {
         var cacheEntry = UpdateAgentMetadataCacheEntry(agent, a, false);
         updateCompletionSource.SetResult(cacheEntry);
         return cacheEntry;
    }
    catch (Exception e)
    {
        updateCompletionSource.SetException(e);
        return GetPreviousCacheEntry();
    }
}