我发现自己经常处理包含如下逻辑的代码库:
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块中,但如果该键确实存在并且它没有与之关联的特定值,则完全相同执行外部其他操作。
简化此逻辑的最佳方法是什么,以便我不会两次调用相同的方法?这真的很愚蠢,但我想不出一个清理它的好方法。
答案 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) ;
现在你几乎是一条直线控制流。