Представление ОС как Enum - PullRequest
2 голосов
/ 05 февраля 2011

Я хочу добавить в нашу автоматизированную среду тестирования возможность для авторов тестов отмечать свои методы тестирования атрибутами, представляющими минимальную версию ОС, которую поддерживает тест. Например, разработчик теста отметит, что метод тестирования поддерживает Windows Vista SP1 и выше, и тогда среда узнает, как запустить тест на Vista, 7 и т. Д.

Мне хотелось использовать enum для этого представления (например, OS.VistaSp1, OS.Win7 и т. Д.), Но, поскольку мы также поддерживаем несколько типов ОС (Mac, Linux и т. Д.), Enum будет недостаточно для структуры, чтобы понять, каков минимум (например, он не мог легко знать, что OS.Win7 выше, чем OS.VistaSp1, но не относится к OS.MacOsX)

Следующим шагом было то, что я мог использовать младшие биты перечисления для представления типа ОС и старшие биты для представления [относительного] номера версии, и это решило бы проблему. Это не самое чистое решение, но создателям тестов, использующим его, вообще не нужно об этом знать, и для анализа информации потребуется лишь небольшой объем кода, который может быть инкапсулирован в некотором классе Utils.

Есть мысли по этому поводу? Это чистое решение? Есть ли лучшее решение? Спасибо!

Ответы [ 4 ]

3 голосов
/ 05 февраля 2011

Разве нельзя использовать уже существующий класс Environment.OperatingSystem?

Для идентификатора платформы он содержит MacOSX, Unix, Win32S, Win32NT, Win32Windows, WinCE и XBox.
Он также содержит строкудля пакета обновления и объекта Version для предоставления номера версии.

Я не знаю, насколько хорошо он обнаруживает их автоматически (я предполагаю, что mono поддерживает их несколько), поскольку я никогда не пробоваля.

2 голосов
/ 05 февраля 2011

Я бы использовал (как минимум) две разные переменные для этого:

  • общий тип ОС (Windows, Linux, MacOS) - перечисление идеально подходит для этого
  • пакет обновления / информация о версии (может быть строкой или, скорее, даже двумя отдельными строками - например, "XP SP3" и "5.3.157" *)

Это имеет два преимущества:

  • проще отсортировать версии ОС и решить проблемы совместимости,
  • по крайней мере версии пакета обновления можно многократно использовать в разных ОС, так что вы можете уменьшить количество требуемых значений перечисления.

* не реальный номер версии XP, просто пример

0 голосов
/ 05 февраля 2011

Я бы написал перечисление ОС и использовал бы объект Version в качестве второго параметра.

0 голосов
/ 05 февраля 2011

Вы можете использовать структуру аналогично enum, когда вам нужно немного больше функциональности.Объявите набор static readonly полей, которые являются экземплярами вашей структуры, которые будут использоваться как набор перечисляемых значений (за исключением, конечно, не в выражении switch):

public struct OSVersion
{
    public readonly string Name;
    public readonly Version Version;

    public OSVersion( string name, Version version )
    {
        Name = name;
        Version = version;
    }

    public static readonly OSVersion WindowsXPSP3 = new OSVersion( "XP SP3", new Version(...) );
    public static readonly OSVersion WindowsVistaSP1 = new OSVersion( "Vista SP1", new Version(...) );
    public static readonly OSVersion Windows7 = new OSVersion( "Win7", new Version(...) );
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...