不执行任何操作或抛出异常的方法
本文关键字:抛出异常 方法 操作 执行 任何 | 更新日期: 2023-09-27 18:36:12
我有一个很大的方法,其中一部分检查对象的状态,如果状态无效,则抛出异常。我应该提取方法吗?新方法"CheckState"将不执行任何操作或引发异常。
如果我理解正确,你的意思是说你的方法的一部分检查对象的状态,如果它无效,就会抛出异常。
您进一步询问是否应该将其移动到它自己的方法(检查对象状态并引发异常
的方法无效)。答案真的是;可能两者都不是。例外实际上应该只在"例外"情况下抛出。如果输入方法并期望对象处于有效状态,请像使用一样使用它。
如果发生意外情况,则捕获该异常并抛出"InvalidStateException"。(如果编程正确,这甚至也不是必需的。
如果输入方法并且不确定对象是否处于有效状态,则对象处于无效状态不是"意外"行为,应以不同的方式处理。
这就是您的Check
方法将到位的地方。它不应该抛出异常,但应该返回一个布尔值,这将决定你接下来要做什么。在您的情况下,无效对象是完全合理的,因此使用您的代码通过返回其valid_state boolean
的 check 方法来处理这种情况。
和这个描述了我在说什么。
约定是让Check—
返回bool
,而如果验证失败Verify—
会抛出异常。
例如,请参阅Dispatcher.CheckAccess
和Dispatcher.VerifyAccess
:
CheckAccess
和VerifyAccess
之间的区别在于CheckAccess
返回一个Boolean
,指示调用线程是否有权访问Dispatcher
,VerifyAccess
引发异常。
状态检查与状态更改代码分开甚至是一种很好的做法。 但是,如果您的类在这里和那里非常依赖状态,您可能应该查看状态设计模式。
在此模式中,行为差异是使用方法建模的,该方法针对每个 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(); }
}
如果它真的什么都不做,那么你应该能够安全地完全删除代码。
否则,代码必须执行某些操作。在这种情况下,您应该能够安全地创建一个单独的方法,这肯定会使您的代码更清晰。