在我的编码风格中,一个类不应该公开公共的“原始”数据成员,而应该只公开 getter 和 setter(即使它们是简单的单行方法)。
这是因为以后代码可以升级,单行方法可以扩展成更复杂的东西(或者可以添加一些debug-only build的特性来检查一些不变量等),所以最好保留与客户端一致的接口(如果您公开“原始”数据成员,这是不可能的)。
您可以避免使用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();
这对我来说看起来不错。
对于 setter,您可以使用如下语法:
Shape& Color(COLORREF color)
{
m_color = color;
return *this;
}
并编写如下客户端代码:
Shape s;
s.Color(...).Draw(); // set color and draw shape
COLORREF
如果属性的类型比 a (它是 32-bit )更复杂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;
}