在我的编码风格中,类不应公开“原始”数据成员,而只能是getter和setter(即使它们是简单的单行方法)。
这是因为未来可以升级代码,单线方法可以扩展到更复杂的东西(或者可以添加一些仅用于调试的构建功能来检查某些不变量等),所以最好让客户端的接口保持一致(如果你暴露“原始”数据成员,这是不可能的)。
您可以避免使用前缀get_()
,只需将该数据成员视为一个简单的(不含get_...
)名称的“属性”即可。
class Shape
{
public:
....
COLORREF Color() const // Just Color() i.e. the property name, without get_...
{
return m_color;
}
private:
COLORREF m_color;
};
并编写客户端代码,如:
Shape s;
COLORREF someColor = s.Color();
这看起来好像没什么问题。
对于您可以像使用语法二传手:
Shape& Color(COLORREF color)
{
m_color = color;
return *this;
}
,并写出这样的客户端代码:
Shape s;
s.Color(...).Draw(); // set color and draw shape
如果属性的类型是东西比COLORREF
更复杂(这是一个32位的DWORD
),你可以使用一个模式,如:
std::wstring Name() const // getter
{
return m_name;
}
Shape& Name(std::wstring name) // setter
{
// Pass by value and move from the value (C++11 move semantics)
m_name = std::move(name);
return *this;
}
但是,当按值返回时,它肯定会创建一个数据结构的副本。如果其中一个嵌套数据结构很大,考虑到我只想读取一个字段,这不是一个好主意。 – jbgs
@jbgs这取决于它返回的内容。如果它返回一个成员对象,是的,它将不得不复制它。 –
是的,这些嵌套的数据结构是成员对象。实际上我认为常见的C++编码风格并不适合我正在开发的这种应用(微电子仿真)。 – jbgs