Задача продолжает идеи, заложенные в предыдущем ДЗ, на этот раз с использованием всей мощи классов. Мы помогаем перевести небольшую районную библиотеку в современный цифровой формат. Начнём с того, что реализуем несколько классов: классы печатных изданий (книг, журналов) и класс самой библиотеки, который позволит работать с печатными изданиями (хранить их, выдавать читателям, принимать обратно).
Печатные издания бывают различных типов, но между всеми книгами, сборниками и журналами есть много общего: все они имеют название, год издания, состоят из скольких-то страниц, а ещё могут портиться, пока люди ими пользуются.
-
Создайте базовый класс
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 году (создайте такую книгу при необходимости);
- Выдайте любую книгу;
- Испортите выданную книгу;
- Почините выданную книгу;
- Попытайтесь добавить починенную книгу обратно в библиотеку.
Это задача со "звездочкой", ее выполнение не влияет на получение допуска до дипломной работы, но принесет много полезного опыта.
Мы продолжаем совершенствовать журнал успеваемости студентов. Нам предстоит преобразовать код прошлого ДЗ к классам, а также реализовать следующие возможности:
- внесение оценки по названию предмета;
- получение средней оценки по предмету;
- получение средней оценки по всем предметам.
- при неверной оценке (не в промежутке 1-5) оценка не заносится в журнал. Выводится сообщение об ошибке.
Для решения задания, и это представляет наибольшую сложность, вам предстоит придумать структуру данных для хранения оценок по предметам. Работать это должно следующим образом:
class Student {
// ваш код
}
const student = new Student("Олег Никифоров");
student.addMark(5, "algebra");
student.addMark(5, "algebra");
student.addMark(5, "geometry");
student.addMark(4, "geometry");
student.addMark(6, "geometry"); // "Ошибка, оценка должна быть числом от 1 до 5"
student.getAverageBySubject("geometry"); // Средний балл по предмету geometry 4.5
student.getAverageBySubject("biology"); // Несуществующий предмет
student.getAverage(); // Средний балл по всем предметам 4.75
student.exclude("Исключен за попытку подделать оценки");
- Реализованы все методы, в каждом из которых вы привели примеры работы исключительных случаев (неверный формат оценки, несуществующий предмет и т.д);
- Возможно добавление оценки по любому предмету.
- браузер;
- редактор кода, например Sublime или Visual Studio Code;
- аккаунт на GitHub (инструкция по регистрации на GitHub);
- система контроля версий Git, установленная локально (инструкция по установке Git);
- запуск всех тестов должен успешно выполнять все тесты:
- Произведите Fork репозитория с задачами (fork необходимо делать перед выполнением каждой домашней работы).
- Перейдите в папку задания
cd ./5.classes
- Откройте файл
task.js
в вашем редакторе кода и выполните задание. - Самостоятельно вызывать функции не требуется, если это не требуется по заданию.
- Откройте файл
index.html
в вашем браузере и с помощью консоли DevTools и убедитесь в правильности выводимых результатов. - Откройте файл
test-runer.html
в вашем браузере и убедитесь, что все тесты выполняются (на вкладке Spec List можно видеть какие тесты выполнились, а какие нет) - Добавьте файл
task.js
в индекс git с помощью командыgit add %file-path%
, где %file-path% - путь до целевого файла.git add task.js
. - Сделайте коммит, используя команду
git commit -m '%comment%'
, где%comment%
- это произвольный комментарий к вашему коммиту.git commit -m 'first commit variables'
. - Опубликуйте код в репозиторий
homeworks
с помощью командыgit push -u origin main
. - Пришлите ссылку на репозиторий через личный кабинет на сайте Нетологии.
Никаких файлов прикреплять не нужно.
Присылать на проверку можно каждую задачу по отдельности или все задачи вместе. Во время проверки по частям ваша домашняя работа будет со статусом «На доработке».
Любые вопросы по решению задач задавайте в чате учебной группы.