如何避免類的膨脹

2021-07-03 11:22:50 字數 1433 閱讀 7900

類的膨脹(bloating)指的是類中成員過多,甚至出現無序增加的情況。過大的類,會使得複雜度急劇增加,維護會變得更為困難。所以需要控制類的增長。本文總結了一下,簡單介紹四種解決的方式,我故意用四個來講,主要為了介紹最後一種方式。

(以下將需要避免膨脹類稱為目標類,即類圖中的car類。)

這個是最為原始的思路。成員變數仍然要增加,以友元類可以訪問類的私有成員的能力來減少一些方法。

這種方式的壞處是將所有的呼叫者加入友元類並不現實。它的情形類似:

如果將新增加的成員放到乙個helper class中,這樣目標類提供新的方法供外部使用,內部再呼叫helper的實現。這種方式下方法仍然要增加。

而另一種方法,也是比較常用的。在目標類中提供乙個函式將helper class開放出去,可以供需要使用它的類直接使用。

【這裡helper class也可以是目標類的友元類。】

有時我們只是要利用乙個類現有的方法來實現不同的演算法。就可以使用觀察者模式來實現。

將需要新增加的演算法放到vistor中,而不是目標類中。如果有需要也可以將visitor設為目標的友元類。

這個方案與helper class的最大差異在於客戶端可能需要不同版本的演算法實現,而且是由客戶端指定。

無論是簡單的helper class,還是visitor模式,helper及visitor的生命週期管理都需要由目標類及客戶類管理。另外helper class不能將不同類別的方法和成員變數區分出來 (不同類別代表了不同職責,我們可不要god class),而visitor不適用於需要增加成員變數的需求。

在chromium中提供了乙個類似binding的機制。原理上就是將我要增加的資料和方法按不同的類別封裝成乙個個類,然後以自身指定的內容作為key繫結到目標類上。需要使用時使用乙個靜態方法,傳入之前指定的key就可以取到對應類,然後操作。

本質上這也是乙個helper class的實現,只是這個helper完成了相關資料物件的訪問操作。

結構如下:

(詳見chromium**中的base::supportsuserdata。)

這時目標類不用改動一行**,就能增加它所持有的資料和方法了。

如何避免 如何避免鋼板彈簧受損

鋼板彈簧是卡車上的貴重部件之一,它一旦發生故障或損壞,會影響車輛的行駛和操縱,甚至發生意外事故,所以司機師傅們平時要養成良好的駕駛習慣,避免卡車鋼板彈簧受損。鋼板彈簧在卡車懸架系統中起著緩衝作用,還擔負傳遞所有各向的力和力矩,以及決定車輪運動的軌跡,起到導向的作用。相比於氣囊式懸架,鋼板彈簧因為其結...

如何避免 小紅書如何避免降權!

小紅書如何避免降權!如何避免降權,避開了雷區自然可以提公升權重。1 暱稱不能帶任何的營銷產品詞 2 發布的筆記要統一主題 做美妝的統一發布跟美妝相關的筆記,做旅行的就發布跟旅行相關的筆記,很多人做小紅書喜歡跟風,什麼熱門就發什麼,其實這是乙個大忌。同一主題風格才更有利於體現你的專業性,讓系統知道你的...

類之間的相互引用以及如何避免類之間的迴圈依賴

在分析類的相互引用之前,我們需要了解乙個程式的整個執行過程。整合開發環境 ide 整合了編輯器 編譯器 鏈結器,除錯 部署等功能,我們在編輯器裡寫好的c c 檔案一開始以ascii字符集儲存在硬碟裡,計算機只能識別機器語言 二進位制指令,又稱bcd碼 為此,編譯器的功能是將寫好的原始檔 c c 按照...