【问题标题】:Best way to manage a Configuration File?管理配置文件的最佳方式?
【发布时间】:2015-06-29 03:31:21
【问题描述】:

我和一位同事正在讨论管理配置文件的最佳实践,我们希望从其他人那里获得更多反馈。

我们的目标是让配置文件指定在某些事件发生时应采取的行动。

我们正在讨论的 2 个选项:

  1. 在配置文件中,指定类的类路径,实现要采取的动作(例如:“ActionToTake”:“com.company.publish.SendEveryoneAnEmailClass”)时间>。 在代码内部,当遇到此事件时,我们可以执行 Class.forName(config.ActionToTake).newInstance().run() 以调用指定的操作。

  2. 在配置文件中,以人类可读的短语指定应采取的操作(例如:“ActionToTake”:“SendEveryoneAnEmail”)。在代码内部,当遇到此事件时,我们可以解析 config.ActionToTake,并执行一个映射,将其转换为操作实现(例如:new SendEveryoneAnEmailClass().run())

我们目前是一个非常小的团队,目前唯一阅读/使用此配置文件的人是我们的软件开发团队。但目前还不清楚这是否会在未来继续存在。

选项 1 背后的原因:任何阅读配置文件的人都将明确且立即知道将调用哪个类以及在何处实现。这也允许从一个完全独立的 JAR 文件中实现/导入动作类,而无需重新编译/更改我们的代码。

选项 2 背后的原因:配置文件应该是对用户意图的高级描述,并且不应包含诸如特定类名和包路径之类的实现细节。类/包名称的重构也可以在无需更改配置文件的情况下完成。

对于这两种设计理念中的哪一种更适合配置文件的想法?

【问题讨论】:

  • 对我来说,选项 (1) 的另一个最重要的优点是,稍后您可以将 ActionToTake 配置为您尚未编写的类,(或者其他人可以使用他们的自己的类),所有这些都没有对调用在操作上运行的代码进行任何更改。这很像 Spring 配置文件为 IOC 工作的方式,而像 Eclipse 这样的 IDE 在重构类和包名称时会选择性地包含 XML 配置文件。

标签: java configuration config configuration-files


【解决方案1】:

第一个选项的优势是,正如 jas 所注意到的,将来能够“链接”代码。仅当您将软件作为封闭源软件包销售/分发或计划在生产中进行热交换行为时,这才是真正的优势。您已经指出了缺点 - 重构

第二个选项:

  • 它不会帮助您进行重构。如果您将操作从 SendEmail 更改为 BringBeer,但留下字符串 send email,那么您失败了。
  • 可读性。 send-everyone-an-emailSendEveryoneAnEmail 一样好。每个开发人员都会知道会发生什么。不能与LaunchRockets 混淆。您的代码可以根据某些文本查找类,不一定是完整的限定名称。除非明确提供,否则您的代码可以假定操作位于某个特定包中。这是一种结合两种选择的方法。

考虑另一种可能性:在代码中进行配置。如果不想重新编译包,可以使用脚本语言(groovy)。它可以让您创建非常可读的 dsl,并且您将进行重构。

【讨论】:

  • 感谢您的回复。您能否澄清以下内容的含义:“它不会帮助您进行重构。如果您将操作从 SendEmail 更改为 BringBeer 但留下字符串 send email 那么您失败了。”对于第二个选项,我想到的示例是您有某种 map/case 语句,它将在 config.ActionToTake.equals("SendEveryoneAnEmail") 时创建 SendEveryoneAnEmailClass 的实例。在这种情况下,如果您重构名称IDE 上的类,无需进一步更改。但是在第一个选项中,您还必须手动编辑配置文件。
  • 我想我现在明白你的意思了。您指的是我们想要更改操作本身的性质的情况(SendEmail 与 BringBeer)。通过重构,我指的是小的更改,例如命名更改(SendEveryoneAnEmail 与 SendEveryoneMail)或包路径更改。对于此类格式更改,如果您使用第二个选项,IDE 可以非常轻松地完成所有操作,而无需任何进一步的工作。但是在第一个选项中,需要一些额外的工作来更改配置文件中的所有类路径,我认为这是第一个选项的缺点。
  • @RvPr 忘了提及 - 您可以添加测试来检查您的所有配置文件是否包含有效数据/现有类
猜你喜欢
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 1970-01-01
  • 2011-05-06
  • 1970-01-01
  • 2016-05-17
相关资源
最近更新 更多