🎯 什麼情境該想到我

當你「一個類別把內部的集合欄位(list、set…)直接透過 getter 交給外界」的時候——外部就能繞過這個類別偷偷增刪內容,破壞它該有的規則。改成提供 add/remove 方法,並讓取值回傳副本或唯讀視圖,把修改權收回來。

⚙️ 怎麼用(步驟 / 公式)

意圖:不要對外直接暴露集合欄位;由類別提供新增/移除方法,取值時回傳集合的副本或唯讀視圖。

動作要點(小步安全進行):

  1. 若集合尚未封裝,先對它做封裝變數 Encapsulate Variable
  2. 在類別上加入 add/remove 之類的修改方法,讓外界透過它們來改動集合內容。
  3. 找出所有直接對集合做增刪的呼叫端,改成呼叫這些方法,測試。
  4. 修改取值函式:改為回傳「副本」或「唯讀視圖」,讓呼叫端拿到的東西即使被動也不會影響內部真正的集合。
  5. 確保設值(如果有)也是接收內容後複製進內部,而非直接持有外部傳入的集合參照。

🧪 我實際套用的紀錄

  • (待填)

⚠️ 注意 / 什麼時候不適用

  • 若語言/團隊約定已用不可變集合,或此集合本就無需維持不變式,封裝的必要性降低。
  • 別做半套:只加 add/remove 卻仍讓 getter 回傳可變的原集合,等於沒封裝。

🔗 相關工具