2016-01-20 62 views
1

我有一個包含一些成員,其可以從外部源被修飾的類:最佳實踐以設定(財產而)的單個/多個成員

class CNode 
{ 
protected: 
    // these members might be changed by users 
    std::string m_sName; 
    CState m_CurrentState; 
    CColor m_DiffuseColor; 
}; 

樣品被簡化,它具有多個成員在我的代碼中。

現在什麼是最好的做法是改變

  1. 多(一次)
  2. 所有成員(一次)
這個類的

我的代碼需要處理所有情況,雖然內部情況1.將是通常的情況。 大部分時間它被應用到單個CNode,但它也可能被應用到一個節點陣列。

我知道兩個可能的解決方案,既沒有真正滿足我:

  1. 集&獲得每一個變量:

    每個變量是可以修改的獨立於其他成員。
    易於爲多個CNodes設置相同的值。
    魂鬥羅
    很多集&gets;
    如果添加一個新的變量,新的一組& get需要一併加入。

如果一個變量在許多CNodes改變這樣的工作最好

  • 創建一個包含所有修改變量CProperties類:

    一設置&獲取父類 - 屬性可以被添加/刪除而不需要修改set & get。
    這也減少了我的API中處理用戶輸入的方法數量。
    對比
    設置單個變量需要獲取當前CProperties,所以其他值不會被修改。
  • 如果在單個CNode中同時更新多個/所有變量,這將工作得最好。

    像這樣:

    class CProperties 
    { 
        // these members might be changed by users 
        std::string m_sName; 
        CState m_CurrentState; 
        CColor m_DiffuseColor; 
    } 
    
    class CNode 
    { 
    public: 
        const CProperties* GetProperties(); 
        void SetProperties(CProperties*); 
    
    protected: 
        CProperties m_Properties; 
    } 
    

    這將是最懶的版本(代碼創建工作),而且最討厭的版本對我來說,因爲設置單一變量,首先需要獲得當前屬性,修改單變量,然後將完整的屬性類設置回節點。
    尤其是在修改多個CNodes中的單個變量的情況下,這似乎是一個糟糕的解決方案。

    對我而言,執行時間和(大小)開銷大部分是無關緊要的。 (這實際上是我對付懶惰版本的唯一好辯)
    相反,我正在尋找乾淨,可理解的可用代碼。

    我可以想到動態方法的第三種可能的解決方案:
    一組方法有一個對象作爲參數,可能包含一個或多個需要修改的值。然後,API只有一個設置方法,如果CProperty更改,則不需要進行任何修改。相反,在CNode類中需要解析方法。 對於CProperties中的每個更改,此解析方法仍需要更新,但我相信這應該也可以通過模板通過編譯器解決。

    我的問題是:
    有沒有其他可能的解決方案,我的用例?
    哪種方法最明智?

    回答

    0

    您可以將更新和更新內容的邏輯添加到類中,並僅爲其提供信息源。

    看看你如何構建屬性對象並將邏輯傳輸到駐留在CNode中的更新函數中。

    如果CNode需要外部信息來源來執行更新,然後將它們傳送到更新功能。

    優選地傳遞給更新函數的參數數量會比在CNode。(理想的情況下零或一)字段

    CNode只會更新實際上已經修改的字段的數量較小。

    不需要多套功能,更新班級的統一方式,沒有信息在裂縫之間迷路。

    +0

    感謝您的提示! 我也想過在屬性類中添加一個更新標誌,該標誌將指定哪些值應該更新。這些信息會在更新後立即變得無關緊要,因此我不想添加它。 但我沒有想到將它用作參數。 –

    +0

    只是爲了澄清我的意思是一個更新函數,如下所示:void CNode :: Update();這將正確更新CNode,提供更新類所需的信息。 – Jonathan

    +0

    更新課程所需的信息完全來自外部資源。所以我需要將更新後的CProperties以及CProperties中更新的內容傳遞給CNode :: Update()。 但是,通過這種方式,至少以前的CProperties的請求將變得沒有必要。 –