无效或抛出异常的方法

时间:2012-06-04 20:23:18

标签: c# oop refactoring

我有一个很大的方法,其中一部分检查对象的状态,如果状态无效则抛出异常。我应该提取方法吗?新方法'CheckState'将不执行任何操作或抛出异常。

4 个答案:

答案 0 :(得分:1)

约定是Check—返回bool,而Verify—会在验证失败时抛出异常。

例如,请参阅Dispatcher.CheckAccessDispatcher.VerifyAccess

  

CheckAccessVerifyAccess之间的差异为CheckAccess,返回Boolean,表示调用线程是否有权访问DispatcherVerifyAccess抛出异常。

答案 1 :(得分:1)

如果我理解正确,你的意思是说你的方法的一部分检查对象的状态,如果它是无效的则抛出异常。

您还在询问是否应将其移动到自己的方法(检查对象状态并抛出异常的方法无效)。

答案真的是;可能都没有。实际上只应该在“特殊”情况下抛出异常。如果输入方法并期望对象处于有效状态,那么就像使用它一样使用它。

如果出现意外情况,则捕获该异常并抛出“InvalidStateException”。 (如果编程正确,这甚至不需要。)

如果您输入的方法并且不确定您的对象是否处于有效状态,那么它处于无效状态是“意外”行为,应该以不同方式处理。

这是您的Check方法到位的地方。它不应该抛出异常但应该返回一个布尔值,这将决定你接下来要做什么。您的案例中的无效对象是完全合理的,因此请使用您的代码使用返回其valid_state boolean的检查方法来处理该案例。

Thisthis描述了我在说什么。

答案 2 :(得分:1)

将状态检查与状态更改代码分开是一种很好的做法。但是,如果你的班级在这里和那里依赖于州,你应该看看State Design Pattern

在此模式中,行为差异通过使用方法建模,对每个州类实施不同。

这可能比以下更好地实现,但它给你一个品味:

class FooState {
   FooState handleFoo();
   FooState handleBar();
}

class ValidState {
   FooState handleFoo(){...
   }
   FooState handleBar(){
      return InvalidState(stateful);
   }
}

class InvalidState {
   FooState handleFoo() { throw InvalidState(); }
   FooState handleBar() {

       return ValidState(stateful);
   }
}

class StatefulObject {
   public FooState state;
   public void foo(){ state=state.handleFoo(); }
   public void bar(){ state=state.handleBar(); }
}

答案 3 :(得分:0)

如果它什么都不做,那么你应该能够安全地完全删除代码。

否则,代码必须做一些事情。在这种情况下,您应该能够安全地创建一个单独的方法,这肯定会使您的代码更清晰。