Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions oop_basics/book.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
export default class Book {
constructor(title, author, releaseYear) {
this._title = title;
this._author = author;
this._releaseYear = releaseYear;
}

get title() {
return this._title;
}

set title(newTitle) {
if (typeof newTitle !== 'string' || newTitle.trim() === '') {

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

if (typeof newTitle !== 'string' || !newTitle.trim().length)
would be more convenient

throw new Error('Invalid input. Title must be a non-empty string.');
}
this._title = newTitle;
}

get author() {
return this._author;
}

set author(newAuthor) {
if (typeof newAuthor !== 'string' || newAuthor.trim() === '') {
throw new Error('Invalid input. Author must be a non-empty string.');
}
this._author = newAuthor;
}

get releaseYear() {
return this._releaseYear;
}

set releaseYear(newYear) {
if (typeof newYear !== 'number') {
console.error('Invalid input. Year must be a number.');
return;
}
this._releaseYear = newYear;
}

printInfo() {
console.log(`Title: ${this._title}, Author: ${this._author}, Release Year: ${this._releaseYear}`);
}

static findOldestBook(books) {
return books.reduce((oldest, current) => (oldest.releaseYear < current.releaseYear ? oldest : current));
}
}
28 changes: 28 additions & 0 deletions oop_basics/eBook.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import Book from './book.js';

export default class EBook extends Book {
constructor(title, author, releaseYear, fileFormat) {
super(title, author, releaseYear);
this._fileFormat = fileFormat;
}

get fileFormat() {
return this._fileFormat;
}

set fileFormat(newFormat) {
if (typeof newFormat !== 'string' || newFormat.trim() === '') {
throw new Error('Invalid input. File format must be a non-empty string.');
}
this._fileFormat = newFormat;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

add validation rules

}

printInfo() {
super.printInfo();
console.log(`File Format: ${this._fileFormat}`);
}

static createEBookFromBook(bookInstance, fileFormat) {
return new EBook(bookInstance.title, bookInstance.author, bookInstance.releaseYear, fileFormat);
}
}
21 changes: 21 additions & 0 deletions oop_basics/task1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import Book from './book.js';
import EBook from './eBook.js';

const book1 = new Book('Title1', 'Author1', 2000);
const book2 = new Book('Title2', 'Author2', 2010);

const ebook1 = new EBook('E-Title1', 'E-Author1', 2020, 'PDF');
const ebook2 = new EBook('E-Title2', 'E-Author2', 2021, 'EPUB');

book1.printInfo();
book2.printInfo();
ebook1.printInfo();
ebook2.printInfo();

const oldestBook = Book.findOldestBook([book1, book2, ebook1, ebook2]);
console.log('Oldest book:');
oldestBook.printInfo();

const newEBook = EBook.createEBookFromBook(book2, 'MOBI');
console.log('New EBook:');
newEBook.printInfo();