JavaScript: Класи та ООП

Принципи ООП: SOLID та патерни

📖 Теорія

Чотири принципи ООП:
1. Інкапсуляція — приховування внутрішнього стану (#приватні поля)
2. Наслідування — extends, повторне використання коду
3. Поліморфізм — однаковий інтерфейс, різна реалізація
4. Абстракція — приховування складності

Патерн Singleton — один екземпляр на весь застосунок:

JavaScript
1class Config {
2  static #instance = null;
3
4  #settings = {};
💡 Приклад коду
Вивід:

                            
📝 ЗАВДАННЯ (3)
1.
Завдання 1: Stack
10 XP
Реалізуй клас Stack (стек — LIFO):
- push(item) — додати на верхівку
- pop() — видалити та повернути верхній елемент (або undefined якщо порожній)
- peek() — подивитись верхній без видалення
- isEmpty() — чи порожній
- size гетер

Виведи операції: push 3 елементи, peek, pop, size.
💡 Підказка: Зберігай дані у #items = [] всередині класу
🔓 Розв'язок:
class Stack {
  #items = [];
  push(item) { this.#items.push(item); }
  pop() { return this.#items.pop(); }
  peek() { return this.#items[this.#items.length - 1]; }
  isEmpty() { return this.#items.length === 0; }
  get size() { return this.#items.length; }
}
const s = new Stack();
s.push(10); s.push(20); s.push(30);
console.log(s.peek());
console.log(s.pop());
console.log(s.size);
Вивід:

                                

2.
Завдання 2: LinkedList вузол
20 XP
Реалізуй класи:
class Node { constructor(value) { this.value=value; this.next=null; } }
class LinkedList:
- append(value) — додати в кінець
- toArray() — повернути масив значень

Створи список з 1→2→3→4→5 та виведи toArray().
💡 Підказка: В append: якщо head === null, new Node стає head. Інакше йди по .next до останнього
🔓 Розв'язок:
class Node { constructor(v) { this.value = v; this.next = null; } }
class LinkedList {
  constructor() { this.head = null; }
  append(v) {
    const node = new Node(v);
    if (!this.head) { this.head = node; return; }
    let cur = this.head;
    while (cur.next) cur = cur.next;
    cur.next = node;
  }
  toArray() {
    const arr = []; let cur = this.head;
    while (cur) { arr.push(cur.value); cur = cur.next; }
    return arr;
  }
}
const list = new LinkedList();
[1,2,3,4,5].forEach(n => list.append(n));
console.log(list.toArray());
Вивід:

                                

3.
Завдання 3: Queue
30 XP
Реалізуй клас Queue (черга — FIFO):
- enqueue(item) — додати в кінець
- dequeue() — видалити з початку
- front() — перший елемент без видалення
- isEmpty() та size гетер

Симулюй чергу: додай 'Аліна', 'Богдан', 'Вікторія'. Виведи front(). Виконай dequeue(). Виведи всі елементи що залишились.
💡 Підказка: Використай #items = []. enqueue — push, dequeue — shift
🔓 Розв'язок:
class Queue {
  #items = [];
  enqueue(item) { this.#items.push(item); }
  dequeue() { return this.#items.shift(); }
  front() { return this.#items[0]; }
  isEmpty() { return this.#items.length === 0; }
  get size() { return this.#items.length; }
  toArray() { return [...this.#items]; }
}
const q = new Queue();
q.enqueue('Аліна'); q.enqueue('Богдан'); q.enqueue('Вікторія');
console.log(q.front());
q.dequeue();
console.log(q.toArray());
Вивід: