0

我正在更新一些旧的无人维护的软件,我注意到一种我无法充分解释的特殊模式。

有问题的代码是用 C++ 编写的。通常,当我看到数据成员时,它们作为公共或私有成员存在于类声明中。在我目前正在使用的代码中,几乎每个类都将数据成员存储在一个额外的结构中,如下所示:

struct MyClassData {
    int foo;
    int bar;
};

class MyClass {
    MyClassData classData;

public:
    void doFoo();
    void doBar();
    void doBaz();
};

不幸的是,这段代码的原始维护者无法访问。但是,每个班级(大约有一百个)都这样做。我不知道为什么,因为 MyClassData 结构从未在类声明顶部以外的任何地方使用过。

为什么有人会选择以这种方式布局他们的 C++ 类,有什么特别的原因吗?我知道想要和使用结构作为数据成员是有原因的,但我不明白的是为什么你想把所有的数据成员都放在一个这样的结构中,而不是用那个结构做任何其他事情. 我想它可能会消除您在方法中访问的内容以及如何访问的任何歧义(因为一切都需要首先通过 classData),但除此之外,我不知道。我想知道是否有我尚未发现的技术原因。

4

1 回答 1

0

这种不常见的模式没有满足特定的技术限制。

我可以猜测作者的意图(尽管最终你必须问他们):

  1. 对“封装”概念的过度痴迷和误解
    “这样所有数据都保存在一起!”

  2. 单独的序列化代码可以单独引用类型,而不必成为MyClass.

  3. MyClassData是一个聚合(至少在这个例子中,它的所有成员都是int),允许您以某些方便的方式对其进行初始化。但是,如果您总是将它作为 a 的一部分,那么MyClass我看不出您可以将其用于任何有意义的用途。

As an aside, personally I'd have made that a nested detail class if anything. As it is here, it's very easy to have a MyClassData without a MyClass, and what's the point of that? Not very clear at all.

In the absence of any explanatory comments or documentation, and given that the original author is unreachable, I wouldn't worry too much about abiding by this pattern. There's no strong reason I can see to stick to it, beyond the principle of keeping your codebase consistent or avoiding creating a ton of refactoring work for yourself.

于 2015-09-12T13:13:14.687 回答