我遇到的代码中的函数除了检查条件并抛出异常或什么都不做,取决于条件的评估结果之外什么都不做。
代码看起来像这样:
public string MyMethod() {
var name = "foo";
EnsureSuccess(name);
return name;
}
// Throws an exception if name is not "bar"
public void EnsureSuccess(string name) {
if (name != "bar")
{
throw new ArgumentException("Not bar!");
}
}
这叫什么?这是一个命名的设计模式吗?
这也被认为是一种好习惯还是一种不良做法?
使用此代码的野外代码示例是EnsureSuccessStatusCode
中的HttpResponseMessage.cs
方法,它是Microsoft System.Net.Http
的一部分。 (code,documentation)
答案 0 :(得分:3)
这不是设计模式。它被称为programming assertion.
在计算机编程中,断言是谓词(真假 声明)放在一个程序中,表明开发人员的想法 谓词在那个地方总是如此。如果是断言 在运行时评估为false,断言失败结果,这 通常会导致执行中止。
答案 1 :(得分:2)
除了@Chris Eelmaa的回答,我还会说使用Don't_repeat_yourself原则。似乎EnsureSuccess(string name)
被大量使用..另外我没有看到提取2行代码的重点。
示例中另一件有趣的事情并不像你指出的那样
throw new Exception("Not bar!");
但根据MSDN Best Practices for Exceptions - 不要抛出新的异常()
所以请注意,应该是
throw new SpecificException("Not bar!");
例外是一个过于宽泛的阶级,没有副作用就很难捕捉到。派生自己的异常类,但是从 Exception 派生它。这样,您可以为框架抛出的异常设置专门的异常处理程序,为自己抛出的异常设置另一个异常处理程序。
在代码示例中,它们是:
throw new ArgumentOutOfRangeException ();
throw new ArgumentNullException ("......");
throw new HttpRequestException (string.Format ("{0} ({1})", (int) statusCode, ReasonPhrase));
答案 2 :(得分:0)
想象一下EnsureSuccess
的代码MyMethod
:
public string MyMethod() {
var name = "foo";
// Ensure success
if (name != "bar")
{
throw new ArgumentException("Not bar!");
}
return name;
}
首先,它需要一个评论来解释它在做什么。其次,作为pointed out before,您需要在每个需要检查此条件的地方重复此代码。
有一个名为extract method的重构(类似于编码模式)会导致您在此处看到的内容。
提取方法(在这种情况下,“不要重复自己”)也是information hiding的一个示例,因为EnsureSuccess
的详细信息隐藏在该方法中。如果决定改变EnsureSuccess
如何工作的逻辑,那么只改变单个方法,并且调用该方法的任何地方都不需要改变。
答案 3 :(得分:0)
它可能是访问者,您将函数放在类中。 因此,类EnsSuccess可能会充当某种验证器。 也许这个类的工作是执行所有异常处理?
它也可以是Facade模式。 这种模式非常常用作验证器。
谢谢,