封裝可變資料有很多好處,但面對集合類別時得避免提供 get 即得到集合本身的錯誤。
使用者可能藉此繞開設計干預,直接更改當中成員。

Encapsulate Collection

我們可以提供替代 get,回傳集合副本
這類設計重點是保持一致性:只採取一種機制,讓任何集合存取函式被呼叫時,使用者都能習慣和預期其行為。

# Before
project_tasks = ["Define requirements", "Develop prototype", "Conduct testing"]
project_tasks.append("Deployment")
print("Project Tasks:", project_tasks)

# After
class Project:
    def __init__(self):
        self._tasks = ["Define requirements", "Develop prototype", "Conduct testing"]

    def add_task(self, task):
        self._tasks.append(task)

    def get_tasks(self):
        return list(self._tasks)  # 返回任務列表的副本以防止外部修改

project = Project()
project.add_task("Deployment")
print("Project Tasks:", project.get_tasks())