Java的;运行时解释;添加插件的策略

时间:2009-08-25 23:53:49

标签: java interpreter extensible

我开始开始我的第一个大项目了。它将是一个与Rosetta Stone非常相似的程序。它将是一个程序,用于学习外语,使用Swing用J​​ava编写。在我的计划中,我计划用户能够选择下载的课程来学习。因为我是母语为英语的人,所以我将能够创建一门英语课程。但是,我希望说其他语言的人能够编写课程供用户使用(这是我的课程工作的重要部分)。

由于我希望用户能够下载他们想要的语言课程,因此将其硬编码到程序中是不可能的。需要在运行时解释课程。此外,由于我希望其他人与我的工作合作(即制作课程),我需要让他们这么做。

这样做最好的方法是什么?

我想出的想法是有一个严格的空课程大纲(硬编码)和一个简单的xml文件,详细说明了要使用的文本和声音。这样做的缺点是它极大地限制了作者。不同的语言可能需要从学习不同的部分开始。

对于手头的问题以及整个项目的任何建议将不胜感激。任何相关资源或信息的链接也将不胜感激。

想想你的时间和精力,

Joseph Pond

3 个答案:

答案 0 :(得分:5)

简单地说,您应该将程序基于Eclipse RCP或Netbeans Platform等系统。这两个系统都已经完全解决了这个问题,两者都完全适合这项任务。它们不只是用于IDE。

这是一个更大的第一步,因为您需要学习其中一个平台,而不仅仅是Swing。

但是,他们解决了这个问题,无论如何,他们的整体组织和技术将很好地为您的计划服务。

不要重新发明这个轮子,只需学习其中一个。

答案 1 :(得分:1)

如果您从头开始这样做(Will的想法还不错),我要做的是首先放下最容易创建语言课程的文件格式。它可以是XML,纯文本或你自己想出的其他一些格式。

您可能需要一些语言格式的灵活性,因为您希望能够实际指定问题和答案等内容。由于所有额外的终结符,XML是一种痛苦,但它提供了大量的元数据。如果您喜欢XML,可以考虑使用YML定义语言文件,它会为您提供XML数据,但使用空格描绘符而不是尖括号。

您可能还希望使用其创建的语言定义文件,因此您可能希望也可能不希望将英语单词作为键。如果您不想要任何英语,您可能必须跳过XML和YML并提出自己的文件格式 - 可能是布局和/或特殊符号定义流和“功能”的地方。

一旦定义了文件格式,您就不必担心硬编码任何东西......您将无法进行硬编码,因为它已经存在于文件中。

插件功能也很不错......这是您的定义文件还包含的信息,它告诉您要实例化(反射性地)的类以及用于解析/显示数据的类。通过这种方式,您可以通过提供新的jar文件来添加新类型的问题。

如果这令人困惑,抱歉,这在单向论坛中很难,因为我看不到你的脸,看看你是否跟着我,或者我是否朝着正确的方向前进。如果您认为我走在正确的轨道上并想要更多详细信息(我之前已做过一些这样的事情),请随时在评论中留下后续问题(或电子邮件地址),我会很高兴与你进一步讨论。

答案 2 :(得分:1)

如果我这样做,我会认真考虑使用Eclipse EMF来模拟用于定义课程的“语言”。 EMF起初相当令人生畏,但它给了你:

  • 可以通过多种方式输入/编辑的高级模型。
  • 将“实例”(即课程)序列化为XML的自动机制。 (如果你愿意,你可以修改序列化。)
  • 为实例的内存中表示自动生成的Java类。它们提供了针对您的模型调整的API,这些API是EMF等效的Java反射...但是基于EMF模型类而不是Java类。
  • 为您的“实例”自动生成的树编辑器。
  • 用于实现您自己的约束/验证规则的钩子,以说明什么是有效的“课程”。

相关的Eclipse插件提供:

  • 通过生成解析器/解析器来映射到基于文本的语言
  • 映射图形语言;例如使用方框/箭头等的符号
  • 各种更高级的持久性机制
  • 比较/差异,模型到模型转换,OCL中的约束等

我在一些大型项目中使用了EMF,让我回归更多的主要观点是模型演变的简易性......与在较低抽象层次上构建所有内容相比。如果我的模型(语言)需要扩展/更改,我可以使用EMF模型编辑器进行必要的更改,重新生成代码,扩展我的自定义代码以使用扩展来做正确的事情,而且我已经完成了(存储实例的模数转换。)