2016-01-12 3 views
2

У меня есть два идентичных методов, но один из них оператор возврата внутри try catchКак избежать дублирования кода внутри двух методов?

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

Как собрать идентичную часть и создать новый метод с этой частью?

+1

Я не понимаю ваш вопрос, что не так с кодом, который у вас здесь есть? http://stackoverflow.com/help/how-to-ask – CodingGorilla

+0

Вы должны реорганизовать свой код и позвонить A Внутри B, где B расширяет предложение уловить A, вы должны выбросить ошибку, чтобы зацепиться на верхнем уровне (B mehtod) – darkndream

+0

Если я что-то не упустил, этот код вообще не будет компилироваться. Вы ссылаетесь на 'agent' в' A', но он не существует в 'A', только в' B'. Эта строка в 'A' должна быть' var cacheEntry = UpdateAgentMetadataCacheEntry (agent.Id, true, false); '?? – Tim

ответ

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, очевидно. Я предполагаю, что разница в типе параметра в действительности не является проблемой.

+2

'UpdateAgentMetadataCacheEntry' имеет разные значения параметров в каждом методе – user1666620

+0

@ user1666620 Просто передайте параметр bool как параметр? –

+0

@ user1666620: Упс, я этого не видел. Будет редактировать. –

0

Как сказал Джон, вам не нужен метод 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(); 
    } 
} 
+0

ваш метод 'AnotherA' использует объект, который не существует, поэтому он не будет компилироваться. – user1666620

+0

Получил опечатку. Изменен «агент» на «agentId». – joordan831

+0

все еще не так, потому что 'UpdateAgentMetadataCacheEntry' принимает объект' agent', а не guid. – user1666620

Смежные вопросы