管理配置文件的最佳方式?

Best way to manage a Configuration File?

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

我们的目标是让配置文件指定在特定事件发生时应采取的操作。

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

  1. 在配置文件中,指定 class 的 class 路径,它实现了要采取的操作 (例如:"ActionToTake":"com.company.publish.SendEveryoneAnEmailClass")。 在代码中,当遇到这个事件时,我们可以依次执行 Class.forName(config.ActionToTake).newInstance().运行()调用指定的操作。

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

我们目前是一个非常小的团队,目前只有 reading/using 这个配置文件的人是我们的软件开发团队。但不清楚未来是否会继续如此。

选项 1 背后的原因:阅读配置文件的任何人都会明确并立即知道将调用什么 class,以及它的实现位置。这也允许 action-class 来自完全独立的 JAR 文件 implemented/imported,而无需 recompiling/changing 我们的代码。

选项 2 背后的原因:配置文件应该是对用户意图的高级描述,不应包含具体 class 名称和包路径等实现细节。 class/package 名称的重构也可以在不更改配置文件的情况下完成。

关于配置文件首选这 2 种设计哲学中的哪一种?

第一个选项的优点是,正如 jas 所注意到的那样,'link' 将来可以编写代码。仅当您 sell/distribute 您的软件作为封闭源代码包或者您计划在生产环境中进行热插拔时,这才是真正的优势。您已经指出了缺点 - 重构

第二个选项:

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

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