Я хочу оптимизировать этот код, чтобы уменьшить количество if
операторов. Может быть, было бы лучше использовать много классов и позволить классам обрабатывать каждое требуемое действие?
Это может быть рисунок ткани? Или можно использовать более 30 похожих if
операторов?
Я пытался создать класс Dictionary
с классами string
и object
. Но я не мог заставить его работать (или мои навыки не достаточно хороши)
if (node[DATA_CONNECTION_ELEMENT] != null)
{
return new DataConnectionPropertyDataBinding(form, node[DATA_CONNECTION_ELEMENT], inputableEntity);
}
else if (node[FORM_PARAMETER_ELEMENT] != null)
{
return new FormParameterDataBinding(form, node[FORM_PARAMETER_ELEMENT], inputableEntity);
}
// + 30 more else ifs
else if (node[COMMAND_ELEMENT] != null)
{
return new CommandResultDataBinding(form, node[COMMAND_ELEMENT], inputableEntity);
}
else if (node[CONDITION_ELEMENT] != null)
{
return new ConditionDataBinding(form, node[CONDITION_ELEMENT], inputableEntity);
}
else if (node[CLIPBOARD_ELEMENT] != null)
{
return new ClipboardDataBinding(form, node[CLIPBOARD_ELEMENT], inputableEntity);
}
else
{
return new ConstantDataBinding(form, node);
}
Хотите, чтобы это выглядело как
foreach (var item in allThatShareSomeInterface)
{
if (item.CanHandle(node.Atributes[0]))
{
return item.neededObject();
}
}
Вот ответ. Как это действительно работает.
Dictionary<string, Type> allObjects = new Dictionary<string, Type>();
allObjects.Add(CONDITION_ELEMENT, typeof(ConditionDataBinding));
allObjects.Add(DATA_TYPE_FORMAT_ELEMENT, typeof(DataTypeFormatDataBinding));
allObjects.Add(DATA_TYPE_CONVERT_ELEMENT, typeof(DataTypeConvertDataBinding));
allObjects.Add(FORM_PARAMETER_ELEMENT, typeof(FormParameterDataBinding));
allObjects.Add(FORM_ELEMENT, typeof(FormPropertyDataBinding));
allObjects.Add(STRING_ELEMENT, typeof(StringFormatDataBinding));
allObjects.Add(FORMULA_ELEMENT, typeof(FormulaDataBinding));
allObjects.Add(COMMAND_ELEMENT, typeof(CommandResultDataBinding));
// + many
foreach (var pair in allObjects)
{
if (node[pair.Key] != null)
{
ConstructorInfo ctor = pair.Value.GetConstructor(new[] { typeof(IWorkflowForm), typeof(XmlNode), typeof(IInputable) });
return ctor.Invoke(new object[] { form, node[pair.Key], inputableEntity });
}
}