🎯 什麼情境該想到我
當你「一個類別把內部的集合欄位(list、set…)直接透過 getter 交給外界」的時候——外部就能繞過這個類別偷偷增刪內容,破壞它該有的規則。改成提供 add/remove 方法,並讓取值回傳副本或唯讀視圖,把修改權收回來。
⚙️ 怎麼用(步驟 / 公式)
意圖:不要對外直接暴露集合欄位;由類別提供新增/移除方法,取值時回傳集合的副本或唯讀視圖。
動作要點(小步安全進行):
- 若集合尚未封裝,先對它做封裝變數 Encapsulate Variable。
- 在類別上加入 add/remove 之類的修改方法,讓外界透過它們來改動集合內容。
- 找出所有直接對集合做增刪的呼叫端,改成呼叫這些方法,測試。
- 修改取值函式:改為回傳「副本」或「唯讀視圖」,讓呼叫端拿到的東西即使被動也不會影響內部真正的集合。
- 確保設值(如果有)也是接收內容後複製進內部,而非直接持有外部傳入的集合參照。
🧪 我實際套用的紀錄
- (待填)
⚠️ 注意 / 什麼時候不適用
- 若語言/團隊約定已用不可變集合,或此集合本就無需維持不變式,封裝的必要性降低。
- 別做半套:只加 add/remove 卻仍讓 getter 回傳可變的原集合,等於沒封裝。
🔗 相關工具
- 封裝變數 Encapsulate Variable(封裝集合是它的特例)
- 封裝記錄 Encapsulate Record(欄位層級的封裝思路一致)
- 重構