[英]Setters/getters and hierarchical data structures
我知道在你班上有公共領域被認為是個壞主意。 但是,當您的類包含眾多分層數據結構和字段時,最好的方法是什么? 例如:
class A {B d1; C d2; D d3;}
class B {E d4; F d5;}
class E {G d6; int d7;}
在C中,訪問這樣的數據結構非常容易,例如ptr_to_A-> d1.d4.d7等等......但是當我們使用setter / getters時,方法是什么?
在C ++中使用setter和getter時,像A.get_d1()。get_d4()。get_d7()這樣的表達式似乎不方便,它們強制返回引用。 由於某些結構非常大,按價值返回似乎是個糟糕的主意。
在這些情況下,您使用哪種方法或編碼方式? 也許擺脫setter / getters並將這些領域公之於眾?
在我的編碼風格中,類不應該暴露公共“原始”數據成員,而應該只暴露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();
這對我來說很好看。
對於setter,您可以使用如下語法:
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;
}
我知道在你班上有公共領域被認為是個壞主意。
這是來自上一個十年Java開發的全面聲明。 您應該考慮成員應該是逐個成員公開還是私有。 有時公共數據成員是正確的想法。 請考慮以下問題:
如果上述任何問題的答案都是肯定的,那么您可能想要使用一個getter。
還要考慮單獨設置成員是否真的有意義。 也許您應該使用構造函數設置成員,並且您希望提供一些修改這些成員的其他接口。
在C ++中使用setter和getter時,像A.get_d1()。get_d4()。get_d7()這樣的表達式似乎不方便
雖然對數據結構進行相當深的嵌套並不常見,但通常一段特定的代碼不應該深入研究它。 如果確實如此,我想它可能做得比它應該做的更多,超出了它的單一責任。 但是,如果它是一個共同的任務,以獲得d7
從A
對象,也許A
應該暴露在其界面:
int A::get_d7 {
return get_d1().get_d4().get_d7();
}
由於某些結構非常大,按價值返回似乎是個糟糕的主意。
實際上,使用現代C ++,這根本不是問題。 傳遞值應該被視為對象傳遞的默認模式。 這是因為現在可以移動臨時對象,這實際上是一種非常有效的復制形式。
如果您只是將類用作純數據結構,並且沒有與要封裝的數據相關的行為 ,則使用struct
代替直接訪問字段。 Bjarne Stroustrup推薦這種方法 。 這相當於使用一個class
並將所有成員聲明為public
,但將其稱為struct
則更清楚地表明它只不過是簡單的數據集合。
如果您所做的不僅僅是存儲數據,那么請使用getter和setter。
在C ++中使用setter和getter時,像A.get_d1()。get_d4()。get_d7()這樣的表達式似乎不方便,它們強制返回引用。 由於某些結構非常大,按價值返回似乎是個糟糕的主意。
不,您可以選擇是通過引用還是按值返回。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.