sách gpt4 ai đã đi

clone - 封装聚合/组合

In lại 作者:行者123 更新时间:2023-12-04 07:04:23 33 4
mua khóa gpt4 Nike

维基百科关于封装的文章指出:

“封装还通过防止用户将组件的内部数据设置为无效或不一致的状态来保护组件的完整性”

我在一个论坛上开始讨论封装,在那里我问你是否应该始终在 setter 和/或 getter 中克隆对象,以保留上述封装规则。我认为,如果您想确保主对象内的对象不会被主对象外的对象篡改,则应始终克隆它。

一位讨论者认为你应该在这个问题上区分聚合和组合。基本上我认为他是这样的:

  • 如果要返回作为组合一部分的对象(例如,矩形的一个点),请克隆它。
  • 如果您想返回一个属于聚合的对象(例如,作为 UserManager 一部分的 User),只需在不破坏引用的情况下返回它。

  • 这对我来说也很有意义。但现在我有点困惑。并想就此事发表您的意见。

    严格来说,封装是否总是要求克隆?

    PS.:我用 PHP 编程,资源管理可能更相关一点,因为它是一种脚本语言。

    1 Câu trả lời

    Strictly speaking, does encapulation always mandate cloning?



    不,不是的。

    您提到的人可能将对象状态的保护与对象实现细节的保护混淆了。

    记住这一点:封装是一种增加 的技术。灵活性 我们的代码。一个封装良好的类可以 在不影响客户的情况下更改其实现 .这就是封装的本质。

    假设有以下类:
    class PayRoll {
    private List employees;

    public void addEmployee(Employee employee) {
    this.employees.add(employee);
    }
    public List getEmployees() {
    return this.employees;
    }
    }

    现在,这个类的封装性很低。您可以说 getEmployees 方法破坏了封装,因为通过返回 List 类型,您无法再更改此实现细节而不影响类的客户端。例如,我无法在不影响客户端代码的情况下为 Map 集合更改它。

    通过克隆对象的状态,您可能会改变客户端的预期行为。 这是解释封装的有害方式。
    public List getEmployees() {
    return this.employees.clone();
    }

    可以说上面的代码改进了封装,因为现在 addEmployee 是唯一可以修改内部 List 的地方。因此,如果我有一个设计决定,要在 List 的头部而不是尾部添加新的 Employee 项目。我可以做这个修改:
    public void addEmployee(Employee employee) {
    this.employees.insert(employee); //note "insert" is used instead of "add"
    }

    然而,这是封装的小增量,价格很高。您的客户得到的印象是可以访问员工,而实际上他们只有一份副本。因此,如果我想更新员工 John Doe 的电话号码,我可能会错误地访问 Employee 对象,期望更改会在下一次调用 PayRoll.getEmployees 时反射(reflect)出来。

    具有更高封装的实现将执行以下操作:
    class PayRoll {
    private List employees;

    public void addEmployee(Employee employee) {
    this.employees.add(employee);
    }
    public Employee getEmployee(int position) {
    return this.employees.get(position);
    }
    public int count() {
    return this.employees.size();
    }
    }

    现在,如果我想更改 map 的列表,我可以随意更改。
    此外,我并没有破坏客户可能期望的行为:从 PayRoll 修改 Employee 对象时,这些修改不会丢失。

    我不想过多地扩展自己,但让我知道这是否清楚。我很乐意继续提供更详细的示例。

    关于clone - 封装聚合/组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1349142/

    33 4 0
    行者123
    Hồ sơ cá nhân

    Tôi là một lập trình viên xuất sắc, rất giỏi!

    Nhận phiếu giảm giá Didi Taxi miễn phí
    Mã giảm giá Didi Taxi
    Giấy chứng nhận ICP Bắc Kinh số 000000
    Hợp tác quảng cáo: 1813099741@qq.com 6ren.com