C# 这个多行if语句太复杂了吗?
我正在验证表单上的输入,并试图根据使用的控件组合提示用户输入不正确的内容 例如,我有2个组合框和3个文本框。两个组合框必须始终具有第一个(默认)值以外的值,但可以填充三个组合框中的一个、三个组合框中的两个或所有文本框以使表单有效 在一个这样的场景中,我有一个6行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
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
}
我有两个问题:
- 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并被接受,我同意这将是最容易维护的方式,谢谢!