Мы помогаем перевести небольшую районную библиотеку в современный цифровой формат. Начнём с того, что реализуем несколько классов: классы печатных изданий (книг, журналов) и класс самой библиотеки, который позволит работать с печатными изданиями (хранить их, выдавать читателям, примать обратно).
Печатные издания бывают различных типов, но между всеми книгами, сборниками и журналами есть много общего: все они имеют название, год издания, состоят из скольких-то страниц, а ещё могут портиться, пока люди ими пользуются.
-
Создайте базовый класс
PrintEditionItem
со следующими свойствами:name
releaseDate
pagesCount
state
type
Конструктор класса должен принимать название (
name
), дату выпуска (releaseDate
) и количество страниц (pagesCount
) в качестве аргумента. Состояние (state
) по умолчанию должно устанавливаться равным100
, типtype
пока должен быть равенnull
. -
Испорченное издание можно подклеить и тем самым улучшить его состояние. Создайте метод
fix()
, увеличивающийstate
в полтора раза. Метод не должен принимать аргументов. -
Нельзя улучшить новое издание, и бесполезно подклеивать полностью уничтоженное. Для лучшего контроля над состоянием создайте «сеттер» для свойства
state
, принимающий в качестве аргумента новое состояние печатного издания (число).Если новое состояние меньше
0
, «сеттер» должен записать в свойствоstate
значение0
. Если новое состояние больше100
, должно быть записано значение100
. В остальных случаях в свойствоstate
должно быть записано переданное в «сеттер» значение. -
Создайте «геттер», который позволит читать значение свойства
state
.
Пример использования
const sherlock = new PrintEditionItem("Полное собрание повестей и рассказов о Шерлоке Холмсе в одном томе", 2019, 1008);
console.log(sherlock.releaseDate); //2019
console.log(sherlock.state); //100
sherlock.fix();
console.log(sherlock.state); //100
-
Создайте класс
Magazine
, который будет наследоваться от классаPrintEditionItem
. Конструктор класса должен принимать такие же параметры, как и класс-родитель. От базового печатного издания журнал отличается только явно указанным типом. Значение свойстваtype
должно быть равно"magazine"
. -
Создайте класс
Book
, наследующийся от классаPrintEditionItem
. Конструктор класса должен принимать такие же параметры, как и класс-родитель, а также имя автора книгиauthor
. Значение свойстваtype
должно быть равно"book"
. -
Создайте классы
NovelBook
для романов,FantasticBook
для фантастических произведений иDetectiveBook
для детективов, наследующиеся от классаBook
. Значения свойстваtype
должны быть равны"novel"
,"fantastic"
и"detective"
соответственно.
Пример использования
const picknick = new FantasticBook("Аркадий и Борис Стругацкие", "Пикник на обочине", 1972, 168);
console.log(picknick.author); //"Аркадий и Борис Стругацкие"
picknick.state = 10;
console.log(picknick.state); //10
picknick.fix();
console.log(picknick.state); //15
Теперь с помощью классов можно описать все возможные печатные издания, которые бывают в библиотеке. Пришло время подготовить саму библиотеку к работе в цифровом режиме: нужно реализовать возможности хранить книги, выдавать их читателям и принимать обратно.
-
Создайте класс
Library
со следующими свойствами:name
books
Конструктор класса должен принимать название библиотеки
name
(строка). Значением свойстваbooks
должен быть пустой массив. -
Реализуйте метод
addBook(book)
, который будет в качестве аргумента принимать объект (книгу или журнал). Метод должен добавлять книгу в хранилищеbooks
, только если состояниеstate
книги больше30
. -
Создайте метод
findBookBy(type, value)
, который в качестве аргументов будет принимать ключ, по которому будет производиться поиск (тип, автор, название, год выпуска и пр.) и искомое значение. Метод должен возвращать книгу в случае успеха иnull
, если запрошенная книга не была найдена. -
Создайте метод
giveBookByName(bookName)
, который будет в качестве аргумента принимать название книги, запрошенной читателем. Если запрошенная книга найдена, метод должен удалять книгу из хранилищаbooks
, и возвращать её. Если книга не была найдена, метод должен возвращатьnull
.
Пример использования
const library = new Library("Библиотека имени Ленина");
library.addBook(new DetectiveBook("Артур Конан Дойл", "Полное собрание повестей и рассказов о Шерлоке Холмсе в одном томе", 2019, 1008));
library.addBook(new FantasticBook("Аркадий и Борис Стругацкие", "Пикник на обочине", 1972, 168));
library.addBook(new NovelBook("Герберт Уэллс", "Машина времени", 1895, 138));
library.addBook(new Magazine("Мурзилка", 1924, 60));
console.log(library.findBookBy("name", "Властелин колец")); //null
console.log(library.findBookBy("releaseDate", 1924).name); //"Мурзилка"
console.log("Количество книг до выдачи: " + library.books.length); //Количество книг до выдачи: 4
library.giveBookByName("Машина времени");
console.log("Количество книг после выдачи: " + library.books.length); //Количество книг после выдачи: 3
- Протестируйте корректность работы классов и методов, разыграв тестовый сценарий:
- Создайте библиотеку;
- Добавьте в библиотеку несколько печатных изданий различных типов;
- Найдите книгу, изданную в 1919 году (создайте такую книгу при необходимости);
- Выдайте любую книгу;
- Испортите выданную книгу;
- Почините выданную книгу;
- Попытайтесь добавить починенную книгу обратно в библиотеку.
Это задача со "звездочкой", ее выполнение не влияет на получение допуска до дипломной работы, но принесет много полезного опыта.
Мария Степановна продолжает совершенствовать журнал. Теперь для его ведения она решила создать специальный класс StudentLog, который бы помог ей удобно вносить новые оценки и автоматически пересчитывать средние показатели. Реализуйте в классе StudentLog следующие функции:
- внесение оценки по названию предмета;
- получение средней оценки по предмету;
- получение средней оценки по всем предметам.
Реализуйте класс «StudentLog»:
- Передавайте в конструктор экземпляра имя ученика:
const log = new StudentLog('Олег Никифоров');
- Создайте метод getName, возвращающее имя ученика:
const log = new StudentLog('Олег Никифоров');
console.log(log.getName()) // Олег Никифоров
- Создайте метод
addGrade(grade, subject)
, который будет вносить оценку по соответствующему предмету. При этомgrade
— оценка,subject
— предмет. Условия работы метода:
- Метод возвращает количество поставленных оценок по данному предмету.
- Оценка ставится числом в пределах от 1 до 5.
- При неверной оценке дополнительно выдаётся сообщение с ошибкой, оценка в журнал не заносится. Текущее количество оценок все равно требуется вернуть.
- Добавление оценки возможно по любому предмету.
const log = new StudentLog('Олег Никифоров');
console.log(log.addGrade(3, 'algebra'));
// 1
console.log(log.addGrade('отлично!', 'math'));
// Вы пытались поставить оценку "отлично!" по предмету "math". Допускаются только числа от 1 до 5.
// 0
console.log(log.addGrade(4, 'algebra'));
// 2
console.log(log.addGrade(5, 'geometry'));
// 1
console.log(log.addGrade(25, 'geometry'));
// Вы пытались поставить оценку "25" по предмету "geometry". Допускаются только числа от 1 до 5.
// 1
- Создайте метод
getAverageBySubject(subject)
, получающий среднюю оценку по названию предмета. При отсутствии предмета нужно выдать 0.
const log = new StudentLog('Олег Никифоров');
log.addGrade(2, 'algebra');
log.addGrade(4, 'algebra');
log.addGrade(5, 'geometry');
log.addGrade(4, 'geometry');
console.log(log.getAverageBySubject('geometry')); // 4.5
console.log(log.getAverageBySubject('algebra')); // 3
console.log(log.getAverageBySubject('math')); // 0
- Создайте метод
getTotalAverage()
, получающий среднюю оценку по всем предметам. Средняя оценка рассчитывается как сумма всех оценок на их количество. При отсутствии оценок нужно выдать 0.
const log = new StudentLog('Олег Никифоров');
log.addGrade(2, 'algebra');
log.addGrade(4, 'algebra');
log.addGrade(5, 'geometry');
log.addGrade(4, 'geometry');
console.log(log.getTotalAverage()); // 3,75
- Реализованы все методы, в каждом из которых вы привели примеры работы исключительных случаев (неверный формат оценки, несуществующий предмет и т.д).
- браузер;
- редактор кода, например Sublime или Visual Studio Code;
- аккаунт на GitHub (инструкция по регистрации на GitHub);
- система контроля версий Git, установленная локально (инструкция по установке Git);
- запуск всех тестов должен успешно выполнять все тесты:
- Перейти в папку задания, например, для первого задания
cd ./2.3-oop-es6
. - Открыть файл
task.js
в вашем редакторе кода и выполнить задание. - Открыть файл
index.html
в вашем браузере и с помощью консоли DevTools убедиться в правильности выводимых результатов. - Добавить файл
task.js
в индекс git с помощью командыgit add %file-path%
, где %file-path% - путь до целевого файла, например, для первого заданияgit add oop-es6/task.js
. - Сделать коммит используя команду
git commit -m '%comment%'
, где %comment% - это произвольный комментарий к вашему коммиту, например, для первого задания 'first commit oop-es6'. - Опубликовать код в репозиторий homeworks с помощью команды
git push -u homeworks master
. - Прислать ссылку на репозиторий через личный кабинет на сайте Нетологии.
Никаких файлов прикреплять не нужно.
Присылать на проверку можно каждую задачу по отдельности или все задачи вместе. Во время проверки по частям ваша домашняя работа будет со статусом «На доработке».
Любые вопросы по решению задач задавайте в Slack-канале.