不执行任何操作或抛出异常的方法

本文关键字:抛出异常 方法 操作 执行 任何 | 更新日期: 2023-09-27 18:36:12

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

不执行任何操作或抛出异常的方法

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

您进一步询问是否应该将其移动到它自己的方法(检查对象状态并引发异常

的方法无效)。

答案真的是;可能两者都不是。例外实际上应该只在"例外"情况下抛出。如果输入方法并期望对象处于有效状态,请像使用一样使用它。

如果发生意外情况,则捕获该异常并抛出"InvalidStateException"。(如果编程正确,这甚至也不是必需的。

如果输入方法并且不确定对象是否处于有效状态,则对象处于无效状态不是"意外"行为,应以不同的方式处理。

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

这个

和这个描述了我在说什么。

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

例如,请参阅Dispatcher.CheckAccessDispatcher.VerifyAccess

CheckAccessVerifyAccess 之间的区别在于CheckAccess返回一个Boolean,指示调用线程是否有权访问DispatcherVerifyAccess引发异常。

状态检查与状态更改代码分开甚至是一种很好的做法。 但是,如果您的类在这里和那里非常依赖状态,您可能应该查看状态设计模式。

在此模式中,行为差异是使用方法建模的,该方法针对每个 State 类以不同的方式实现。

这可能比下面更好地实现,但它让你尝到了:

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(); }
}

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

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