圣诞大减价开始了!

重复观测数据

问题

域数据存储在负责GUI的类中吗?

解决方案

然后,最好将数据分离到单独的类中,以确保域类和GUI之间的连接和同步。

之前
重复观测数据-之前
复制观测数据-之后

为什么重构

您希望为相同的数据拥有多个界面视图(例如,您同时拥有桌面应用程序和移动应用程序)。如果您不能将GUI与域分离,那么您将很难避免代码重复和大量错误。

好处

  • 在业务逻辑类和表示类之间划分责任(参见单一责任原则),使您的程序更具可读性和可理解性。

  • 如果需要添加新的接口视图,请创建新的表示类;您不需要触及业务逻辑的代码(参见打开/关闭原则).

  • 现在不同的人可以处理业务逻辑和用户界面。

什么时候不用

  • 这种重构技术,其经典形式是使用观察者模板,不适用于web应用程序,其中所有的类都是在对web服务器的查询之间重新创建的。

  • 同样,将业务逻辑提取到单独的类的一般原则也适用于web应用程序。但是这将使用不同的重构技术来实现,这取决于您的系统是如何设计的。

如何重构

  1. 对象中隐藏对域数据的直接访问GUI类.对于这种情况,最好使用自封装字段.你为这个数据创建了getter和setter。

  2. 在处理程序中GUI类事件,使用setter设置新的字段值。这将允许您将这些值传递给关联的域对象

  3. 类中复制必要的字段GUI类到它。为所有这些字段创建getter和setter。

  4. 为这两个类创建一个观察者模式:

    • 域类,创建一个数组来存储观察者对象(GUI对象),以及注册、删除和通知它们的方法。

    • GUI类的引用,创建一个字段用于存储对域类以及update ()方法,该方法将对对象中的更改作出反应,并更新对象中字段的值GUI类.注意,值更新应该直接在方法中建立,以避免递归。

    • GUI类的实例域类并将其保存在您创建的字段中。注册GUI对象作为一个观察者域对象

    • 在for的setter中域类字段,调用用于通知观察者的方法(换句话说,用于更新的方法GUI类),以便将新值传递给GUI。

    • 的设置符GUI类字段,以便直接在域对象中设置新值。注意确保值不是通过域类setter -否则将产生无限递归。

Baidu
map