簡體   English   中英

Setter / getters和分層數據結構

[英]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開發的全面聲明。 您應該考慮成員應該是逐個成員公開還是私有。 有時公共數據成員是正確的想法。 請考慮以下問題:

  1. 我是否需要對此會員保持不變?
  2. 該成員可以使用無效值嗎?
  3. 我是否希望界面為該成員提供替代表示?

如果上述任何問題的答案都是肯定的,那么您可能想要使用一個getter。

還要考慮單獨設置成員是否真的有意義。 也許您應該使用構造函數設置成員,並且您希望提供一些修改這些成員的其他接口。

在C ++中使用setter和getter時,像A.get_d1()。get_d4()。get_d7()這樣的表達式似乎不方便

雖然對數據結構進行相當深的嵌套並不常見,但通常一段特定的代碼不應該深入研究它。 如果確實如此,我想它可能做得比它應該做的更多,超出了它的單一責任。 但是,如果它是一個共同的任務,以獲得d7A對象,也許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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM