Разработка системы учета успеваемости студентов на основе рейтинговой системы - подсистема "Кафедра"
Курсовой проект - Компьютеры, программирование
Другие курсовые по предмету Компьютеры, программирование
го шаблона.
Конечный пользовательский интерфейс представлен на рисунке 5.
Рис. 5. Скриншот ПС
4.4Реализация функциональности программного средства
Функциональность нашего программного средства реализуется с помощью нескольких классов. Кратко опишем их:
)Класс Registry. Реализует общий реестр приложения, в котором хранятся все экземпляры классов, глобальные переменны и прочее. Данный класс был создан с использованием шаблона проектирования Синглтон. Этот шаблон гарантирует, что у класса есть только один экземпляр, и предоставляет к нему глобальную точку доступа. Таким образом, мы можем получить экземпляр класса Registry из любой точки нашей программы. Использование реестра в ПС предотвращает засорение глобальной области видимости переменными.
Для предотвращения создания экземпляра класса, его конструктор описан с ключевым словом private, запрещающим доступ к конструктору извне:
private function __construct()
{}
Тот же подход используется для предотвращения клонирования экземпляра класса:
private function __clone()
{}
Метод getInstance() предназначен для возвращения единственного экземпляра класса, который хранится в статическом поле $_instance. Если экземляр еще не создан (в случае первого вызова getInstance), то он создается:
public static function getInstance()
{
if (!self::$_instance) {
self::$_instance = new self;
}
return self::$_instance;
}
Все данные хранятся в поле-массиве $vars.
Кроме того, данный класс реализует два интерфейса: ArrayAccess и Iterator. Это позволяет использовать экземпляр класса в качестве объекта перечисления, а также обращаться к классу как к массиву, что очень удобно для нашей задачи. Класс реализует следующие методы, описанные в интерфейсе ArrayAccess: set(), get(), remove(), offsetExists(), offsetGet(), offsetSet(), offsetUnset() и методы, описанные в интерфейсе Iterator: rewind(), current(), key(), next(), valid(). При обращении с объектом как с массивом PHP ищет реализацию этих методов и прозрачно вызывает их. Вместо
$registry->set(key, value);
мы вызываем
$registry[key] = value;
2)Класс lib. Содержит в себе общие библиотечные функции, которые могут использоваться вне контекста нашей системы. Класс полностью статический, т.е. не требует (и даже запрещает) создания экземпляра класса для использования. Класс используется в качестве пространства имен, объединяющего в себе наиболее общие функции. Это делается для предотвращения смешивания разных парадигм программирования в одном программном средстве и во избежание потери гибкости при использовании классов. Класс lib реализует следующие методы:
datestr_to_timestamp() - преобразует дату формата дд-мм-гггг в метку времени Unix.
get_script_url() - Возвращает абсолютный адрес вызывающего скрипта. Метод вызывается один раз в файле index.php для определения URL нашего скрипта, для последующего построения всех ссылок.
get_options() - метод принимает в качестве параметра массив, содержащий полученную из БД таблицу и возвращает HTML-код для заполнения тега . Четвертый параметр $selected не обязателен - он принимает значение поля идентификатора таблицы, которое будет выбрано в списке.
get_password_hash() - функция принимает в качестве параметра пароль пользователя и возвращает его хэш, используя один из самых криптостойких алгоритмов - SHA-1.
stripslashes_deep() - рекурсивно удаляет экранирование символов. Если функции передается массив, то она рекурсивно вызывает себя для всех его элементов.
htmlchars_deep() - рекурсивно преобразует специальные символы в HTML сущности. Если передан массив, то функция рекурсивно вызывает себя для всех ее элементов. Используется для предотвращения интерпретации строки как HTML кода.
get_menu() - метод возвращает массив с элементами меню для текущей роли пользователя.
make_menu() - функция используется для построения HTML-кода меню из массива, выданного функцией lib::get_menu().
is_childless() - используется для определения, есть ли у заданной таблицы зависимые элементы в другой таблице. Например если вызвать функцию с идентификатором факультета, то она вернет true в том случае, если на данном факультете нет ни одной кафедры.
reload_caller_js() - используется для закрытия всплывающего окна редактирования записи. Выводит в страницу JavaScript-код, который перезагружает страницу в вызвавшем окне и закрывает себя. Это делается для обновления результатов в основном окне после завершения редактирования.
redirect() - производит HTTP-перенаправление браузера пользователя на другую страницу.
3)Класс Controller_base. Абстрактный класс, от которого наследуются все остальные контроллеры. Он описывает действие по умолчанию в виде метода index(), который должен быть реализован в классах-потомках. Содержит поле registry, где хранится экземпляр реестра.
Каждый класс-потомок может реализовать любое количество методов-действий, но реализация действия по-умолчанию index() обязательна.
Пусть мы, например, унаследовали класс Controller_hello от Controller_base и реализовали в нем 2 метода - index() и world().Такой подход упрощает добавление новой функциональности к нашей системе - все, что требуется - добавить еще один класс-контроллер и реализовать функциональность в нем.
)Класс Router. В зависимости от строки запроса находит нужный контроллер и действие и передает ему управление. Если контроллер не найден, показывает сообщение об ошибке. Методы ?/p>