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

时间:2011-01-07 16:46:47

标签: 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
}

我有两个问题:

  1. 是否应该不惜一切代价避免使用此类 if 语句?

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

  3. 感谢您的意见!

5 个答案:

答案 0 :(得分:13)

在这种情况下,我发现将一些逻辑移出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
}

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

一般来说,我想让if语句更简单。但你所有的条件都很简单。如果你真的需要测试那么多测试,那么我会保持它的状态。

答案 3 :(得分:1)

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

!String.Equals(ComboBoxA.SelectedValue.ToString(), DEFAULT_COMBO_A_CHOICE.ToString()

也可以写成:

ComboBoxA.SelectedValue.ToString()!=DEFAULT_COMBO_A_CHOICE

我认为DEFAULT_COMBO_A_CHOICE已经是toString si superflous的字符串。

围绕

的括号
(!String.IsNullOrEmpty(TextBoxB.Text)
|| !String.IsNullOrEmpty(TextBoxC.Text))

没有必要。

答案 4 :(得分:1)

IMO应该避免这种情况(尽管不是不惜一切代价)。他们很难阅读维护。

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

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

if (OrderDetailsSelected() && ShippingAddressProvided() )  
{

通过这种方式,您还可以避免表单中条件的重复。

其次,您可以使用Boolean Algebra来简化表达式和

使用Extract Method重构来移动条件,这些条件在函数中难以阅读以避免重复并使它们更具可读性。

对于前。条件

String.Equals(ComboBoxB.SelectedValue.ToString(), DEFAULT_COMBO_B_CHOICE.ToString())

可以提取到函数

private bool IsDefaultA() { return ... }