Delphi::Система тестирования. Часть 7

В предыдущей части цикла статей была выполнена подготовительная часть для написания программы-теста. Сегодня мы приступим, непосредственно, к разработке самого теста.

Для начала, нужно создать новый проект в папке тест, и подключить к нему все файлы из lib.

Интерфейс программы

Рассмотрим внешний вид приложения-теста. В отличие, от программы для создания теста, интерфейс будет здесь более простым. Нужны лишь две метки для отображения названия теста и вопроса, так же нужен блок вариантов ответа и три кнопки: «Назад», «Далее» и «Закончить».

Исходя из вышесказанного, приложение может выглядеть так (скачать dfm):

Основные компоненты:...

delphi, тест

Symfony::Поиск. Часть 1

На русском языке довольно сложно найти информацию о простой реализации поиска по базе данных, используя фрейморк Symfony. В официальном гайде используется Zend Lucene – поисковой движок от Zend, но для многих сайтов его функционал избыточен, да и подключение к проекту Symfony не совсем очевидно.

В данной статье мы рассмотрим простую реализацию полнотекстового поиска с использование фреймворка Symfony и ORM Doctrine.

Схема таблицы

Для примера, поиск будет осуществляться по некоторой таблице article. Ее схема:

  1. StArticle:
  2.   actAs:
  3.     Timestampable: ~
  4.   columns:
  5.     title:
  6.       type: string(255)
  7.       notnull:  true
  8.     text:
  9.       type: string
  10.       notnull: true

Для возможности реализации поиска, нужно добавить поведение Searchable:

  1. StArticle:
  2.   actAs:
  3.     # ...
  4.     Searchable:
  5.       fields: [title, text]
  6.       analyzer: Doctrine_Search_Analyzer_Utf8
  7. # ...

В fields задаются поля, по которым осуществляется поиск. В analyzer задается так называемый «анализатор» текста. То, что мы задали Doctrine_Search_Analyzer_Utf8, позволит избежать возможных проблем с кириллицей. К слову говоря, можно определить и собственный анализатор, достаточно наследоваться от интерфейса Doctrine_Search_Analyzer_Interface и переопределить метод analyze():

  1. class MyAnalyzer implements Doctrine_Search_Analyzer_Interface
  2. {
  3.     public function analyze($text)
  4.     {
  5.         $text = trim($text);
  6.         return $text;
  7.     }
  8. }

Теперь схема таблицы полностью готова и подходит для поиска. После генерации и выполнения SQL кода (doctrine:build –all) в базе появится таблица Article и так же создастся таблица article_index - так называемый полнотекстовый индекс – словарь, в котором перечислены слова и указано, в каких местах они встречаются.

Поиск в Doctrine

Поиск будет реализован при помощи метода search, определенного в классе Doctrine_Search...

php, symfony, doctrine

Delphi::Система тестирования. Часть 6

Ранее, в цикле статей, посвященных написанию системы тестирования, была разработана программа составления теста. Сейчас мы начнем создание самого теста. Для начала определим основные требования к программе:

  • Вопросы из файла достаются в случайном порядке
  • Тестируемый может перескакивать через вопросы и возвращаться назад
  • Правильных ответов может быть несколько
  • Варианты ответа к вопросу также выстраиваются случайно
  • Имя файла можно передать как параметр командной строки, и программа должна его открыть
  • Возможность начать тестирование сначала без перезапуска программы

Алгоритм проверки

После того, как с требованиями разобрались можно перейти к одной из самых важных частей любого теста – проверки. Поскольку у вопроса может быть несколько вариантов ответа, то алгоритм проверки будет несколько нетривиальным.

Смысл его в том, что получается, как бы, что неправильный ответ «бьет» правильный. То есть, если, к примеру, тестируемый выбрал, один верный вариант ответа и один неверный, то вопрос не засчитывается. Если же, он выбрал лишь один верный ответ, к примеру, из двух, то вопрос засчитывается наполовину.

Для того, что бы лучше понять, давайте рассмотрим пример. Пусть есть вопрос с шестью вариантами ответа, и три варианта правильные. Рассмотрим первый вариант: тестируемый отметил все правильные ответы – в таком случае за вопрос он получит 100%. Другой вариант: отметил только два варианта ответа из трех. Тогда получается, что вопрос верен лишь на 66%. Если же выбрать, к примеру, два правильных ответа и один неправильный, то 33%.

Подобный алгоритм с процентами является все же более справедливым, нежели просто «верно» или «неверно».

Расширенная работа с данными

Прежде чем приступить к непосредственно разработке программы-теста, нужно сначала расширить классы, созданные нами во второй части цикла статей (ссылка). То есть  классы, описывающие данные из xml файла.

Самым очевидным способом расширения уже существующего класса, является наследование. Его и будем использовать.

Добавим в папку lib еще один unit – StDataTest. Начнем с класса варианта ответа: TStAnswer. Единственное, что нам нужно добавить этому классу – это поле Selected, определяющее, выбран ли вариант ответа или нет...

delphi, тест