Function 只对条件抛出异常的方法的设计模式名称?
我遇到过这样的代码,其中的函数除了检查条件并抛出异常之外什么都不做,或者什么都不做,这取决于条件的求值结果 代码如下所示:Function 只对条件抛出异常的方法的设计模式名称?,function,exception,design-patterns,methods,Function,Exception,Design Patterns,Methods,我遇到过这样的代码,其中的函数除了检查条件并抛出异常之外什么都不做,或者什么都不做,这取决于条件的求值结果 代码如下所示: 公共字符串MyMethod(){ var name=“foo”; 确保成功(姓名); 返回名称; } //如果名称不是“bar”,则引发异常 public void EnsureSuccess(字符串名称){ 如果(名称!=“bar”) { 抛出新的ArgumentException(“非bar!”); } } 这叫什么?这是命名的设计模式吗 这被认为是一个好的做法还是一
公共字符串MyMethod(){
var name=“foo”;
确保成功(姓名);
返回名称;
}
//如果名称不是“bar”,则引发异常
public void EnsureSuccess(字符串名称){
如果(名称!=“bar”)
{
抛出新的ArgumentException(“非bar!”);
}
}
这叫什么?这是命名的设计模式吗
这被认为是一个好的做法还是一个坏的做法
使用此功能的野生代码示例是Microsoft提供的
HttpResponseMessage.cs
中的ensureccessstatuscode
方法,它是System.Net.Http
的一部分。(,)这不是一种设计模式。它叫
在计算机编程中,断言是一个谓词(真-假)
语句)放在程序中表示开发人员认为
谓词在那个地方总是真的。如果一个断言
在运行时计算为false,将导致断言失败
通常会导致执行中止
这不是一种设计模式。它叫 在计算机编程中,断言是一个谓词(真-假) 语句)放在程序中表示开发人员认为 谓词在那个地方总是真的。如果一个断言 在运行时计算为false,将导致断言失败 通常会导致执行中止
除了@Chris Eelmaa的答案之外,我还要说,这也使用了这个原则。似乎经常使用
EnsureSuccess(字符串名)
。否则,我看不出提取两行代码的意义
示例中另一件有趣的事情与您指出的不同
throw new Exception("Not bar!");
但是根据-不要抛出新异常()
所以请注意,应该是
throw new SpecificException("Not bar!");
Exception是一个太宽泛的类,如果没有副作用,很难抓住它。派生您自己的异常类,但从异常派生它。通过这种方式,您可以为框架引发的异常设置专门的异常处理程序,为您自己引发的异常设置另一个异常处理程序
在代码示例中,它们是:
throw new ArgumentOutOfRangeException ();
throw new ArgumentNullException ("......");
throw new HttpRequestException (string.Format ("{0} ({1})", (int) statusCode, ReasonPhrase));
除了@Chris Eelmaa的答案之外,我还要说,这也使用了这个原则。似乎经常使用
EnsureSuccess(字符串名)
。否则,我看不出提取两行代码的意义
示例中另一件有趣的事情与您指出的不同
throw new Exception("Not bar!");
但是根据-不要抛出新异常()
所以请注意,应该是
throw new SpecificException("Not bar!");
Exception是一个太宽泛的类,如果没有副作用,很难抓住它。派生您自己的异常类,但从异常派生它。通过这种方式,您可以为框架引发的异常设置专门的异常处理程序,为您自己引发的异常设置另一个异常处理程序
在代码示例中,它们是:
throw new ArgumentOutOfRangeException ();
throw new ArgumentNullException ("......");
throw new HttpRequestException (string.Format ("{0} ({1})", (int) statusCode, ReasonPhrase));
想象一下,
EnsureSuccess
的代码在MyMethod
上是串联的:
公共字符串MyMethod(){
var name=“foo”;
//确保成功
如果(名称!=“bar”)
{
抛出新的ArgumentException(“非bar!”);
}
返回名称;
}
首先,它需要一条评论来解释它在做什么。其次,作为一个例子,您需要在每个需要检查此条件的地方重复此代码
有一种重构(类似于编码模式)称为,它会产生您在这里看到的结果
Extract方法(在本例中为“不要重复自己”)也是的一个示例,因为
EnsureSuccess
的详细信息隐藏在该方法中。如果决定更改EnsureSuccess
的工作逻辑,只需更改单个方法,调用该方法的任何地方都不需要更改。想象一下EnsureSuccess
的代码在MyMethod
上是串联的:
公共字符串MyMethod(){
var name=“foo”;
//确保成功
如果(名称!=“bar”)
{
抛出新的ArgumentException(“非bar!”);
}
返回名称;
}
首先,它需要一条评论来解释它在做什么。其次,作为一个例子,您需要在每个需要检查此条件的地方重复此代码
有一种重构(类似于编码模式)称为,它会产生您在这里看到的结果
Extract方法(在本例中为“不要重复自己”)也是的一个示例,因为
EnsureSuccess
的详细信息隐藏在该方法中。如果决定更改EnsureSuccess
的工作逻辑,只需更改单个方法,调用该方法的任何地方都不需要更改。可能是Visitor,您可以将函数放在类中。
因此,可能该类EnsureSuccess将充当某种验证器。
也许这个类的作业要执行所有异常处理
它也可以是外观模式。
此模式通常用作验证器
谢谢,可能是Visitor,您将函数放在一个类中。 因此,可能该类EnsureSuccess将充当某种验证器。 也许这个类的作业要执行所有异常处理 它也可以是外观模式。 此模式通常用作验证器
谢谢,关于1.0/1.1时代(IIRC)日期的特别建议。现在,它指出:“您应该从类而不是ApplicationException类派生自定义异常。您不应该在代码中引发ApplicationException异常,也不应该捕捉ApplicationException异常,除非您打算重新引发原始异常。”我知道不捕捉常规异常,但由于这只是一个例子,我没有使用