软件系统中的配置文件

每一个小人物的心中都有一个成为大人物的梦想,配置文件也不例外。

当咱们仍是编程新手的时候,常常会有一些前辈告诉咱们:软件开发中要将一些可能变更的参数放到配置文件中,这样就能够在不改变代码且无需从新部署程序的状况下改变程序行为。html

一、软件实践中的配置文件

正如前辈告诫咱们的那样,『将一些可能变更的参数放到配置文件中』,可使得程序更加灵活,适应多种业务场景。因而咱们谨遵他们的教诲,在平常的开发过程当中,将数据库链接参数,日志路径等线上环境相关的易变值加入配置文件。的确好用,当咱们的DB想要扩容,当咱们的日志存储想要变动,仅需修改配置文件便可。如此好用,某一天咱们可能也会将软件中的某一个功能特性开关移步到配置文件中。不止于此,咱们开始将更多的可变参数写在配置文件中,已达到更高的灵活度,更有甚者将一些业务逻辑操做从代码中挪到配置文件中。因而,某一天咱们忽然发现本身大部分的时间并非在写代码,而是写配置文件。数据库

二、每个配置文件都想成为一个DSL

每一个工具都想发展成为一个平台,无独有偶,每个配置文件都想成为一个DSL(Domain Specific Language,领域专用语言)。编程

正如第一部分描述的那样,起初配置文件中只是一些与代码执行环境有关的参数配置(供系统管理员使用),到最后,随着一些『业务行为』也被加入到配置文件中,它则慢慢地进化成为了一种DSL。但并非每个软件系统都须要一套本身的DSL,也不是每个DSL都会被设计地那么易懂与易用。有些仅仅是增长了复杂度。数据结构

有人发明了『配置文件复杂读时钟』的概念来描述配置文件这样的一个发展过程,十分贴切。
图片描述编程语言

  • 12点:全部逻辑均是写在代码里,有些甚至是硬编码 - 对应业务起步期。
  • 3点:前辈们告诉咱们,将一些可能变更的参数放到配置文件中 - 业务发展早期
  • 6点:需求快速变化,业务逻辑愈来愈复杂,配置文件也愈来愈复杂,引入一些条件判断,异常处理等- 业务发展中期。
  • 9点:有一些定制化的需求开始出现,为了应对这种变化,配置文件开始走向大量定义软件行为的方向,而且与业务规则紧密耦合在一块儿 - 业务发展顶峰期
  • 12点:最后的最后又回到原点,因此的业务逻辑均写在配置文件中,包括硬编码 - 业务发展瓶颈期。

因而,软件开发人员从面向代码编程变成了面向配置文件编程。其实,这个时期,配置文件俨然已变成了一种编程语言。工具

那么回过头来想想,在业务发展过程当中,衍生出了一门配置编程语言,这有必要嘛?学习

配置文件有时候的确很好用,能够帮助软件开发人员快速应对一些变化。可是若是过分依赖配置文件,却不得不提它带来的缺陷:编码

  • 不通用:配置文件引入了非通用的语法、语义,这对项目项目新人来讲,无疑增长了学习难度,也下降了团队的合做效率。
  • 调试困难:不像代码,配置文件没法在软件系统发生异常时进行有效地调试,导致没法快速定位问题,修复问题,下降了软件系统的健壮性。
  • 可维护性差:每一门编程语言都基本上有一套自身的通用编码规范,并随着开发者社区而获得进一步的完善,而配置文件,大多数软件系统都会定义一套本身特殊的语义。相对而言一份使用通用编程语言编写代码的项目比软件自带配置文件要更好维护。
  • 高度耦合:配置文件就如同系统对外API,一旦对外暴露就很难收回。做为模块的API,应该尽量地小而窄,保持高内聚,低耦合
  • 图灵完备性:不少带有『行为』的配置文件根本不是图灵完备的(即没法表达出计算机的全部行为),而基本上全部的编程语言都是图灵完备的。

本质上:配置文件与代码表明了两种编程范式:声明式(Declarative programming)与命令式(Imperative programming)。spa

当前,几乎全部计算机的硬件工做都是命令式的,也几乎全部计算机的硬件都是设计来运行机器代码,使用命令式的风格来写的。从这点来说,大部分场景使用代码实现业务逻辑要优于配置文件。设计

三、代码 OR 配置文件

要回答这个问题,须要对配置文件的目的做出一个定义。

对于大部分的软件系统而言,配置文件是为软件系统的管理员而准备的,方便他们正确而高效地使用软件系统。这样的场景下,应强于代码而弱于配置文件。

这里总结了一些tips,仅供参考:

  • 应当仅将简单的key-value配置放到配置文件中。
  • 若是容许非开发人员快速改变程序行为,那么能够考虑配置文件。
  • 任何涉及业务逻辑的地方都应该放到代码里实现,配置文件不建议加入业务『行为』。
  • 若是配置改变须要代码改变,那么须要谨慎使用。
  • 若是配置项仅仅是开发者理解的数据结构,那么须要谨慎使用。
  • 使用者为配置负责,开发者为代码负责。

凡事终有例外。如这样的一个场景:应用程序须要容许用户(使用者)动态地配置复杂的规则(邮件用户想要定义复杂的邮件过滤规则),另一些成熟的商业规则系统中也经常使用配置文件(做为DSL)解决一些特定领域的问题。

REFERENCES

https://stackoverflow.com/que...
https://zh.wikipedia.org/wiki...
https://zh.wikipedia.org/wiki...
https://blog.urth.org/2011/01...
http://mikehadlow.blogspot.co...
https://hackernoon.com/config...
http://taint.org/2011/02/18/0...

相关文章
相关标签/搜索