Я смотрел на исходный код нескольких драгоценных камней в последнее время. Одна идиома, которую я продолжаю видеть, является использованием вложенного модуля, содержащего константы версии, к которым присоединяются в строку версии т.е. изменения вокруг этого вида вещи:
module ChunkyBacon
module Version
MAJOR = 0
MINOR = 6
TINY = 2
end
VERSION = [Version::MAJOR, Version::MINOR, Version::TINY].compact * '.'
end
Каково преимущество (если таковые имеются) хранения информации о версии библиотеки таким образом? Почему не просто сделайте:
module ChunkyBacon
VERSION = '0.6.2'.freeze
end
Для программной проверки совместимости проще иметь явно разделенный номер версии.
например:
require 'chunkybacon'
if ChunkyBacon::VERSION::MAJOR > 0
# barf
end
Как правило, информация о версии в строке является плохой идеей.
Например, никогда не может быть Ruby 1.10, потому что слишком много приложений, которые проверяют совместимость с использованием , если RUBY_VERSION> '1.6'
сломаются. (Потому что лексикографически 1.10 <1.6
) Вот почему существует эта сложная схема, в которой то, что обычно было бы Ruby 1.9.x, было вместо Ruby 1.9.0-x и что было бы было бы Ruby 1.10.x теперь Ruby 1.9.x + 1. Итак, предстоящая версия Ruby, то есть Ruby 1.9.2, которая выглядит как нестабильная разрабатываемая версия, на самом деле является Ruby 1.10.1, производственной версией. .
Это приводит к большой путанице. Например, даже многие опытные лидеры сообщества Ruby до сих пор распространяют дезинформацию о том, что Ruby 1.9 - это разрабатываемая версия , несмотря на тот факт, что изменение в политике управления версиями широко освещалось.
Другой пример - браузер Opera. Когда была выпущена Opera 10.0, она изначально сообщала номер своей версии как 10.0. Однако во время бета-тестирования стало ясно, что многие веб-сайты, в том числе очень большие и уважаемые, полностью сломались, потому что Opera была первым в истории основным браузером, достигшим версии 10.0, и эти веб-сайты выполняли простое сравнение строк и, таким образом, думали, что они имели дело с Opera 1.0, которая не поддерживает JavaScript или CSS. Единственным работоспособным решением было то, что последняя версия Opera 10.0 печатала 9.80 как номер версии.
Марк Руссинович также громко разглагольствовал о сравнении номеров версий во время презентации ядра Windows 7 на Microsoft PDC. Он объяснял аудитории, почему номер версии Windows 7, который раньше был 7 в ранних сборках, в выпуске был 6.1. Причина в том, что многие приложения либо деградировали, либо вообще перестали работать. Некоторые просто проверяли if major == 6, затем Enhanced_vista_mode else crappy_xp_mode
, что означает, что в Windows 7 они будут работать с пониженной производительностью. Другие были еще более агрессивными и имели что-то вроде , если major == 6, то расширенный_vista_mode elsif major == 5, затем crappy_xp_mode else unsupported_windows_version
, и они вообще откажутся работать. (Что, конечно, глупо, поскольку Windows 7 полностью обратно совместима с Vista.)
Итак, Microsoft изменила номер версии на 6.1, и Руссинович сказал полушутя, полушутя и серьезно, что это, очевидно, означает, что номер версии для Windows 8 должен быть 6.1.1. и так далее.
Итак, короче: программисты слишком глупы, чтобы сами разбирать номера версий, вы должны сделать это за них.