如果检查它的话,我的代码对于if
- else
非常混乱。分支和嵌套分支的数量非常大(如果是 - 否则超过20,否则也是嵌套的)。它使我的代码更难以阅读,并可能是一个性能损失。我的应用程序检查它从用户获得的很多条件,因此应用程序必须始终检查不同的情况,例如:
如果文本框文本不为0,请继续下一步...
if ((StartInt != 0) && (EndInt != 0))
{
然后在这里检查用户是否选择了日期:
if ((datePickerStart.SelectedDate == null) || (datePickerEnd.SelectedDate == null))
{
MessageBox.Show("Please Choose Dates");
}
在这里,如果日期选择器不为空,则继续使用代码...
else if ((datePickerStart.SelectedDate != null) && (datePickerEnd.SelectedDate != null))
{
// CONDITIONS FOR SAME STARTING DAY AND ENDING DAY.
if (datePickerStart.SelectedDate == datePickerEnd.SelectedDate)
{
if (index1 == index2)
{
if (StartInt == EndInt)
{
if (radioButton1.IsChecked == true)
{
printTime3();
}
else
{
printTime();
}
}
这只是正在进行的检查的一小部分。其中一些是功能,一些是输入验证。
有没有什么方法可以让它更具可读性而不是性能损失?
答案 0 :(得分:13)
这不是一场表演生猪。关于如何解决这些常见问题的精彩博文是 Flattening Arrow Code 。
答案 1 :(得分:3)
我在这里看到一些混合验证。尝试从其他字段移动一个字段,并单独验证它们,如下所示:
if (StartInt == 0 || EndInt == 0)
{
MessageBox.Show("Please Choose Ints");
return;
}
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null)
{
MessageBox.Show("Please Choose Dates");
return;
}
在这种方法中,您总是会告诉用户他做错了什么,而且您的代码更简单。
的更多信息答案 2 :(得分:2)
一种方法是通过以下列方式封装复杂条件来重构:
public bool DateRangeSpecified
{
get
{
return (datePickerStart.SelectedDate != null)
&&
(datePickerEnd.SelectedDate != null)
&& StartInt != 0 && EndInt != 0;
}
}
然后使用这些“条件外观”属性
答案 3 :(得分:0)
使用return
语句停止执行块。
例如,
void Test()
{
if (StartInt==0 || EndInt==0)
{
return;
}
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null)
{
MessageBox.Show("Please Choose Dates");
return;
}
}
答案 4 :(得分:0)
一些轻微的重构让我更容易阅读。我删除了无关的括号并合并了多个真正只是AND逻辑的IF语句。
if (StartInt == 0 || EndInt == 0)
return;
if (datePickerStart.SelectedDate == null || datePickerEnd.SelectedDate == null)
{
MessageBox.Show("Please Choose Dates");
return;
}
if (datePickerStart.SelectedDate != null
&& datePickerEnd.SelectedDate != null
&& datePickerStart.SelectedDate == datePickerEnd.SelectedDate
&& index1 == index2
&& StartInt == EndInt)
{
if (radioButton1.IsChecked == true)
printTime3();
else
printTime();
}
答案 5 :(得分:0)
您可以使用有意义的名称定义自己的谓词或泛型函数,并将逻辑封装到这些中。
以下是一些谓词的代码示例:
public Predicate<DateTime> CheckIfThisYear = a => a.Year == DateTime.Now.Year;
public Func<DateTime, int, bool> CheckIfWithinLastNDays = (a, b) => (DateTime.Now - a).Days < b;
现在您可以轻松编写代码
if (CheckIfThisYear(offer) && CheckIfWithinLastNDays(paymentdate,30)) ProcessOrder();
考虑使用通用委托,例如Func<>
和Delegate<>
来使用lambda表达式编写条件的小块 - 它既可以节省空间,又可以使代码更具人性化。< / p>