假设我有一门课来模拟一个城市。其特点如下:
- 它只有两个属性“name”和“population”,都是在构造函数中设置的私有属性。
- 它具有这些属性的 getter,但没有 setter。
我不希望此类的任何用户设置属性,我希望他们使用公共 .edit() 方法。
这种方法需要打开一个表格来输入城市和人口的新名称,即:一个视图。然后,如果我有一个视图,我想实现 MVC 模式,所以我的想法是控制器接收 .edit() 调用,呈现视图,检索数据,并将其发送到视图,以便它改变了它的状态。
但是,如果这样做,我必须将城市模型的属性从私有更改为公共。因此,如果任何用户实例化我的类,她/他可以直接更改属性。
所以,哲学问题:这不是打破封装吗?
编辑只是为了使它更明确:
这种city_instance.edit()
方法应该是改变对象的唯一方法。
此外,我看到我的部分问题来自对模型是对象的误解(您可以在 php mvc 框架上阅读),当它实际上是一个不同的抽象时,它是一个分组业务逻辑的层(域对象 +我猜更多的东西)