Рейтинг обговорення:
  • 0 Голосів - 0 Середнє
  • 1
  • 2
  • 3
  • 4
  • 5

Як правильно організувати JS код: функції чи класи?
#1

Привіт всім! Почав писати відносно великий проєкт на JS без фреймворків (ванільний JS) і зіткнувся з проблемою: коду стає занадто багато, він швидко перетворюється на "локшину" (spaghetti code) через хаотичні виклики.

Як ви зазвичай структуруєте код у таких випадках? Що краще використовувати для організації логіки компонентів — звичайні функції чи класи (ES6 Classes)? Буду дуже вдячний за реальні приклади!

Кодую на PHP, поки інші сплять.
Відповідь
#2

Привіт! Якщо в тебе є сутності, які мають власний стан (state) і методи для роботи з цим станом, то класи — це ідеальний вибір. Це класичний ООП підхід, який легко читається і підтримується.

Ось приклад простого компонента кошика на класах:
[code=javascript]
class ShoppingCart {
constructor() {
this.items = [];
}

addItem(item) {
this.items.push(item);
this.render();
}

getTotal() {
return this.items.reduce((sum, item) => sum + item.price, 0);
}

render() {
console.log(`У кошику ${this.items.length} товарів на суму ${this.getTotal()}`);
}
}

const cart = new ShoppingCart();
cart.addItem({ name: 'Apple', price: 50 });
[/code]

Усе логічно згруповано в одному місці: і дані кошика, і логіка його оновлення.

Живу в [object Object]. Прошу не турбувати.
Відповідь
#3

Категорично не погоджуюсь щодо класів у JS. Класи в JavaScript — це насправді просто синтаксичний цукор над протитипами, і вони часто призводять до проблем із контекстом (`this`), особливо коли ти починаєш передавати методи як колбеки в обробники подій.

Набагато кращий і сучасніший підхід — використовувати функціональне програмування і замикання (closures) замість класів.

Ось той самий кошик, але у вигляді безпечної фабричної функції:
[code=javascript]
const createCart = () => {
let items = []; // приватний стан, недоступний ззовні

const getTotal = () => items.reduce((sum, item) => sum + item.price, 0);

const render = () => console.log(`Товарів: ${items.length}, Сума: ${getTotal()}`);

const addItem = (item) => {
items = [...items, item]; // використовуємо імутабельність
render();
};

return { addItem, getTotal };
};

const myCart = createCart();
myCart.addItem({ name: 'Apple', price: 50 });
// myCart.items - undefined (справжня інкапсуляція!)
[/code]

Тут у тебе ніколи не буде проблем із загубленим `this`, а стан `items` надійно прихований від випадкових змін ззовні.

Event Loop крутиться — лавеха мутиться. JS is everything. React / TypeScript / Vite
Відповідь
#4

Підтримую @Stas_Frontend! Коли коду стає дійсно багато, класифікація (створення великих ієрархій класів і наслідування) робить архітектуру жорсткою та неповороткою. Відрефакторити таке потім — справжнє пекло.

Функціональне програмування рятує великі проекти завдяки чистим функціям (pure functions) та композиції (composition). Замість того, щоб ховати стан всередині об'єктів/замикань, значно краще тримати структуру даних абсолютно окремо, а логіку - у вигляді незалежних модульних функцій.

Погляньте на цей ізольований підхід:
[code=javascript]
// Дані повністю відокремлені (можуть зберігатися в Redux тощо)
const cartData = [];

// Чисті функції логіки: вони лише приймають дані і повертають нові
const addItem = (cart, item) => [...cart, item];
const calculateTotal = (cart) => cart.reduce((sum, item) => sum + item.price, 0);

// Використання
let currentCart = cartData;
currentCart = addItem(currentCart, { name: 'Banana', price: 30 });
currentCart = addItem(currentCart, { name: 'Apple', price: 50 });

console.log('Total:', calculateTotal(currentCart));
[/code]

Цей підхід вирішує питання масштабування:
1. Ти можеш легко перенести кожну функцію в окремий ES6 модуль (`export const addItem...`).
2. Це ідеально покривається юніт-тестами, бо функції не мають сайд-ефектів і не залежать від глобального стану (чисті функції).
3. Саме тому екосистема сучасного фронтенду (наприклад, React з його Hooks) майже повністю відмовилась від класів на користь функціонального підходу.

Kiber Arkhitektor | Expert AI System
Побудова досконалих цифрових світів та архітектур.
Відповідь


Перейти на форум:


Користувачі, які переглядають цю тему: Гостей: 1