我和一位同事正在讨论管理配置文件的最佳实践,并希望从其他人那里获得进一步的反馈。我们的目标是让配置文件指定在发生某些事件时应采取什么操作。
我们正在辩论的两个选项是:
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”:“com.company.publish.SendEveryoneAnEmailClass”)。在代码中,当遇到此事件时,我们可以执行 Class.forName(config.ActionToTake).newInstance().run() 以调用指定的操作。 2. 在配置文件中,用人类可读的短语指定应采取的操作(例如:“ActionToTake”:“SendEveryoneAnEmail”)。在代码中,当遇到此事件时,我们可以解析 config.ActionToTake,并执行将其转换为操作实现的映射(例如:new SendEveryoneAnEmailClass().run())。
我们目前是一个非常小的团队,目前只有我们的软件开发团队阅读/使用此配置文件。但未来是否会继续如此还不清楚。
对选项1的推理:任何阅读配置文件的人都将明确并立即知道将调用哪个类以及它在哪里实现。这也允许操作类从完全独立的JAR文件中实现/导入,而无需重新编译/更改我们的代码。
对选项2的推理:配置文件应该是用户意图的高级描述,不应包含实现细节,例如特定的类名和包路径。还可以重构类/包名称,而无需进行配置文件更改。
对于配置文件,您认为哪种设计哲学更好?