封装:我应该将一个对象的数据传递给另一个修改它的 class 吗?
Encapsulation: Should I pass an object's data to another class which modifies it?
我想要类似下面的代码:
class Foo{
public:
void update() {
for( auto dataModifier : _dataModifierList ) {
dataModifier.modify( Data& _data );
}
};
private:
Data _data;
std::vector<DataModifier> _dataModifierList;
};
因为我正在将 Foo
的数据发送到另一个修改它的 class,这是否被视为封装不良?感觉我把Foo
的内容暴露给了DataModifier
。
我这样做的原因是因为我想为 Foo 的每个实例注册一些 DataModifier
s。
如果 DataModifier 获得对 Data 对象的引用以就地修改它,从封装的角度来看,它非常好。如果您将 DataModifier Foo 设为友元,这样它就可以随时更改其成员,而无需调用 Foo 的任何方法,这将是一个缺陷。而且,如果您决定将对私有 data_ 的引用存储在 Foo 之外的某处,而不是将其传递给 DataModifier,我也会认为这是糟糕的设计。
我想要类似下面的代码:
class Foo{
public:
void update() {
for( auto dataModifier : _dataModifierList ) {
dataModifier.modify( Data& _data );
}
};
private:
Data _data;
std::vector<DataModifier> _dataModifierList;
};
因为我正在将 Foo
的数据发送到另一个修改它的 class,这是否被视为封装不良?感觉我把Foo
的内容暴露给了DataModifier
。
我这样做的原因是因为我想为 Foo 的每个实例注册一些 DataModifier
s。
如果 DataModifier 获得对 Data 对象的引用以就地修改它,从封装的角度来看,它非常好。如果您将 DataModifier Foo 设为友元,这样它就可以随时更改其成员,而无需调用 Foo 的任何方法,这将是一个缺陷。而且,如果您决定将对私有 data_ 的引用存储在 Foo 之外的某处,而不是将其传递给 DataModifier,我也会认为这是糟糕的设计。