Minimal Requirements Tool

  • Автор темы Dmitry Perets
  • Дата начала
Статус
Закрыто для дальнейших ответов.
D

Dmitry Perets

Добрый день,

Требуется написать утилиту для проверки минимальных системных требований для некого приложения. Есть набор требований (скорость процессора, количество памяти и т.д.), утилита просто проходит по списку и проверяет каждое требование, вынося вердикт "Pass" или "Fail". Кроме того, в случае "Fail" в отведённый listbox выводится дополнительная информация (к примеру, "You don't have enough memory to run the application" или "You don't have CD-RW device, you will not be able to burn CDs").

Предложенный дизайн выглядит так. Имеем иерархию классов, наследующих от базового CRequirement:

CRequirement (abstract)
-----> CThresholdRequirement (abstract) : public CRequirement
---------------> CCPURequirement : public CThresholdRequirement
---------------> CRAMRequirement : public CThresholdRequirement
-----> CBooleanRequirement (abstract) : public CRequirement
---------------> CCDRWRequirement : public CBooleanRequirement
---------------> CMouseScrollRequirement : public CBooleanRequirement

Список не полный.

CThresholdRequirement, CBooleanRequirement и т.п. отличаются способом, по которому определяется вердикт. Допустим, для CThresholdRequirement все значения числовые, и он выдаёт "Pass" если реальное значение больше либо равно требуемому. А для CBooleanRequirement все значения "Есть" или "Нет", и он выдаёт "Pass" если реальное значение равно требуемому. Соответственно, последний уровень иерархии содержит уже конкретные классы, каждый из которых умеет вычислить реальное значение (допустим, вызвать GetSystemInfo() или пойти в реестр) требуемого параметра.

Далее, вся эта иерархия складывается в умный CListCtrl2, который наследует от обычного CListCtrl. Умный список понимает, что хранит объекты CRequirement и может запускать тесты и записывать результат в нужную колонку.

Всё это работает довольно красиво, но остаётся одна проблема: как быть с сообщениями (теми, что должны выводиться в отведённый listbox). Дело в том, что сообщения не являются привязанными к конкретному требованию. Они могут быть привязаны к группе требований. Например, есть четыре отдельных требования: CCDROMReq, CDVDROMReq, CCDRWReq, CDVDRWReq. Они проверяют соответственно наличие "читалки" дисков, "читалки" DVD, "писалки" дисков и "писалки" DVD. Клиент требует, чтобы это были именно четыре отдельные строчки, по каждой из которых был бы вердикт "Есть" или "Нет". Проблема в том, что сообщение в listbox'я зависит от результата всех этих четырёх тестов. Если нет ни читалки, ни писалки DVD, то будет сообщение "You won't be able to read or burn DVD". Если есть есть читалка, но нет писалки, то будет написано "You won't be able to burn DVD". И т.п. Таким образом, я не могу привязать сообщение к конкретным классам моей иерархии. Должен быть ещё какой-то механизм корреляции тестов, что ли... При этом хочется, чтобы код был как можно более generic, то есть чтобы вся специфическая информация хранилась где-то в одном месте, а не по всему коду.

Подскажите какую-нибудь красивую идею на этот счёт. Заранее благодарен.
 
E

European

Много букв :) Давай более сузим постановку задачи.
Т.е. у тебя есть класс CCDRWRequirement, который должен делать 4 вида тестов, которые ты указал. Причем в дереве должен быть только класс CCDRWRequirement, но в связанном поле должно быть 4 вида тестов?
 
G

grigsoft

Я бы ввел дополнительный базовый CCompoundRequirement: тест, результат которого зависит от нескольких других. Список тогда может уметь сгруппировать результаты базовых тестов, и как summary: вывести итоговый результат составного теста.

CD read: pass
CD write: pass
DVD read: pass
DVD write: fail
Disk operations summary: You won't be able to burn DVD

UPD: собственно, я бы не стал в общий список добавлять базовые. В список добавить только составной, и разрешить тесту выдавать больше одной строчки результата. Тогда тест сможет оформить вывод по своему вкусу. Впрочем, это уже по задаче надо смотреть.

UPD2: а объединяя сюда коммент European, можно не создавать нового типа тестов, а просто разрешить тесту кроме основного результата давать дополнительные. Тогда будет один CCDRWRequirement, который отдаст детали и конечный результат
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!