在类中硬编码设置是不是很糟糕?

时间:2013-09-02 11:20:34

标签: java oop

我有一系列的配置虽然将来可能会发生变化,但可能永远不会有变化。

如果有任何缺失或不正确,那么我系统的某个功能将无法正常工作。

这些仍然可以被检索到某种配置,xml,数据库等,并且可供最终用户更改 - 或者这是一个很好的情况,在使用它们的类中对它们进行硬编码更有意义?

我花了很长时间一遍又一遍地改变主意。

7 个答案:

答案 0 :(得分:4)

最佳做法是使用任何类型的配置或属性文件,并使用默认值并在文件损坏/丢失时进行故障保护。这些方法具有以下优点:

  • 可以很容易地将其识别为配置文件,这意味着其他开发人员无需深入了解您的类以更改参数
  • 属性文件可以通过像ant这样的构建工具编写,所以如果你有例如一个测试服务器地址和一个高效的服务器地址,ant任务可以相应地改变内容
  • 即使没有它也能使用默认值

缺点是增加了复杂性。

答案 1 :(得分:3)

设计师对需要改变的可能性的估计并不是做出决定的可靠标准,因为我们程序的真实使用有其特殊的方法证明我们是错的。

不要问自己“改变的可能性有多大?”,不要问自己“最终用户做出改变是否有意义?”如果答案是“是”,请将其改为用户可更改;否则,只能通过你的代码使其更改。

通过这种机制,您可以更改某些内容(数据库,配置文件,自定义XML文件等)并不重要。重要的是要为缺少的设置提供良好的默认设置,以便最终用户通过提供部分配置来更难破坏系统。

答案 2 :(得分:2)

是的,对它们进行硬编码几乎肯定是个坏主意;如果不出意外,它可以使测试(无论是自动的还是手动的)比它需要的更加困难。使用通常的默认值在jar中包含.properties文件很容易,将来更改它们只需要在运行时覆盖它们。如果您可以灵活地安排依赖注入,那么依赖注入通常是更好的选择。

答案 3 :(得分:0)

如果配置永远不会像你说的那样改变,那么如果你将这些属性声明为接口或单独的类中的变量并在程序中使用此常量,那么它很好。
仅当某些属性值未修复且依赖于数据库名称,用户名,密码等环境时,才使用单独的属性文件。而某些属性是固定的,并且不依赖于它将要部署的环境像portno,tablenames如果有的话。

答案 4 :(得分:0)

这取决于您的申请。作为一个基线,它的好设计是使用静态变量来保存程序所需的数据,而不是在整个地方硬编码字符串和整数;这意味着将来的任何更改(即应用程序范围的字体颜色)只需要一次更改,然后是编译周期,您的好处就可以了。

但是,如果这些设置是用户可配置的,那么它们就不能进行硬编码,而是需要从外部源读取,而在这里,它是设计,复杂性和安全性的问题。

纯文本文件适用于小型应用程序,其中安全性较高且事物为纯文本。 SublimeText编辑器和notepad ++编辑器为他们的主题设置执行此操作,它运行良好。 (我相信这是纯文本,也许他们现在已经转移到XML了)

更好的选择是XML,因为它是结构化的,更易于阅读/解析/写入。许多项目都将此作为一种选择。要注意的一件事是损坏的文件,在读取/写入它们时,如果用户关闭程序或者JVM因任何原因随机退出。您可能希望查看缓冲区之类的内容。如果缺少text / xml文件,还要处理FileNotFoundExceptions。

另一个选项是某种类型的数据库文件,它更安全一点,您可以添加应用程序级加密,并且您有多种选择。已经使用数据库后端的大型程序(如MySQL)已经有一个数据库可供使用,因此创建一个新表并将配置存储在那里。小型应用程序可以将SQLite视为一种选择。

答案 5 :(得分:0)

如果嘿嘿“可能”改变,或者你可能会后来感到遗憾并让别人发疯(很可能是在大型或/和开源项目中),永远不要硬编码。如果配置永远不会改变,那么它不再是一个配置,而是一个常量。

在试验代码时仅使用硬编码。

如果要保存简单值,可以使用java属性。

查看HERE示例。

祝你好运。

答案 6 :(得分:0)

您可以更改某些属性,而无需重新测试软件。您已针对一系列值测试了这些属性,或者您确定最多可以通过重新启动进行更改。此属性可以配置。

除非重新测试软件,否则您无法承担其他属性。在这种情况下,最好硬编码他们恕我直言。这会鼓励您在更改此值时完成发布过程。你永远不会期望改变的价值观是一个很好的选择。