Пояснительная записка (1231610), страница 6
Текст из файла (страница 6)
– массив submit – для хранения списка идентификаторов всех посылок, совершенных командой;
– поле nextSubmit – номер следующей посылки, которую необходимо обработать.
Данный класс содержит следующие методы:
– методы getSolved() и getTime() возвращают в виде текста количество решенных задач и затраченное время соответственно;
– метод getVerdict() собирает информацию о конкретной задаче для отображения в ячейке таблицы с результатами;
– метод getClassVerdict() определяет класс CSS для ячейки таблицы с результатами по конкретной задаче;
– метод getTimeProblem() переводит время из общего формата (количество минут) к привычному (чч:мм) для конкретной задачи;
– методы addSubmit(), addOneSubmit() и addAllSubmit() используются для обработки посылок: первые два метода обрабатывают конкретную посылку, а третий метод обрабатывает все посылки по конкретной задаче;
– метод addProblemSubmit() добавляет информацию о конкретной посылке по какой-нибудь задаче в двумерный массив problemsSubmits;
– метод solvedProblem() отмечает конкретную задачу решенной и вычисляет общее штрафное время;
– метод clearProblemSubmits() отчищает двумерный массив problemSubmits от данных;
– метод createProblems() инициализирует все поля объекта связанные с задачами, то есть, например, problemAllSubmit, problemSubmit, solved и т.д.;
– метод getIdSubmit() возвращает идентификатор следующей посылки, которую необходимо обработать;
– методы getIdPlace(), getIdName(), getIdSolved(), getIdTime() и getIdProblem() используются для генерации идентификатора ячейки таблицы с результатами.
Класс Problem
Класс Problem (приложение А, листинг А.8) используется для хранения информации о задачах и имеет следующие поля:
– поле code – идентификатор задачи;
– поле solved – количество команд, решивших данную задачу;
– поле submit – количество попыток решить данную задачу.
Данный класс содержит следующие методы:
– метод getSolved() собирает информацию по задаче для отображения в ячейке таблицы с результатами;
– метод getClassSolved() определяет класс CSS для ячейки таблицы с результатами по задаче;
– метод addSubmit() обрабатывает конкретную посылку, обновляя данные о количестве посылок по задаче;
– метод getIdStatistic() используется для генерации идентификатора ячейки таблицы с результатами.
Класс Submit
Класс Submit (приложение А, листинг А.9) используется для хранения информации о посылках и имеет следующие поля:
– поле time – время прихода посылки;
– поле teamId – идентификатор команды, которая отправила посылку;
– поле problemCode – идентификатор задачи, по которой совершена посылка;
– поле state – статус посылки, значение «accepted» означает, что задача решена;
– поле test – номер теста, на котором решение выдало неверный ответ;
– поле checked – флаг, отмечающий обработана посылка или нет.
Данный класс содержит только один метод getTime(), который используется для вычисления округлённого времени прихода конкретной посылки в минутах.
3.2.7 Структура таблицы с результатами
Таблица с результатами состоит из следующих элементов:
– заголовок таблицы;
– основная часть таблицы с результатами участников.
Заголовок таблицы содержит три строки:
– строка с названиями столбцов;
– строка со статистикой соревнования;
– разделитель между заголовком и остальной таблицей.
Столбцы таблицы:
– место участника. Стоит отметить, что если два участника решили одинаковое количество задач с одинаковым штрафным временем, то они занимают одно место;
– название команды;
– количество решенных задач;
– штрафное время;
– а так же по столбцу на каждую задачу.
Стоит отметить, что в заголовке в строке статистика отображается количество удачных посылок и количество посылок по каждой задаче, а так же общее количество удачных посылок и общее количество посылок по всем задачам.
Формирование таблицы происходит после загрузки истории посылок (приложение А, листинг А.10) и представляет собой генерацию HTML кода web-страницы. Для того, чтобы данная генерация занимала минимальное время работы, она происходит на стороне клиента посредству JavaScript, а не на стороне сервера.
Для быстрого доступа к конкретным ячейкам таблицы в дальнейшем каждой из них присваивается уникальный идентификатор. Как описано ранее, классы Team и Problem содержат методы для генерации данных идентификаторов. Примеры таких идентификаторов: «ID команды.Name», «ID команды.Place», «ID задачи.statistic» и т.д.
Помимо генерации таблицы в файле createTable.js присутствуют функции для заполнения дополнительных переменных информацией о командах, задачах и посылках. Например, функция createSubmits() использует компаратор compareSortSubmit() для сортировки посылок по времени их отправления участниками.
Определив структуру таблицы с результатами, стоит рассмотреть её дизайн.
3.2.8 Цветовая схема таблицы с результатами
Цветовая схема таблицы – очень важная составляющая общего дизайна модуля подведения итогов, так как от этого зависит понимание пользователем происходящего. Весь дизайн таблицы с результатами задаётся свойствами классов CSS (приложение А, листинг А.3).
Заголовок таблицы имеет черный цвет, за исключением ячеек с количеством посылок по конкретной задаче (рисунок 3.4).
Рисунок 3.4 – Заголовок таблицы результатов
Строки с участниками имеют два оттенка серого цвета (рисунок 3.5). Два участника будут иметь один и тот же цвет, если у них решено одинаковое количество задач. Два участника будут иметь разный цвет, если нет участника, который решил больше задач, чем один, и меньше задач, чем другой, из них.
Рисунок 3.5 – Цветовое выделение участников
Таким образом, участники делятся на блоки, объединённые одним цветом.
Цвета для центральной части таблицы представлены на рисунке 3.6.
Рисунок 3.6 – Цвета центральной части таблицы
Каждый из этих цветов используется для своей цели:
– зелёный, если участник решил задача;
– тёмно-зелёный, если участник первым решил задачу;
– красный, если участник сделал неудачные посылки по задаче;
– синий, если участник сделал посылки, результат которых еще не отображен в таблице. Например, если он делал их в период «заморозки» таблицы результатов;
– мигающий сине-оранжевый для выделения посылки, которая подвергнется «разморозке»;
– бледно серый, если участник не делал посылок по задаче.
Стоит отметить, что при последовательной «разморозке» участник, посылки которого рассматриваются, так же выделяется оранжевым цветом (рисунок 3.7), для того чтобы сфокусировать внимание пользователя.
Рисунок 3.7 – Выделение участника при последовательной «разморозке»
Некоторые из цветов, представленных на рисунке 3.6, используются в заголовке таблицы результатов. Зелёный цвет используется для задач, по которым есть хотя бы одна удачная посылка, в то время как красный цвет для задач, по которым есть хотя бы одна неудачная посылка (рисунок 3.8).
Рисунок 3.8 – Часть заголовка таблицы результатов с информацией по задачам
Для задач, по которым нет посылок, цвет остаётся черным.
3.2.9 Обновление таблицы с результатами
Для обновления таблицы с результатами во время «разморозил» используется множество функций (приложение А, листинг А.11). Основные из них:
– функция updateTable() полностью обновляет таблицу с результатами;
– функция sortTr() перемещает определённую строку таблицы на определённую позицию;
– функция sortTable() перемещает все строки таблицы по местам, на которых они должны находиться в текущий момент;
– функция sortTrSubmit() запускает анимацию плавного перемещения строки в таблице;
– функции sortTrNextSubmit() и sortTrNextTeamSubmit() определяют положение команды в таблице и запускают анимацию сортировки таблицы;
– функция updateTableClass() обновляет классы CSS для всех ячеек таблицы;
– функция updateTrClass() обновляет классы CSS для всех ячеек одной строки;
– функции updateTdPlaceClass(), updateTdNameClass(), updateSolvedClass() и updateTdTimeClass() отвечают за обновление классов CSS ячеек с местом, названием команды, количеством решенных задач и штрафным временем соответственно;
– функции updateTrPlace() и updateTdPlace() отвечают за обновление мест для всех строк таблицы и обновления места для одной строки соответственно;
– функция updateTrSolvedAnsTime() обновляет количество решенных задач и штрафное время для всех команд;
– функции onTdNextSubmit(), ontTdNextTeamSubmit(), offTdNextSubmit() и offTdNextTeamSubmit() определяют команду и задачу по обрабатываемой в текущий момент посылке;
– функции onTdSubmit() и offTdSubmit() отвечают за включение и выключение анимации подсветки ячейки таблицы;
– функции onTdTeam() и offTdTeam() отвечают за включение и отключение подсветки названия команды при последовательной «разморозке»;
– функции updateTrStatistic() и updateTdStatisticProblem() отвечают за обновление всей строки статистики и одной ячейки в строке статистики в заголовке таблицы;
– функция updateTdTotal() обновляет ячейку с общим количество удачных и неудачных посылок;
– функция getTotal() генерирует HTML код с информацией об общем количестве удачных и неудачных посылок для отображения в соответствующей ячейке таблицы с результатами;
– функции updateTdSolvedAndTime(), updateTdSolved() и updateTdTime() отвечают за обновление количества решенных задач и обновление штрафного времени для конкретной команды;
– функция updateTableProblem() обновляет ту часть таблицы, которая связана с посылками команд по задачам;
– функция updateTdProblem() обновляет одну ячейку, которая связана с посылкой конкретной команды по конкретной задаче.
Стоит отметить, что для обновления некоторой информации в ячейках таблицы с результатами, функции используют методы классов Team и Problem, отвечающие за генерацию соответствующей информации. В частности, используются функции для генерации идентификаторов ячеек таблицы.
3.2.10 Реализация «разморозки» таблицы с результатами
После того, как история посылок загружена и обработана, сгенерирована таблица с результатами, можно приступить к «разморозке».
Меню (рисунок 3.1) предоставляет пользователю следующие настройки «разморозки»:
– выбор времени для «заморозки», переход на момент «заморозки» и обнуление таблицы с результатами;
– выбор скорости «разморозки»;
– последовательная и хронологическая «разморозки»;
– пошаговая и автоматическая «разморозка»;
– дополнительные настройки: показ времени посылок, показ посылок совершенных в «заморозку», обработка только последней посылки.
В любой момент времени пользователь может изменять настройки «разморозки», и это никак не повлияет на работоспособность модуля подведения итогов.
Основной функцией, отвечающей за «разморозку», является getNextFunction(), которая, в зависимости от последнего действия и от настроек «разморозки», определяет, что делать дальше (приложение А, листинг А.12).
После выбора времени «заморозки», которое по умолчанию равно 4-м часам от начала соревнования, пользователь может сразу перейти к этому моменту или же запустить «разморозку» с «пустой» таблицы.