JavaFX GUI中的关注点分离

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX GUI中的关注点分离相关的知识,希望对你有一定的参考价值。

情况

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

  • 数据
  • GUI
  • 过程

GUI是一种查看和编辑数据的方法,该过程是一个需要数据执行其工作的过程。可以将GUI视为允许用户自定义过程的补充部分。

鉴于其性质,数据需要可写入存储,并可由GUI读取。当然,我正试图

问题

假设我有一个名为“人”的班级,名字和年龄的成员。为了将此对象数据绑定到视图,它必须包含表示数据的Property对象。这将使该类本身不可序列化(意味着我需要使用额外的代码对其进行序列化)。这也让这个阶级感到臃肿,感觉就像违反了分离关注。

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

该页面上的最佳答案建议使用DataModels,这些模型基本上是可观察的版本。此外,它们可以使用“保存”和“加载”方法进行序列化。

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

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

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

问题

我如何决定这些选项?

  • 使我的模型可以通过视图和Serializable进行观察,同时仍然可以作为具有原始getter和setter的基本模型。
  • 创建DataModel的中间步骤,它是表示模型并绑定到视图的Observable Objects。这些对象必须能够接受模型作为依赖关系,然后转换回模型(在由GUI修改之后)。

第一个选项是更少的代码。它需要的只是每个原始成员的瞬态Property成员,以及2个序列化和反序列化的方法。但是,这感觉就像直接违反了“关注点分离”。

第二个选项是更多代码,但它通过中间人(DataModels)完全分离原始数据和GUI。对于我需要在View中显示的每个对象,它需要一个全新的类,以及与所述对象进行转换的方法!然而,感觉......“正确”。

我在这些选项之间限制了问题的范围,以便更好地适应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和Process中使用。因此,每个数据都需要能够从GUI查看,序列化并以最基本的格式使用。
答案

我花了很多时间来找出一个类似的好的实现方案,但加班我完成了它,并由我自己完成。这是一个为期3年的项目,最终完成,看起来很漂亮。

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

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

对于操作机制,根据需要同时执行线程以最大化其能力和功能,并确保在其他操作正在处理时没有组件冻结。特别是从服务器端。

不要忘记安全性,大多数Java服务器都会在本地计算机上打开可远程访问的端口。

以上是关于JavaFX GUI中的关注点分离的主要内容,如果未能解决你的问题,请参考以下文章

javafx是啥

当DataInputStream处于while循环时,JavaFX GUI卡住了

JavaFX窗口拖动

JavaFX自定义窗口标题栏

关于AOP编程

JavaFX Scene Builder 怎么用???