我带来了一些旧的非维护软件,我注意到了一种我无法充分解释的特殊模式。
有问题的代码是用C ++编写的。通常,当我看到数据成员时,它们作为公共或私有成员存在于类声明中。在我正在使用的代码中,几乎每个类都将数据成员存储在一个额外的结构中,如下所示:
struct MyClassData {
int foo;
int bar;
};
class MyClass {
MyClassData classData;
public:
void doFoo();
void doBar();
void doBaz();
};
不幸的是,此代码的原始维护者无法访问。每个班级(其中大约有一百个)都是这样做的。我无法弄清楚为什么,因为MyClassData结构从未在类声明顶部的任何地方使用过。
有人会选择以这种方式布局他们的C ++类吗?我理解有理由想要和使用结构作为数据成员,但我不明白为什么你想要将所有你的数据成员填充到这样的单个结构中,并且从来没有做过任何其他结构。我想它可能会消除你在方法中访问的内容以及如何(因为一切都需要首先通过classData)的任何歧义,但除此之外,我不知道。我想知道是否有技术原因,我还没有发现。
答案 0 :(得分:0)
这种不常见的模式并没有满足特定的技术限制。
我可以猜测作者的意图(但最终,你 必须问他们):
对“封装”概念的过度迷恋和误解 (“这样所有数据都保存在一起!”)
单独的序列化代码可以单独引用该类型,而无需成为MyClass
的朋友。
MyClassData
是一个聚合(至少在此示例中,其所有成员都是int
),允许您以某些方便的方式初始化它。但是,如果你总是把它作为MyClass
的一部分,我看不出你可以为任何有意义的用途带来什么好处。
顺便说一下,我个人已经做了一个嵌套的detail
类,如果有的话。就像在这里一样,MyClassData
没有MyClass
就很容易了,有什么意义呢?根本不是很清楚。
在没有任何解释性评论或文件的情况下,鉴于原作者无法访问,我不会过分担心遵守这种模式。除了保持代码库一致性或避免为自己创建大量重构工作的原则之外,我没有强有力的理由坚持它。