有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javafxgui中关注点的java分离

形势

我正在开发一个JavaFX桌面应用程序,它可以分为三个部分:

  • 数据
  • GUI
  • 过程

GUI是查看和编辑数据的一种手段,而流程是一个需要数据来执行其工作的流程。可以将GUI看作是一个补充部分,它允许用户自定义流程

考虑到数据的性质,数据需要可写到存储器中,并且可以被GUI读取。当然,我正试图

问题

假设我有一个“Person”类,成员包括姓名和年龄。为了将此对象数据绑定到视图,它必须包含表示数据的属性对象。这将使类本质上不可序列化(这意味着我需要用额外的代码对其进行序列化)。这也会使类膨胀,这感觉像是违反了关注点分离

为了解决这个问题,我找到了一个关于StackOverflow的标准指南。 Applying MVC With JavaFx

该页面上的首要答案是建议使用数据模型,数据模型基本上是模型的可观察版本。此外,它们还可以有用于序列化的“save”和“load”方法

这似乎是一个更好的解决方案,适用于纯数据驱动的应用程序然而,我的情况不同,因为即使我的应用程序是数据驱动的,它也非常实用(在后台执行操作)

如果我使用传统的数据模型,我需要确保数据模型可以转换为不可观察的模型,或者确保它们有方法返回不可观察对象(如原语)中的所有数据块。代码的功能模块不需要识别和处理可观察的属性

作为比较,我真的很喜欢C#如何具有内在可观察的属性,并且非常适合WPF。C#的方法允许我以两种方式使用数据,而无需将数据转换为可观测数据和可观测数据(当然也有例外!)

问题

如何在这些选项之间做出选择

  • 使我的模型可以被视图观察并可序列化,同时仍然作为基本模型使用基本的getter和setter
  • 创建数据模型的中间步骤,数据模型是表示模型并绑定到视图的可观察对象。这些对象必须能够接受作为依赖项的模型,然后再转换回模型(在GUI修改之后)

第一个选项是更少的代码。它只需要为每个原语成员提供一个临时属性成员,以及两个序列化和反序列化方法。然而,这感觉像是对关注点分离的直接违反

第二个选项是更多的代码,但它通过中间人(数据模型)将原始数据和GUI完全分离。对于我需要在视图中显示的每个对象,它都需要一个全新的类,以及与所述对象之间的转换方法!然而,感觉。。。。。“适当的”

为了更好地适应StackExchange,我限制了这些选项之间的问题范围。然而,我对任何新的观点都持开放态度

下面是一些示例代码

下面是一个使用数据模型的示例

class Person implements Serializable
{
    private String name;
    public String getName(){...}
    public void setName(){...}
}
class ObservablePerson //DataModel
{
    private StringProperty name;

    public ObservablePerson(Person person)
    {
        name = new SimpleStringProperty(person.getName());
    }

    public StringProperty nameProperty()
    {
        return name;
    }

    public Person toPerson()
    {
        ...
    }
}

下面是一个没有数据模型的示例:

class Person implements Serializable
{
    private transient StringProperty name;

    public String getName(){ return name.getValue();}
    public void setName(String name){ this.name = new SimpleStringProperty(name); }

    public StringProperty nameProperty()
    {
        return name;
    }

    // 
    public void serialize()
    {
        //pseudocode
        write(name.getValue());
    }
    public void deserialize()
    {
        //pseudocode
        name = new SimpleStringProperty(readString());
    }
}

旁注

  • 应用程序的主要目的是功能性的它在后台执行操作。这是一个自动化工具。因此,数据(和GUI)是对其功能的补充。GUI是一种定制工具,而不是核心功能
  • 应用程序中的所有数据都是可修改的,并在GUI和流程中使用。因此,每个数据段都需要能够从GUI中查看、序列化并以最基本的格式使用

共 (1) 个答案

  1. # 1 楼答案

    我花了不少时间才为类似的东西想出一个好的实施方案,但随着时间的推移,我自己完成了。这是一个为期三年的项目,最终完成了,看起来很漂亮

    我的建议是,回答问题的最好方法是自己回答。您确切地知道自己想要什么,以及希望程序/服务器如何运行

    对于可观察的实例,尝试创建单独的实例。一个用于本地显示在GUI上,另一个用于串行通信

    对于操作机制,让线程按需并发执行,以最大限度地提高其能力和功能,并确保在处理其他操作时没有组件冻结。尤其是服务器端

    不要忘记安全性,大多数java服务器都会在本地机器上打开端口,这些端口可以远程访问