我最近一直在寻找一些宝石的源代码.我一直看到的一个习惯用法是使用嵌套模块,其中包含连接到版本字符串的版本常量,即围绕这类事情的变化:
module ChunkyBacon
module Version
MAJOR = 0
MINOR = 6
TINY = 2
end
VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
end
Run Code Online (Sandbox Code Playgroud)
以这种方式存储库版本信息的优点(如果有的话)是什么?为什么不这样做:
module ChunkyBacon
VERSION = '0.6.2'.freeze
end
Run Code Online (Sandbox Code Playgroud)
Jör*_*tag 10
在字符串中包含版本信息通常是个坏主意.
例如,永远不会有Ruby 1.10,因为测试兼容性的太多应用程序if RUBY_VERSION > '1.6'会破坏.(因为字典顺序,1.10 < 1.6)这就是为什么有这种复杂的系统,哪里还有什么会通常已经红宝石1.9.x的是,而不是红宝石1.9.0-X,什么会一直红宝石1.10.x现在的Ruby 1.9.x的+ 1.因此,即将推出的Ruby版本,即Ruby 1.9.2,看起来像是一个不稳定的开发版本,实际上是Ruby 1.10.1,它是一个生产版本.
这导致了很多混乱.例如,即使是许多经验丰富的Ruby社区领导者,仍然在传播Ruby 1.9作为开发版本的错误信息,尽管版本控制策略的变化已被广泛传播.
Opera Web浏览器是另一个例子.当Opera 10.0发布时,它最初报告的版本号为10.0.然而,在最糟糕的时候,很明显许多网站,其中非常大和备受尊重的网站,完全打破了,因为Opera是第一个达到10.0的主流浏览器,这些网站正在进行简单的字符串比较,因此认为他们正在处理Opera 1.0,它不支持JavaScript或CSS.该唯一可行的解决方案是,歌剧10.0打印9.80的版本最终发行数量.
Mark Russinovich在他关于微软PDC的Windows 7内核的演示中也有一个关于比较版本号的咆哮.他向听众解释为什么Windows 7的版本号(在早期版本中曾经是7版)在版本中为6.1.原因是许多应用程序降级或无法工作.有些人只是检查if major == 6 then enhanced_vista_mode else crappy_xp_mode他们会在Windows 7中运行降级的方式.其他人甚至更具侵略性并且有类似的东西if major == 6 then enhanced_vista_mode elsif major == 5 then crappy_xp_mode else unsupported_windows_version,他们会拒绝工作.(这当然是愚蠢的,因为Windows 7完全向后兼容Vista.)
因此,微软将版本号更改为6.1,Russinovich说,半开玩笑,半悲伤和严肃,这显然意味着Windows 8的版本号必须是6.1.1.等等.
因此,长话短说:程序员自己解析版本号太愚蠢,你必须为他们做.
对于编程兼容性检查,更容易使用明确分隔的版本号.
例如:
require 'chunkybacon'
if ChunkyBacon::VERSION::MAJOR > 0
# barf
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
606 次 |
| 最近记录: |