此模板方法模式示例是否有标准命名约定? - c#

我想创建一个具有通用异常处理模式的抽象类:

public abstract class Widget
{
    public IFoo CreateFoo()
    {
        try
        {
            CreateFooUnsafe();
        }
        catch(Exception ex)
        {
            throw new WidgetException(ex, moreData, evenMoar);
        }
    }

    protected abstract IFoo CreateFooUnsafe();
}

目的是在所有派生对象上具有标准的异常处理模式。抽象的CreateFooUnsafe()方法不应包含任何异常处理。实现可能是一行return new Foo(...)

我想知道的是,该模式是否有任何标准的命名约定,特别是在预期会抛出异常的代码的地方?

上面的名称似乎有些合适,但并非完全没有异味。

参考方案

最简洁的答案是不。

模板模式中没有约定可以指定什么类型以及何时引发异常。根据MSDN,此类信息包含在文档的某些部分中。使用C#和XML注释,您可以轻松生成此类文档。

我的印象是,模板模式本身可能没有命名约定,而没有引用异常处理。据我了解,命名可能看起来像这样:

public abstract class Widget
{
    public void PerformAction()
    {
        this.PerformActionImpl();
    }

    protected virtual void PerformActionImpl(){}
}

Impl是“实施”的简写。我个人不喜欢这种命名方式,所以不要使用它,但是我敢肯定我已经读过半权威性的文章,认为这是“实现”的方式。

但是,在您的情况下,我不会使用其中任何一种,因为您似乎真正想要使用Factory或AbstractFactory。

..

关于您的异常查询,在我看来,代码有点内外,我视您的情况不同意其他一些注释。

自动换行是一种完全有效的异常处理技术。

由异常类型本身提供的其他上下文可能足以将异常路由到适当的处理程序。也就是说,您已经将Exception转换为WidgetException,您可以期望它在应用程序中具有上下文。这样可能就足够了。

但是您不同意我做包装的地方。

我会在虚拟方法的子类实现中进行捕捉包装和抛出,因为只有该子类才能充分了解其操作,才能知道Exception是否确实是WidgetException并因此进行包装或其他一些操作有毛的应该繁殖。

就目前而言,该代码对异常的原因做出了大量假设,从这种意义上讲,自定义异常的任何使用都将变为无用。即现在一切都变成了WidgetException。

因此,尽管我认为仅靠类型就足以使异常上下文化,但我不认为代码会在正确的地方做出决定。我理解您选择的实现背后的动机,因为它看起来像是一个非常美味的捷径,“所有已知基类的神话”,但是仅是您将其声明为抽象的事实应该提供该类意图的重要线索。通过设计无知

因此,对于横切关注异常处理的关注,我认为您不应该过多地寻找一种可以使您的生活更轻松的模式,而是一个可以消除所有烦恼的框架。

例如企业库。

我应该通过BrainBench设计模式认证吗? - php

我在Brainbehch上找到了Design patterns certification。我从通过它的人那里听说,存在许多特定于语言的模式问题,主要来自Java和C ++。我认为该认证可以:强迫我提高在面向对象设计和设计模式方面的技能;改进和构建我对该领域的知识;给出我的知识的真实估计,这本身就是有用的问题我对认证的唯一困惑是,我必须学习C ++ / Ja…

格式化数字的最佳设计模式是什么? - java

我需要编写将根据指定选项格式化值的代码。现在可以选择几种格式设置选项:以指定的精度四舍五入/截断数字,添加前缀(例如$)或后缀(例如%),分组数千(应用逗号),添加数字缩写(KMB)。所以数字1857可以显示为$ 2K或$ 1.86K或$ 1,867起初我考虑过为此使用Decorator模式,但我不确定,因为格式化程序应按特定顺序应用,例如首先,我需要应用K…

MVVM对javascript库的依赖性? - javascript

我熟悉MVC,但不熟悉MVVM。我检查了与MVC / MVVM / MVP之间的差异有关的各种帖子。甚至我检查了Microsoft的Office链接https://msdn.microsoft.com/en-us/magazine/dn463786.aspx,但每次在这些链接中发现一个共同点是,它们使用第三方JavaScript库(Angular,knock…

是否有python命名约定来避免与标准模块名称冲突? - python

PEP 8建议使用单个下划线来避免与python关键字发生冲突,但是与标准python模块的模块名称发生冲突怎么办?那还应该是一个下划线吗?我在想像这样的事情:import time time_ = time.time() 参考方案 PEP 8似乎并未直接解决。当您与关键字冲突时,尾部的下划线显然是必要的,因为否则您的代码会引发SyntaxError(或者,…

存储库搜索中带有对象vs参数列表的方法。违反SRP? - java

我与同龄人就是否将存储库方法的搜索选项封装在对象或(可能增长的)参数列表中是否是一种好习惯进行了辩论。总而言之,伪代码将是:SearchItems(int id,string name,int statusId) VSclass SearchOptions { /* For illustration purposes, I intentionally mad…