C++ 我该如何命名这个仅用于报告失败的类?

C++ 我该如何命名这个仅用于报告失败的类?,c++,design-patterns,naming-conventions,C++,Design Patterns,Naming Conventions,在我们的系统中,我们有许多类,它们的构造必须异步进行。我们将构造过程包装在另一个派生自IConstructor类的类中: 当前系统的设计存在一个问题-创建IConstructor派生类的函数通常会做额外的工作,这也可能会失败。此时,返回的不是可以查询错误的构造函数,而是空指针 重新构造代码以避免这种情况是可能的,但这很耗时。同时,我决定创建一个构造函数类,在出现错误时创建并返回该类,而不是空指针: 以上所有这些都是一个普通问题的设置:FailedConstructor类的名称是什么?在我们当前的

在我们的系统中,我们有许多类,它们的构造必须异步进行。我们将构造过程包装在另一个派生自IConstructor类的类中:

当前系统的设计存在一个问题-创建IConstructor派生类的函数通常会做额外的工作,这也可能会失败。此时,返回的不是可以查询错误的构造函数,而是空指针

重新构造代码以避免这种情况是可能的,但这很耗时。同时,我决定创建一个构造函数类,在出现错误时创建并返回该类,而不是空指针:

以上所有这些都是一个普通问题的设置:FailedConstructor类的名称是什么?在我们当前的系统中,FailedConstructor将表示构造Failed实例的类,而不是表示构造另一个类的失败尝试的类

我觉得它应该以一种设计模式命名,比如代理或适配器,但我不确定是哪种


编辑:我应该清楚地表明,我正在寻找一个符合GoF设计模式之一的答案,或者其他一些关于这类事物的公认命名惯例。

为了回答你的字面问题,我可能会选择ConstructorFailure,因为它描述了失败事件


然而,我可能会更进一步,将其作为一个例外,在这种情况下,ConstructorException听起来并不太寒酸。你想返回它而不是抛出它吗?

我选择DummyConstructor,因为它的唯一目的是模拟一个有效的构造函数实例,但它没有实现任何真正的功能。

FailureResponseConstructor


你不是在制造失败,你是在创造对失败的回应。因此,我认为“response”或“response”的任何同义词都会起作用。

抛出一个异常。也就是说,如果我正确理解您的描述,并且IConstructor对象的创建不是异步完成的

不过,如果您没有可用的异常,我可能会将其称为ConstructorCreationError。是的,它确实传达了故障模式,但更准确地说,它传达了发生的特定错误。另外,在我看来,将构造函数作为最后一个词似乎给出了错误的含义,但您也可以将构造函数放在末尾


您还可以使用类似于SpawnConstructorError、ConstructorGenerationError的内容替换动词Creation,或者如果您是Chevalier博士的粉丝,则可能是错误的构造函数。

如果您愿意花费精力检查返回的指针是否与FailureConstructor相对应,我看不出您为什么不能将其检查为NULL


除非您的系统是为了掩盖组件之间的故障而设计的,否则假设每个相关的部件都工作正常是没有意义的。

我将根据Niall C.的评论-FailedConstructorProxy来做一些事情。代理模式似乎最适合这个类;虽然它不是将方法调用中继到一个对象,而是插入并生成我们希望实际构造函数返回的内容


如果有人有更正确的答案,把它贴出来,我会把它标记为已接受。我仍然不是100%相信这是正确的名字

为什么不创建一个失败的类来表示构造失败的类并使用FailedConstructor?这样命名是一致的。

我将根据null对象模式将其命名为null构造函数,这是您正在使用的模式。请参见

我建议调用这个类FailedObjectConstructionHandler,它描述了类的功能。

正确,IConstructor本身的创建是同步的。但是,此代码库中没有异常,现有代码也没有设计用于处理这些异常的代码:我知道这是怎么回事,在一个类似的项目上工作。。。更新了一些命名建议。C++,EH?我会使用一个从公共接口继承的、对生成它的模块私有的类,而不用太担心名称。我发现了一些您可能感兴趣的东西。返回的代码不会根据FailureConstructor检查指针。相反,它将检查GetStatus返回的结果,并从中确定操作过程。这确实是FailureConstructor的全部要点——它应该代表一个实际的构造函数,但它没有实现。仔细想想,这似乎是最正确的。它正在构造一个空对象。
class IConstructor {
    public:
        virtual void Update() = 0;
        virtual Status GetStatus() = 0;
        virtual int GetLastError() = 0;
};
class FailedConstructor : public IConstructor
    public:
        virtual void Update() {}
        virtual Status GetStatus() { return STATUS_ERROR; }
        virtual int GetLastError() { return m_errorCode; }
    private: int m_errorCode;
};