C# 这个多行if语句太复杂了吗?

C# 这个多行if语句太复杂了吗?,c#,if-statement,C#,If Statement,我正在验证表单上的输入,并试图根据使用的控件组合提示用户输入不正确的内容 例如,我有2个组合框和3个文本框。两个组合框必须始终具有第一个(默认)值以外的值,但可以填充三个组合框中的一个、三个组合框中的两个或所有文本框以使表单有效 在一个这样的场景中,我有一个6行if语句,试图使测试易于阅读: if ((!String.Equals(ComboBoxA.SelectedValue.ToString(), DEFAULT_COMBO_A_CHOICE.ToString()) &&am

我正在验证表单上的输入,并试图根据使用的控件组合提示用户输入不正确的内容

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

在一个这样的场景中,我有一个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
}
我有两个问题:

  • 应该不惜一切代价避免这种类型的if语句吗

  • 用另一种方法进行测试是否更好?(这将是一个很好的选择,因为此验证将在多个场景中进行)

  • 谢谢你的意见

    • a) 不一定要不惜一切代价避免。代码是有效的。但它肯定是混乱的,令人困惑的,我想说的是,它可能很难维持
    • b) 对。给它一个相关的名称,以便代码读取器知道那里发生了什么

    我个人认为这样的代码不会有大问题。(最后一组括号似乎没有必要。)


    一般来说,我希望我的if语句更简单。但你所有的条件都很简单。如果您真的需要测试那么多测试,那么我会保持原样。

    它不是很可读是的。但你可以缩短它:

    !String.Equals(ComboBoxA.SelectedValue.ToString(), DEFAULT_COMBO_A_CHOICE.ToString()
    
    也可以写成:

    ComboBoxA.SelectedValue.ToString()!=DEFAULT_COMBO_A_CHOICE
    
    我假设默认的组合选择已经是字符串到字符串的超级组合

    还有括号

    (!String.IsNullOrEmpty(TextBoxB.Text)
    || !String.IsNullOrEmpty(TextBoxC.Text))
    

    在这种情况下,我发现将一些逻辑从if语句中移到一些更具意义的布尔语句中会有所帮助。例如

    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
    }
    

    显然,命名组合框和文本框以反映其实际内容。当有人在接下来的几个月里不得不通过逻辑来解决问题时,他们会感谢你。

    在我看来,这种情况应该避免(尽管不是不惜一切代价)。它们很难阅读和维护

    有几种方法可以做到这一点

    尝试根据条件所代表的行为对条件进行分组。比如说

    if (OrderDetailsSelected() && ShippingAddressProvided() )  
    {
    
    这样也可以避免表单中的条件重复

    其次,可以使用简化表达式和

    使用重构来移动难以在函数中读取的条件,以避免重复并使其更具可读性

    例如,条件

    String.Equals(ComboBoxB.SelectedValue.ToString(), DEFAULT_COMBO_B_CHOICE.ToString())
    
    可以提取到函数中

    private bool IsDefaultA() { return ... }
    

    这比把它压缩成一行要好。可能是离题:我通常更喜欢
    TextBoxA.Text.Trim()
    ,以确保意外输入的空格不算数。@Uwe Keim,我确实使用了那些测试,你的测试不是离题,只是因为我试图快速写出问题而没有包括在这里。+1并被接受,我同意这将是最容易维护的方式,谢谢!