Skip to content

Второе задание для школы "Мобилизация"

Notifications You must be signed in to change notification settings

ar53n/second-task

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

14 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Задание 2

Задача

Напишите библиотеку, предоставляющую 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()

Методы

В нашем классе реализовано методы:

addSchool(data);

Добавление школы, где data - данные по школе, необходимые для создания объекта School Также происходит проверка на дублирование школы.

editSchool(name,data);

Чтобы отредактировать школу нужно указать имя школы и поля, которые необходимо отредактировать. Также стоит проверка на дублирование имени школы. После редактирования все лекции проходят валидацаю на корректную вместимость

getSchoolList();

Возвращает массив школ

getSchool(name);

Возвращает школу по имени

addClassroom(data);

Добавление школы, где data - данные по аудитории, необходимые для создания объекта Classroom Также происходит проверка на дублирование аудитории по номеру.

editClassroom(number,data);

Чтобы отредактировать аудитории необходимо знать ее номер. Можно отредактировать все кроме номера аудитории. После редактирования все лекции проходят валидацаю на корректную вместимость

getСlassroomList();

Возвращает ассоциативный массив комнат где ключом является номер комнаты

getСlassroom(name);

Возвращает аудиторию по номеру

addLecture(data);

Добавление школы, где data - данные по лекции, необходимые для создания объекта Lection. Все проверки между лекциями производятся с помощью класса Mobilization.

  • Проверка на вместимость аудитории
  • Проверка что в текущий момент в этой же аудитории нет лекции
  • Проверка что в текущий момент у одной из школ нет лекций

Проверки на соответствие лекции определенным условиям были реализованы в классе Lection

  • checkByDataRange(dateStart, dateEnd,strict=false) Проверка что лекция находится в указанном промежутке даты окончания и даты начала. Последний параметр отвечает за строгое сравнение. Также дата начала и окончания необязательные параметры. Если ничего не указывать, то временной промежуток учитываться не будет. Также можно ограничить поиск либо по дате начала, либо по дате окончания.

  • checkByClassroom(classroom) проверка на принадлежность аудитории

  • checkBySchool(schoolName) проверка на принадлежность к школе

editLecture(searchParams,newValue)

searchParams - объект, который должен содержать дату начала лекции, дату окончания (необязательно) и один из параметров либо номер аудитории или название школы. newValue - значения объекта Lection, которые мы хотим изменить. Если лекция не проходит валидацию, то изменения откатываются

findLecturesByClassroom(classroom,dateStart,dateEnd,strict)

classroom - номер аудитории dateStart - дата начала (необязательно) dateEnd - дата окончания (необязательно) strict - строгое сравнение (необязательно)

findLecturesBySchool(schoolName,dateStart,dateEnd,strict)

schoolName - название школы dateStart - дата начала (необязательно) dateEnd - дата окончания (необязательно) strict - строгое сравнение (необязательно)

Объяснение решений

В: Почему this._classroom объект? О: Чаще всего аудитории имеют номер, по которому можно идентифицировать аудиторию. Т.к. поиск наиболее частая операция в нашем модуле, то мы сокращаем количество обходов по массивам, несмотря на малое количество аудиторий. Дополнение: так же можно использовать new Map(), что было бы более удобным решением. Это также бы подошло для школ.

В: Почему набор лекций, школ и аудиторий находится в модуле, а не в соответствующем классе? О: Данный принцип не нарушает приницпы ООП, наши классы отвечают за определенную сущность. Также для каждого года будет свой набор школ, аудиторий и лекций. И измение в одном набборе не приведет к изменению в другом.

В: Как образом достигается связанность данных? О: Так как объекты у нас передаются по ссылке, то все привязки в лекциях у нас по ссылке. При изменении школы или аудитории, они также изменятся в лекции.

About

Второе задание для школы "Мобилизация"

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published