Напишите библиотеку, предоставляющую API для работы с расписанием лекций из первого задания.
Здесь мы хотим проверить ваши знания в области JavaScript и способность реализовать простые алгоритмы. Также нам важно увидеть, что вы можете выделить основные компоненты приложения и организовать их взаимодействие. Кроме того, мы хотим оценить ваше умение принимать обоснованные технические решения и объяснять их.
Вам нужно написать библиотеку, которая реализует следующий программный интерфейс:
просмотр расписания школы в заданный интервал дат; просмотр графика лекций в аудитории в заданный интервал дат; ввод и редактирование данных о лекциях; ввод и редактирование данных о школах; ввод и редактирование данных об аудиториях.
- Примеры работы библиотеки вы можете увидеть в файле demo.js
- Так же примеры кода работы библиотеки можно увидеть на HTML странице где тестируется код test.html
Библиотека была реализована с помощью ES6 Classes и в дальнейшем транспайлерена в с помощью Babel. Данное решение позволит нам писать удобный и поддерживаемый код и если его необходимо будет перенести в NodeJS мы добавим к нашему классу export
.
Также была попытка реализовать тестирование каждой отдельной функции, но с учетом возможных вариантов пользовательского взаимодействия. Для этого были взяты библиотеки Mocha и Chai, чтобы видеть результат в браузере и не подтягивать большое количество npm модулей.
Выделим три основные сущности в нашей библиотеке
- Classroom - аудитории
new Classroom({
number: 454, // номер аудитории
name: 'Синий кит', // название аудитории
info: 'Подъезд 2, этаж 3', // информация об аудитории
capacity: 30 //вместимость аудитории
});
- School - школа
new School({
name: 'Школа разработки интерфейсов', //название школы
quantity: 45 // количество учащихся
});
- Lecture - лекция
new Lecture({
name: 'Лекция 1', //название лекции
speaker: 'Dushkin', //Преподаватели лекции
dateFrom: 1492881578000, // дата лекции. Строка должна быть в одном из форматов, распознаваемых методом Date.parse() (совместимые с IETF RFC 2822 временные метки [на английском, на русском], а также версия ISO8601 [на английском, на русском])
duration: 90, // продолжительность лекции в минутах
classroom: 454, //аудитория
schools: ['Школа разработки интерфейсов'] // школы
});
Так как в задании не указано, то выделять преподавателей в отдельный класс мы не стали.
Для работы с данными сущностями был организован еще один класс Mobilization
. Это и будет нашей библиотекой.
Чтобы подключить ее на страницу достаточно добавить скрипт на страницу.
Далее необходимо инициализировать ее
let mob2017 = new Mobilization()
В нашем классе реализовано методы:
Добавление школы, где data
- данные по школе, необходимые для создания объекта School
Также происходит проверка на дублирование школы.
Чтобы отредактировать школу нужно указать имя школы и поля, которые необходимо отредактировать. Также стоит проверка на дублирование имени школы. После редактирования все лекции проходят валидацаю на корректную вместимость
Возвращает массив школ
Возвращает школу по имени
Добавление школы, где data
- данные по аудитории, необходимые для создания объекта Classroom
Также происходит проверка на дублирование аудитории по номеру.
Чтобы отредактировать аудитории необходимо знать ее номер. Можно отредактировать все кроме номера аудитории. После редактирования все лекции проходят валидацаю на корректную вместимость
Возвращает ассоциативный массив комнат где ключом является номер комнаты
Возвращает аудиторию по номеру
Добавление школы, где data
- данные по лекции, необходимые для создания объекта Lection.
Все проверки между лекциями производятся с помощью класса Mobilization.
- Проверка на вместимость аудитории
- Проверка что в текущий момент в этой же аудитории нет лекции
- Проверка что в текущий момент у одной из школ нет лекций
Проверки на соответствие лекции определенным условиям были реализованы в классе Lection
-
checkByDataRange(dateStart, dateEnd,strict=false)
Проверка что лекция находится в указанном промежутке даты окончания и даты начала. Последний параметр отвечает за строгое сравнение. Также дата начала и окончания необязательные параметры. Если ничего не указывать, то временной промежуток учитываться не будет. Также можно ограничить поиск либо по дате начала, либо по дате окончания. -
checkByClassroom(classroom)
проверка на принадлежность аудитории -
checkBySchool(schoolName)
проверка на принадлежность к школе
searchParams
- объект, который должен содержать дату начала лекции, дату окончания (необязательно) и один из параметров либо номер аудитории или название школы.
newValue
- значения объекта Lection, которые мы хотим изменить.
Если лекция не проходит валидацию, то изменения откатываются
classroom
- номер аудитории
dateStart
- дата начала (необязательно)
dateEnd
- дата окончания (необязательно)
strict
- строгое сравнение (необязательно)
schoolName
- название школы
dateStart
- дата начала (необязательно)
dateEnd
- дата окончания (необязательно)
strict
- строгое сравнение (необязательно)
В: Почему this._classroom
объект?
О: Чаще всего аудитории имеют номер, по которому можно идентифицировать аудиторию. Т.к. поиск наиболее частая операция в нашем модуле, то мы сокращаем количество обходов по массивам, несмотря на малое количество аудиторий.
Дополнение: так же можно использовать new Map()
, что было бы более удобным решением. Это также бы подошло для школ.
В: Почему набор лекций, школ и аудиторий находится в модуле, а не в соответствующем классе? О: Данный принцип не нарушает приницпы ООП, наши классы отвечают за определенную сущность. Также для каждого года будет свой набор школ, аудиторий и лекций. И измение в одном набборе не приведет к изменению в другом.
В: Как образом достигается связанность данных? О: Так как объекты у нас передаются по ссылке, то все привязки в лекциях у нас по ссылке. При изменении школы или аудитории, они также изменятся в лекции.