【发布时间】:2010-09-08 08:49:48
【问题描述】:
我目前正在尝试重组我的程序,使其更加面向对象并更好地实现已知模式等。
我有很多嵌套的 IF 语句,想摆脱它们。我该怎么办?我的第一种方法是在异常情况下完成它,例如
public static Boolean MyMethod(String param) {
if (param == null)
throw new NullReferenceException("param may not be null");
if (param.Equals("none") || param.Equals("0") || param.Equals("zero"))
throw new ArgumentNullException("param may not be zero");
// Do some stuff with param
// This is not executed if param is null, as the program stops a soon
// as one of the above exceptions is thrown
}
该方法在应用程序的主类中使用,例如
static void Main() {
try {
Boolean test = MyClass.MyMethod(null); // Will throw an exception
} catch (Exception ex) {
MessageBox.Show(ex.Message, "Error");
}
我认为这非常好,因为它可以防止嵌套语句,并且几乎所有方法操作都很好地安排在一个层次上。
与 IF 语句一样,该方法看起来像这样
public Boolean MyMethod(String param) {
if (param != null) {
if (!param.Equals("none") && !param.Equals("0") && !param.Equals("zero")) {
// Do some stuff with param
} else {
MessageBox.Show("param may not be zero", "Error");
} else {
MessageBox.Show("param may not be null", "Error");
}
}
我觉得它非常、非常丑陋且难以维护。
现在,问题是;这种方法好吗?我知道,这可能是主观的,但你如何克服嵌套的 IF(1 或 2 级还不错,但之后会变得更糟......)
【问题讨论】:
-
这可能只是示例代码,但您确实应该避免抛出异常。使用 ArgumentNullException 等。
-
也许更重要的是你不应该抛出然后捕获这样的异常。
-
这是示例代码,我总是尝试为案例抛出更好的命名异常。而且捕获当然不会以相同的方法发生,它是在应用程序的更高级别上完成的,或多或少是在它们冒泡给用户之前完成的。
-
好吧,这更有意义。也许您可以更新问题以更清楚地反映这一点。
-
除了例外,我认为这个问题非常好。这完全是为了阐明逻辑和可读性,这一章经常被跳过。
标签: c# design-patterns exception if-statement