Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法,该方法不执行任何操作或引发异常_C#_Oop_Refactoring - Fatal编程技术网

C# 方法,该方法不执行任何操作或引发异常

C# 方法,该方法不执行任何操作或引发异常,c#,oop,refactoring,C#,Oop,Refactoring,我有一个大方法,其中一部分检查对象的状态,如果状态无效,则抛出异常。我应该提取一个方法吗?新方法“CheckState”将不执行任何操作或引发异常。如果它确实不执行任何操作,那么您应该能够安全地完全删除代码 否则,代码必须执行某些操作。在这种情况下,您应该能够安全地创建一个单独的方法,它肯定会使您的代码更干净。惯例是Check-返回bool,而Verify-将在验证失败时抛出异常 例如,参见和: CheckAccess和VerifyAccess之间的区别在于CheckAccess返回一个Bool

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

如果它确实不执行任何操作,那么您应该能够安全地完全删除代码


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

惯例是
Check-
返回
bool
,而
Verify-
将在验证失败时抛出异常

例如,参见和:

CheckAccess
VerifyAccess
之间的区别在于
CheckAccess
返回一个
Boolean
,指示调用线程是否有权访问
调度程序
,并且
VerifyAccess
引发异常


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

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

答案确实是;可能两者都没有。只有在“异常”情况下才应该抛出异常。如果输入方法并希望对象处于有效状态,则将其视为有效状态使用

如果发生意外情况,则捕获该异常并抛出“InvalidStateException”。(如果编程正确,也不需要这样做。)

如果您输入了方法,但不确定对象是否处于有效状态,则该对象处于无效状态不是“意外”行为,应以不同方式处理

这就是您的
检查方法的作用。它不应该抛出异常,但可能会返回一个布尔值,它将决定您接下来要做什么。案例中的无效对象是完全合理的,因此使用您的代码通过返回其
有效状态布尔值的check方法来处理该案例


请描述我所说的。

将状态检查与状态更改代码分开甚至是一种很好的做法。然而,如果您的类在很大程度上依赖于这里和那里的状态,那么您可能应该看看

在这个模式中,行为的差异是通过使用一个方法来建模的,该方法对每个状态类都有不同的实现

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

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

有关堆栈溢出的问题应以英语提出。那不是英语。这是英语。说真的,像这样的问题怎么能得到4票以上的选票呢?@Kendall Frey:我不赞成这种对新用户的不耐烦和敌意。只要你努力,这个问题就不难理解了。我向上投票是为了补偿不合理的向下投票。这个问题是否表明了研究的努力?它有用吗?清楚吗?@KendallFrey我和道格拉斯做了同样的事。这是互联网,如果你对没有完美英语的所有人都投了反对票,那么我很同情你的鼠标键。