这个多行if语句是否过于复杂?

The*_*uru 5 c# if-statement

我正在验证表单上的输入并尝试根据所使用的控件组合提示用户输入不正确的输入.

例如,我有2个组合框和3个文本框.2个组合框必须始终具有除第一个(默认)值以外的值,但可以填充三个中的一个,或三个中的一个,或者可以填充所有文本框以使表单有效.

在一个这样的场景中,我有一个6行if语句,试图使测试易于阅读:

if ((!String.Equals(ComboBoxA.SelectedValue.ToString(), DEFAULT_COMBO_A_CHOICE.ToString())
    && !String.IsNullOrEmpty(TextBoxA.Text)
    && !String.Equals(ComboBoxB.SelectedValue.ToString(), DEFAULT_COMBO_B_CHOICE.ToString()))        
    ||
    (!String.IsNullOrEmpty(TextBoxB.Text)
    || !String.IsNullOrEmpty(TextBoxC.Text)))
{
    //Do Some Validation
}
Run Code Online (Sandbox Code Playgroud)

我有两个问题:

  1. 是否应该不惜一切代价避免这种类型的if语句?

  2. 将此测试用另一种方法包装会更好吗?(这将是一个不错的选择,因为此验证将在多个场景中发生)

感谢您的意见!

Evi*_*ndy 14

在这种情况下,我发现将一些逻辑移出if语句并转换为一些更有意义的booleans是有帮助的.例如.

bool comboBoxASelected = !String.Equals(ComboBoxA.SelectedValue.ToString(), DEFAULT_COMBO_A_CHOICE.ToString());
bool comboBSelected = !String.Equals(ComboBoxB.SelectedValue.ToString(), DEFAULT_COMBO_B_CHOICE.ToString());
bool textBoxAHasContent = !String.IsNullOrEmpty(TextBoxA.Text);
bool textBoxBHasContent = !String.IsNullOrEmpty(TextBoxB.Text);
bool textBoxCHasContent = !String.IsNullOrEmpty(TextBoxC.Text);

bool primaryInformationEntered = comboBoxASelected && textBoxAHasContent && comboBSelected;
bool alternativeInformationEntered = textBoxBHasContent || textBoxCHasContent;

if (primaryInformationEntered || alternativeInformationEntered)
{
    //Do Some Validation
}
Run Code Online (Sandbox Code Playgroud)

显然,将组合和文本框命名为反映其实际内容.当有人必须在几个月后完成逻辑工作时,他们会感谢你.