Delphi::Система тестирования. Часть 7
В предыдущей части цикла статей была выполнена подготовительная часть для написания программы-теста. Сегодня мы приступим, непосредственно, к разработке самого теста.
Для начала, нужно создать новый проект в папке тест, и подключить к нему все файлы из lib.
Интерфейс программы
Рассмотрим внешний вид приложения-теста. В отличие, от программы для создания теста, интерфейс будет здесь более простым. Нужны лишь две метки для отображения названия теста и вопроса, так же нужен блок вариантов ответа и три кнопки: «Назад», «Далее» и «Закончить».
Исходя из вышесказанного, приложение может выглядеть так (скачать dfm):
Основные компоненты:...
delphi, тестSymfony::Поиск. Часть 1
На русском языке довольно сложно найти информацию о простой реализации поиска по базе данных, используя фрейморк Symfony. В официальном гайде используется Zend Lucene – поисковой движок от Zend, но для многих сайтов его функционал избыточен, да и подключение к проекту Symfony не совсем очевидно.
В данной статье мы рассмотрим простую реализацию полнотекстового поиска с использование фреймворка Symfony и ORM Doctrine.
Схема таблицы
Для примера, поиск будет осуществляться по некоторой таблице article. Ее схема:
- StArticle:
- actAs:
- Timestampable: ~
- columns:
- title:
- type: string(255)
- notnull: true
- text:
- type: string
- notnull: true
Для возможности реализации поиска, нужно добавить поведение Searchable:
- StArticle:
- actAs:
- # ...
- Searchable:
- fields: [title, text]
- analyzer: Doctrine_Search_Analyzer_Utf8
- # ...
В fields задаются поля, по которым осуществляется поиск. В analyzer задается так называемый «анализатор» текста. То, что мы задали Doctrine_Search_Analyzer_Utf8, позволит избежать возможных проблем с кириллицей. К слову говоря, можно определить и собственный анализатор, достаточно наследоваться от интерфейса Doctrine_Search_Analyzer_Interface и переопределить метод analyze():
- class MyAnalyzer implements Doctrine_Search_Analyzer_Interface
- {
- public function analyze($text)
- {
- $text = trim($text);
- return $text;
- }
- }
Теперь схема таблицы полностью готова и подходит для поиска. После генерации и выполнения SQL кода (doctrine:build –all) в базе появится таблица Article и так же создастся таблица article_index - так называемый полнотекстовый индекс – словарь, в котором перечислены слова и указано, в каких местах они встречаются.
Поиск в Doctrine
Поиск будет реализован при помощи метода search, определенного в классе Doctrine_Search...
php, symfony, doctrineDelphi::Система тестирования. Часть 6
Ранее, в цикле статей, посвященных написанию системы тестирования, была разработана программа составления теста. Сейчас мы начнем создание самого теста. Для начала определим основные требования к программе:
- Вопросы из файла достаются в случайном порядке
- Тестируемый может перескакивать через вопросы и возвращаться назад
- Правильных ответов может быть несколько
- Варианты ответа к вопросу также выстраиваются случайно
- Имя файла можно передать как параметр командной строки, и программа должна его открыть
- Возможность начать тестирование сначала без перезапуска программы
Алгоритм проверки
После того, как с требованиями разобрались можно перейти к одной из самых важных частей любого теста – проверки. Поскольку у вопроса может быть несколько вариантов ответа, то алгоритм проверки будет несколько нетривиальным.
Смысл его в том, что получается, как бы, что неправильный ответ «бьет» правильный. То есть, если, к примеру, тестируемый выбрал, один верный вариант ответа и один неверный, то вопрос не засчитывается. Если же, он выбрал лишь один верный ответ, к примеру, из двух, то вопрос засчитывается наполовину.
Для того, что бы лучше понять, давайте рассмотрим пример. Пусть есть вопрос с шестью вариантами ответа, и три варианта правильные. Рассмотрим первый вариант: тестируемый отметил все правильные ответы – в таком случае за вопрос он получит 100%. Другой вариант: отметил только два варианта ответа из трех. Тогда получается, что вопрос верен лишь на 66%. Если же выбрать, к примеру, два правильных ответа и один неправильный, то 33%.
Подобный алгоритм с процентами является все же более справедливым, нежели просто «верно» или «неверно».
Расширенная работа с данными
Прежде чем приступить к непосредственно разработке программы-теста, нужно сначала расширить классы, созданные нами во второй части цикла статей (ссылка). То есть классы, описывающие данные из xml файла.
Самым очевидным способом расширения уже существующего класса, является наследование. Его и будем использовать.
Добавим в папку lib еще один unit – StDataTest. Начнем с класса варианта ответа: TStAnswer. Единственное, что нам нужно добавить этому классу – это поле Selected, определяющее, выбран ли вариант ответа или нет...
delphi, тест
