方法的设计模式的名称除了在条件上抛出异常之外什么都不做?

时间:2014-10-06 15:24:24

标签: function exception design-patterns methods

我遇到的代码中的函数除了检查条件并抛出异常或什么都不做,取决于条件的评估结果之外什么都不做。

代码看起来像这样:

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的一部分。 (codedocumentation

4 个答案:

答案 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模式。 这种模式非常常用作验证器。

谢谢,