【问题标题】:Exception member class OOP异常成员类 OOP
【发布时间】:2018-07-02 06:11:29
【问题描述】:

我在生产代码中遇到了以下概念:

class A
{
public:
    class Exception : public std::exception
    {/* ... */};
 //...
};

没有人可以给我一个明确的答案,为什么会这样。我的问题是这种方法是否符合 SOLID 规则?我认为如果这个异常类位于类 A 之外并在创建 A 的实例时注入会更好。

【问题讨论】:

  • 设计原则很重要,但没有遵循“因为它们是设计原则”。他们被追随是因为他们完成了一些事情。在构造时注入异常对象会完成什么?现在这个类应该管理这个对象的生命周期。如果从未遇到过错误状态并且从未抛出过错误状态怎么办?
  • 你是对的。注入不是必需的,因为独立的异常类将“以正常方式”对 A 类可用。但是,我仍然无法解释为什么异常类应该是 A 类的成员。
  • 我认为如果您继续执行您的建议,您会找到答案。
  • 如果是A 特有的错误,写catch(A::Exception const& e) {..} 感觉有点“干净”。取决于可以重复使用多少错误或特定于A。我认为没有一个包罗万象的答案。这取决于所讨论的类型,并且在很大程度上是一个判断电话。但我个人认为错误是类接口的一部分。

标签: c++ oop object solid-principles


【解决方案1】:

当您说“在创建 A 的实例时注入”时,请注意 Exceptiontype,而不是 object。您不能同一类的实例中有不同的type成员。

您可以在类模板的不同实例化中使用不同的类型(即不同的类),但对于本示例,您不需要模板。

类有内部类型是完全正常的。您将所有辅助定义收集到一个容器中。 std::map18 member types。在这方面,类名范围几乎与命名空间范围相同。

【讨论】:

    【解决方案2】:

    您可能想阅读:https://en.cppreference.com/w/cpp/language/nested_types

    因为您说“在创建实例 A 时被注入”,所以我想我需要澄清 Exception 被定义为内部类并不会使其成为 A 实例的成员。如果你想让它成为A 实例的成员,你必须在A 中明确声明该成员:Exception m_expections;

    【讨论】:

      【解决方案3】:

      我的问题是这种做法是否符合 SOLID 规则?

      我认为没有什么 SOLID 可以维持或禁止这种情况。

      由于命名和语义,我仍然会遇到问题:当您声明这样的异常时,它唯一可能意味着“A 类生成的异常类型”。这并不能准确地表示任何类型的错误情况(尽管我怀疑您有一个真正名为 A 的类,因此可能由于示例中选择的名称而失去了含义)。

      如果类名真的是“异常”,您可能应该重命名它。在类中定义它对我来说也没有意义(我看不出它的原因)。

      【讨论】:

        猜你喜欢
        • 2017-04-04
        • 1970-01-01
        • 2014-06-26
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多