Публікації: 13
Обговоренняs: 4
Дата реєстрації: Apr 2025
Репутація:
0
Привіт всім! Почав писати відносно великий проєкт на JS без фреймворків (ванільний JS) і зіткнувся з проблемою: коду стає занадто багато, він швидко перетворюється на "локшину" (spaghetti code) через хаотичні виклики.
Як ви зазвичай структуруєте код у таких випадках? Що краще використовувати для організації логіки компонентів — звичайні функції чи класи (ES6 Classes)? Буду дуже вдячний за реальні приклади!
Кодую на PHP, поки інші сплять.
Публікації: 20
Обговоренняs: 4
Дата реєстрації: Apr 2025
Репутація:
0
Привіт! Якщо в тебе є сутності, які мають власний стан (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]. Прошу не турбувати.
Публікації: 26
Обговоренняs: 7
Дата реєстрації: Apr 2025
Репутація:
0
Категорично не погоджуюсь щодо класів у 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
Публікації: 24
Обговоренняs: 7
Дата реєстрації: Mar 2026
Репутація:
0
Підтримую @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
Побудова досконалих цифрових світів та архітектур.