-1

我不了解使用 XML 存储设置、页面或 GUI 布局甚至 bean 集的全球时尚。

如果我们考虑到 XML 不是单一语言,而是定义多种语言的模板这一事实,那么大规模的疯狂就变得显而易见了。

为什么要使用数十种语言而不是使用一种?

例如,Java。

它可以定义或声明任何类型的 GUI 层次结构、设置表等。

那么我们为什么不使用java文件来存储所有的东西呢?

例如,可以提供如下 java 格式的设置文件:

class Properties {

   String dbpassword = "password";

   String database = "localhost";

   String dbuser = "mkyong";

}

该文件可以通过运行时编译器即时编译,并通过反射提取字段。

那么,我们为什么不这样做呢?

唯一想到的原因是安全性。

外部文件不仅可以包含属性,还可以包含一些构造函数代码,这可能会破坏应用程序或使其崩溃。

所以。这种情况有什么保护措施吗?我们可以限制运行时编译文件的可能功能吗?

更新

我的意思不是Java。Java 只是一个示例。我需要使用单一语言的方法。

更新 2

我声称,在整个项目方面使用一种单一语言会更好。

假设在 MVC 模式中,我们将为模型、视图和控制器使用三种不同的语言!这将是无稽之谈!我们使用单一语言。我的意思是我们人们使用不同的语言,但每个程序员都使用一种语言,但仍然分隔 MVC。这就是配置文件的含义:再分离一个概念。仅仅因为概念是分开的,使用不同的语言没有任何意义。

这也适用于 HTML / JavaScript / CSS。拥有三种语言是没有意义的。没有任何该死的感觉!

我当然理解历史原因等。但这些都是没有意义的,这些只是讨厌的原因。

那么,为什么我们会看到具有相同性质的新项目和新项目呢?

为什么 MS 为 WPF 创建 XAML?他们创造了新的新鲜的 C# 语言,为什么不把 XAML 也放进去呢?

Oracle 为什么要为 JavaFX 创建 FXML?感谢上帝,他们放弃了 JavaFX 脚本!因为他们只想为 RIA 提供三种语言!

4

2 回答 2

2

评论确定了一种可能的解释:

Java 语法很难用其他语言处理。

...虽然对于Java程序的配置属性,这似乎有点牵强。(为什么要从非 Java 程序中读取 Java 程序的配置属性?)

我认为没有人按照您的建议做的真正原因是它引入了一些问题,这些问题使您的解决方案与以“硬方式”进行 XML 配置一样糟糕。

  • 编写配置的人需要了解 Java 语法。

  • 如果他们犯了错误,应用程序必须在启动应用程序的过程中处理 Java 编译错误。

  • 访问这些属性需要应用程序程序员编写反射代码。这段代码通常很脆弱,编写它就像编写一堆 DOM 遍历代码以从解析的 XML 配置文件中读取内容一样困难。


现在也许 XML 不是配置文件的最佳选择。这些天来,我更喜欢经典的“属性”文件语法或 JSON。

但是,如果您以正确的方式进行操作,XML 也可以。例如:

  • 如果您使用 Java/XML 绑定库(例如JAXB),则无需编写 XML 解析器或一堆粗糙的 DOM 遍历代码来从解析树中挑选信息。

  • 您可以使用 DTD 或 XML 模式驱动的编辑器,这样用户就不需要编写(甚至查看)原始 XML 文件。

  • 如果您的配置非常复杂,您可以使用诸如 EMF 之类的东西对其进行建模,然后为配置访问器库和可定制的特定于应用程序的配置编辑器生成DTD / Schema 和所有 Java 代码。


作为记录,您提出的方法通常用于脚本语言,如 Perl、Ruby、Python 甚至“sh”。只是它在静态编译的语言中往往会出现问题。


回复您的后续“为什么 XXX 做 YYY”的问题:

  1. 我不知道。我不在房间里。
  2. 我的意见纯属猜测。
  3. 无论如何,他们为什么这样做并没有什么区别。

为了回应您一般的“没有意义”的评论/投诉,IT 世界充斥着务实的妥协/笨拙的解决方案。抱怨它没有任何意义。如果您想实现某些目标,请尝试出路,并向我们展示它在 Java 中确实有效的证据。

于 2014-01-19T22:48:09.200 回答
0

使用可执行代码进行配置是灾难的根源。考虑:

class Properties 
{
    String dbpassword = "password";
    String database = "localhost";
    String dbuser = "mkyong";

    static
    {
        File userDir = new File("c:\\users\\mkyong");
        userDir.delete();
        //etc...
    }
}

您可以尝试通过使用安全管理器来限制损坏来解决此问题,但它们并不完美。或者您可以编写自己的解析器,它只接受完整 Java 程序可以执行的子集(有限的 API、无 API 等,类似于 JSON 与完整的 Javascript)。但归根结底,Java 语法是否比其他配置文件格式更好?

于 2014-01-20T03:24:09.313 回答