我坚信以下设计理念:
1> 服务应该在尽可能靠近数据存储的地方实现。
2> Getter 和 Setter 是邪恶的,应该谨慎使用。
我宁愿不在这里争论以上两个论点,并假设它们有其优势。
这是我目前面临的挑战。我有两个类(即AComputer
和A
),其中 AComputer 为 A 提供一些服务,并且 A 包含所有基本数据成员。
事实:由于系统设计,我不允许在AComputer
里面组合。A
我知道,它打破了我的观点 1> 计算应该与数据保持一致。
A
当从to传递数据时AComputer
,我们必须传递 10(大约)个单独的参数,因此最好设计一个结构来做到这一点,否则构造函数列表会变得疯狂。大多数存储在中的数据是存储在中的数据AComputer
的直接副本A
。我们选择将这些数据存储在其中,AComputer
因为其中的其他函数AComputer
也需要这些变量。
这是问题(我要求考虑 API 维护和修改的最佳实践):
1> 我们应该在哪里定义传递结构PassData
?
2> 我们应该为 struct 提供 getter/setterPassData
吗?
我提供了如下示例代码来详细说明我的问题。最好我能找到一个真正的开源 API 来解决同样的问题,这样我就可以从中学习。
如果您查看PassData m_data;
在 class 中定义的private AComputer
,我是故意这样做的。换句话说,如果我们更改 的底层实现AComputer
,我们可以PassData m_data;
用单个变量或其他东西替换,但不会破坏PassData
. 所以在这个设计中,我没有为 struct 提供 getter/setter PassData
。
谢谢
class AComputer
{
public:
struct PassData
{ // int type just used as an illustration. Real data has different types,
// such as double, data, string, enum, etc.
// Note: they are not exact copies of variables from A but derived from them
int m_v1;
// from m_v1 to m_v10
//...
int m_v10;
};
// it is better to store the passed-in data since other functions also need it.
AComputer(const PassData& pd) : m_data(pd) {}
int GetCombinedValue() const
{ /* This function returns a value based the passed-in struct of pd */ }
private:
PassData m_data;
};
class A
{
private:
int m_i1;
// from m_i1 to m_i10
// ...
int m_i10;
// from m_i11 to m_i20
// ...
int m_i20;
boost::shared_ptr<AComputer> m_pAComputer;
public:
A()
{
AComputer::PassData aData;
// populate aData ...
m_pAComputer = boost::shared_ptr<AComputer>(new AComputer(aData));
}
int GetCombinedValue() const
{
return m_pAComputer->GetCombinedValue();
}
};