Почему использование вложенный модуль Ruby для получения информации о версии?

Я смотрел на исходный код нескольких драгоценных камней в последнее время. Одна идиома, которую я продолжаю видеть, является использованием вложенного модуля, содержащего константы версии, к которым присоединяются в строку версии т.е. изменения вокруг этого вида вещи:

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
5
задан John Topley 3 February 2010 в 21:25
поделиться

2 ответа

Для программной проверки совместимости проще иметь явно разделенный номер версии.

например:

require 'chunkybacon'
if ChunkyBacon::VERSION::MAJOR > 0
  # barf
end
8
ответ дан 18 December 2019 в 09:07
поделиться

Как правило, информация о версии в строке является плохой идеей.

Например, никогда не может быть 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. и так далее.

Итак, короче: программисты слишком глупы, чтобы сами разбирать номера версий, вы должны сделать это за них.

10
ответ дан 18 December 2019 в 09:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: