如何清理这些类型的重复else块?

时间:2013-12-13 23:41:57

标签: c#

我发现自己经常处理包含如下逻辑的代码库:

var _deliveryType = new Dictionary<String, String>();
if (_deliveryType.ContainsKey(fileName)) {
      if (contactPreference == SAMPLE_ENUM) {
         //Perform Action 1
      } else {
         //Perform Action 2
      }

} else {
    //Perform Action 2
}

问题的要点是,如果没有与该键/值对匹配的内容,则它会落入外部的else块中,但如果该键确实存在并且它没有与之关联的特定值,则完全相同执行外部其他操作。

简化此逻辑的最佳方法是什么,以便我不会两次调用相同的方法?这真的很愚蠢,但我想不出一个清理它的好方法。

4 个答案:

答案 0 :(得分:4)

对此的一个非常简单的答案可能是将两个if语句合并为一个。

var _deliveryType = new Dictionary<String, String>();
if (_deliveryType.ContainsKey(fileName) && contactPreference == SAMPLE_ENUM) {
    //Perform Action 1    
} else {
    //Perform Action 2
}

答案 1 :(得分:0)

如果您的方法调用类似于返回Foo(),那么您不需要其他。但这只有在你回来的时候

var _deliveryType = new Dictionary<String, String>();
if (_deliveryType.ContainsKey(fileName)) {
      if (contactPreference == SAMPLE_ENUM) {
         return action1()
      }
         return action2();

} 
  return action2();

答案 2 :(得分:0)

尝试类似

的内容
var _deliveryType = new Dictionary<String, String>();
if (!_deliveryType.ContainsKey(fileName) && contactPreference != SAMPLE_ENUM ) {        
  //Perform Action 2        
}else {
  //Perform Action 1
}

答案 3 :(得分:0)

如果真正的问题是重复代码:记得保持干燥(不要重复自己)。重构。

第一个切入可能是将重复的代码提取到独立的方法中:

void DoAction1( Dictionary<string,string> dict )
{
  // perform action 1
}
void DoAction2( Dictionary<string,string dict )
{
  // perform action 2
}

Dictionary<string,string> _deliveryType = GetDeliveryType() ;
if (_deliveryType.ContainsKey(fileName))
{
  if (contactPreference == SAMPLE_ENUM)
  {
    DoAction1(_deliveryType) ; 
  }
  else
  {
    DoAction2(_deliveryType) ;
  }
}
else
{
  DoAction2(_deliveryType) ;
}

这很有帮助,但你仍然需要在考虑3路分支的湿件中花费周期。如上所述,进一步的重构可能会重构if-then-else逻辑本身:

Dictionary<string,string> _deliveryType = GetDeliveryType() ;
bool isAction1 = _deliveryType.ContainsKey(fileName) && contactPreference == SAMPLE_ENUM ;
if ( isAction1 )
{
  DoAction1(_deliveryType) ; 
}
else
{
  DoAction2(_deliveryType) ;
}

您可以使用委托并进一步简化:

Dictionary<string,string> _deliveryType = GetDeliveryType() ;
Action<Dictionary<string,string>> action = _deliveryType.ContainsKey(fileName) && contactPreference == SAMPLE_ENUM ? DoAction1 : DoAction2 ;

action(_deliveryType) ;

现在你几乎是一条直线控制流。