Abstraction
Коли варто створювати абстракцію
істотно: іноді найкраща абстракція — це поки що не створювати абстракцію.; Практична роль: компонент — це коробка з написом, де зовні видно призначення, але не всі внутрішні дроти.;
істотно: хороший рівень абстракції приховує деталі, але не приховує важливі обмеження.; Приклад:
Абстрактний клас надає можливість описати спільну ідею, але залишити частину поведінки конкретним класам.; Generics дозволяють створювати абстракції над типами.;Головна користь: абстракція зменшує кількість деталей, які потрібно тримати в голові одночасно.; Іноді абстракцію називають “магією”.;== Абстракція і low-level програмування ==
</syntaxhighlight>
* залежності;
* версію runtime;
* системні бібліотеки;
* файлову структуру;
* startup command;
* частину конфігурації.; '''Критично:''' абстракція не має створювати фальшиве відчуття безпеки.; * pointer як абстракція адреси;
* struct як абстракція layout даних;
* system call як абстракція доступу до ядра;
* driver API як абстракція hardware;
* memory allocator як абстракція виділення пам’яті.; * Файл, бізнес-процес, база даних, HTTP-запит, клас, функція й API — усе це абстракції.; * багато класів без реальної потреби;
* інтерфейс має лише одну реалізацію й не планується друга;
* простий код розкиданий по багатьох файлах;
* важко знайти, де реально виконується дія;
* назви дуже загальні: Manager, Handler, Processor, Service;
* потрібно відкрити 10 файлів, щоб зрозуміти один запит;
* абстракція розроблена “на майбутнє”, яке не настало.; Якщо назва нічого не пояснює, абстракція слабка.; Приклад
Приклади сценаріїв використання
- бізнес-логіку;
- структуру даних;
- алгоритми;
- пам’ять;
- мережу;
- файлову систему;
- помилки;
- безпеку;
- протоколи;
- concurrency;
- hardware;
- user interface.; }
Ознаки надмірної магії: Типи — форма абстракції.;</syntaxhighlight>
Docker image приховує:
users = []
Кожен рівень приховує деталі нижчого рівня й надає простіший інтерфейс вищому рівню.; class InvoiceCalculator {
}
report.pdf
Поширені помилки: const total = price + tax;
}
Абстрактний клас
}
GET /api/users/42
Користувачу не потрібно бачити всі внутрішні кроки.; * документувати структуру;
- ловити помилки;
- описувати контракти;
- робити refactoring;
- покращувати autocomplete;
- передавати доменні поняття.; Практична роль: функція дає назву дії й ховає деталі її виконання.;
Приклади:
Див.; додатково
Краще для тестованості й заміни provider: </syntaxhighlight>
Leaky Abstraction
Головне правило: хороша абстракція робить код простішим для використання й розуміння.; Функція `first` функціонує з різними типами, але зберігає типову інформацію.; Приклад: await emailService.sendWelcomeEmail(user);
'''Проста різниця:''' abstraction — це про спрощення моделі, encapsulation — про контроль доступу до деталей.; з цієї причини істотно знати хоча б основи рівня нижче.; Якщо потрібен лише контракт, interface часто простіший.;<syntaxhighlight lang="typescript">
return Math.PI * this.radius * this.radius;
</div>
'''Помилка:''' думати, що більше абстракцій автономно означає кращу архітектуру.; return user;
};
Абстракція має змогу приховувати не тільки успішну роботу, а й спосіб обробки помилок.; Вона надає можливість бачити систему на потрібному рівні, не забуваючи, що нижче все одно існує реальна реалізація.; * Матеріали щодо object-oriented programming, encapsulation, design patterns і software architecture.;</div>
* Customer;
* Product;
* Order;
* Payment;
* Shipment;
* Discount;
* Cart;
* Invoice.;== Абстракція в повсякденному житті ==
</div>
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
== Абстракція і рефакторинг ==
* функція приховує послідовність дій;
* клас приховує стан і поведінку;
* API приховує внутрішню логіку сервісу;
* бібліотека приховує складні алгоритми;
* база даних приховує фізичне зберігання даних;
* операційна платформа приховує hardware;
* framework приховує типову інфраструктурну логіку;
* ORM приховує частину SQL-роботи;
* container приховує деталі середовища запуску.; * число як абстракція кількості;
* змінна як абстракція значення;
* функція як абстракція залежності;
* вектор як абстракція напрямку й величини;
* група як абстракція симетрії;
* граф як абстракція зв’язків;
* множина як абстракція колекції об’єктів.; Таблиці й рядки
<syntaxhighlight lang="typescript">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
function calculateTotal(price) {
== Коли абстракцію краще не створювати ==
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
}
Storage engine
<syntaxhighlight lang="javascript">
виглядає без ускладнень, але за ним стоять runtime, стандартні потоки виводу, операційна платформа, terminal, buffers і багато низькорівневих механізмів.;<syntaxhighlight lang="typescript">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
Хороша абстракція має правильний рівень.; '''Control abstraction''' — це приховування деталей керування потоком виконання.; Спочатку потрібна корисна модель, а потім — деталі.; * зменшує складність;
* покращує читабельність;
* приховує деталі реалізації;
* полегшує повторне використання;
* надає можливість змінювати реалізацію;
* покращує тестування;
* сприяє модульності;
* створює зрозумілі API;
* надає можливість працювати на вищому рівні;
* сприяє командній розробці;
* зменшує дублювання;
* підтримує роботу архітектурні межі;
* робить систему більш керованою.; Рефакторинг часто створює або змінює абстракції.; * ORM має змогу генерувати неефективний SQL;
* framework має змогу додавати overhead;
* wrapper має змогу створювати зайві об’єкти;
* virtual calls можуть бути повільнішими в частині мов;
* abstraction layer має змогу ускладнити оптимізацію;
* generic solution має змогу бути повільнішим за спеціалізований.; Функції, класи, API, бази даних, операційні системи, мережеві протоколи, Docker, Kubernetes і навіть UI-кнопки — усе це приклади абстракцій.; '''Цікавий факт:''' `map`, `filter` і `reduce` — це дуже сильні абстракції, бо дозволяють описувати трансформації даних без ручного керування циклом.; В об’єктно-орієнтованому програмуванні абстракція означає моделювання сутностей через класи, об’єкти, інтерфейси й методи.;== Encapsulation і Abstraction ==
'''істотно:''' ORM корисний, але не скасовує потребу розуміти SQL, індекси й транзакції.; Реалізації можуть бути різними:
користувач системи списку не думає про те, як Python виділяє пам’ять і змінює розмір внутрішнього масиву.; замовник не знає, як саме сервер знаходить користувача: через PostgreSQL, кеш, мікросервіс або інший механізм.; Суть
</div>
Чи не приховує вона важливі обмеження?;</div>
У низькорівневому програмуванні абстракції теж існують, але вони тонші.; Тепер користувач системи функції не думає про формулу щоразу.;== Абстракція і алгоритми ==
* SQL;
* joins;
* mapping rows to objects;
* migrations;
* query building;
* relations;
* transactions у частині сценаріїв.; type UserId = string;
const pdf = await this.renderPdf(data);
Абстракції можуть полегшувати тестування.; Операційна платформа функціонує з диском
Цікавий факт: програмування багато взяло з математичної абстракції: функції, типи, структури даних, графи, логіку й формальні моделі.; Головна перевага: абстракція надає можливість людині працювати зі складною системою частинами, а не всією системою одразу.;== Абстракція і магія ==
Практична роль: хмарна інфраструктура часто продає не “сервер”, а абстракцію над сервером.;Приклади:
Основна ідея: абстракція — це спосіб сказати: “Мені істотно, що це робить, а не всі деталі того, як саме це зроблено”.; * базу даних;
- внутрішню архітектуру;
- алгоритми;
- сторонні сервіси;
- authentication logic;
- validation;
- business rules;
- storage details.;
Приклади алгоритмічних абстракцій: console.log(calculateTotal(100));
Практична роль: data abstraction надає можливість працювати з “користувачем”, “замовленням” або “списком”, а не з байтами й адресами пам’яті.; Практична роль: хороші абстракції дозволяють замінити зовнішні залежності в тестах.; Це модель того, як бізнес-середовище розуміє свою реальність.;== Абстракція і типи ==
Практична роль: назва абстракції має зменшувати кількість питань, а не створювати нові.;
Ознаки: він не думає про:
Спрощено:
- Factory приховує створення об’єктів;
- Adapter приховує різницю між інтерфейсами;
- Facade дає простий інтерфейс до складної системи;
- Strategy надає можливість замінювати алгоритми;
- Repository приховує доступ до даних;
- Observer приховує механізм повідомлень;
- Decorator додає поведінку без зміни основного об’єкта.;</syntaxhighlight>
body = f"Hello, {user ['name']}!"
Код, який викликає функцію, не мусить знати, як формується лист.; calculateTotal(invoice: Invoice): Money { Backend обробляє запит
subject = "Welcome"
}
він не думає про:
Over-abstraction
</syntaxhighlight>
Абстракція в документації
</syntaxhighlight>
const user = await userRepository.findById(id);
this.sent.push(email);
'''істотно:''' мережеві абстракції зручні, але при проблемах іноді потрібно спускатися нижче: DNS, TLS, TCP, firewall, routing.;</div>
info(message: string): void;
Чи зрозуміє її інший розробник через місяць?; * приховує небезпечні defaults;
* створює ілюзію безпеки;
* не показує межі доступу;
* не надає можливість зрозуміти, де перевіряються права;
* маскує SQL injection або command injection ризики.; як ілюстрація, `for` приховує ручне керування лічильником:
abstract area(): number;
async generateMonthlyReport(month: string) {
З абстракцією:
'''Abstract class''' — це клас, який задає спільну структуру, але не завжди має повну реалізацію.; '''Проста ідея:''' facade — це “одна зрозуміла двері” до кімнати, де всередині багато механізмів.; Чи не створюємо ми її занадто рано?;<syntaxhighlight lang="text">
const stripe = new StripeClient(apiKey);
- перевірку форми;
- обробку кошика;
- payment gateway;
- fraud checks;
- створення order;
- надсилання email;
- актуалізація inventory;
- логування;
- webhook processing.; як ілюстрація:
Абстракція зустрічається в:
- сторінки на диску;
- B-tree індекси;
- кеш;
- locks;
- transaction logs;
- query planner;
- storage engine;
- physical blocks;
- WAL;
- buffer pool.; * Практики clean code, refactoring, domain modeling, API design і modular architecture.;
* методи;
* параметри;
* типи;
* очікувану поведінку;
* контракт між частинами системи.; email: string;
return `Area: ${this.area()}`;
Індекси
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
Погана документація або занадто абстрактна, або тоне в деталях.; }
Коли браузер відкриває сайт, користувач системи бачить URL, але за ним стоїть DNS, TCP, TLS, HTTP, routing і багато іншого.;</div>
</div>
return price + tax;
</div>
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
<syntaxhighlight lang="javascript">
== Абстракція в базах даних ==
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
Приклад:
* disk sectors;
* inode;
* filesystem metadata;
* permissions;
* caching;
* fragmentation;
* physical storage;
* SSD controller;
* wear leveling.;== Правильний рівень абстракції ==
|-
| Abstraction
| Виділяє головне й приховує несуттєве
| `sendEmail(user)` замість деталей SMTP
|-
| Encapsulation
| Ховає внутрішній стан і захищає доступ до нього
| private fields у класі
|}
У навчанні абстракція сприяє пояснювати складні теми поступово.; * візьми активних користувачів;
* дістань їхні email.;== Приклад простої абстракції ==
'''Практична роль:''' ООП-абстракція надає можливість працювати з поведінкою через інтерфейс, а не через конкретну реалізацію.;<syntaxhighlight lang="text">
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
}
</div>
'''істотно:''' interface має описувати стабільну поведінку, а не випадкові деталі поточної реалізації.; '''Цікавий момент:''' хороша domain abstraction часто важливіша за вибір framework, бо вона визначає, як команда думає про програмний продукт.;<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
Application layer: HTTP, DNS, SMTP
'''Практична роль:''' API надає можливість різним системам домовитися про форму взаємодії, не розкриваючи всі внутрішні деталі.; Абстракція настільки звична, що люди часто не помічають її.; У програмуванні абстракція надає можливість приховати складну реалізацію за простим інтерфейсом.; * Абстракції часто народжуються з повторення, але вмирають від надмірної універсальності.; Тепер бізнес-логіка залежить від абстракції, а не від конкретного Stripe SDK.; docker run my-app
== Загальний характеристика ==
'''Domain model''' — це абстракція предметної області.; Кнопка “Оплатити” приховує:
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
'''істотно:''' не варто боятися абстракцій через performance наперед.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<div style="background:#fef2f2; border-left:6px solid #ef4444; padding:12px; margin:12px 0;">
</div>
<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
Модульність тісно пов’язана з абстракцією.; Вона не прибирає складність із реальності, але сприяє людині працювати з нею по шматках.; private async renderPdf(data: unknown) {
'''Головна думка:''' абстракція — це не втеча від деталей, а спосіб керувати ними.;== Абстракція в Kubernetes ==
і не встановлювати вручну всі залежності на host.; const tax = price * 0.2;
area(): number {
Типові кроки:
Погані назви:
Абстракція надає можливість розділити систему на зрозумілі частини.;</div>
</div>
const stringValue = first(["a", "b", "c"]);
</div>
Але не всі абстракції повільні.;
- files замість raw disk blocks;
- processes замість ручного керування CPU;
- virtual memory замість фізичних адрес;
- sockets замість низькорівневої мережі;
- permissions замість прямого доступу до всього;
- drivers замість ручного керування пристроями;
- system calls як інтерфейс до ядра.; Коли людина натискає кнопку “зберегти”, вона не думає про файлову систему, кеш, драйвер диска, блоки пам’яті й електричні сигнали.;
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;"> if (!user) { <div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;"> == Висновок ==
Приклад поганої і кращої абстракції
Приклади:
charge(amount: number): Promise<void>;Kubernetes створює абстракції над контейнерами й інфраструктурою.;
Абстракція файлової системи
}
error(message: string): void;
Data abstraction або абстракція даних — це приховування деталей зберігання й представлення даних за зрозумілим інтерфейсом.;== Абстракція і безпека ==
constructor(private radius: number) {
- presentation layer;
- application layer;
- domain layer;
- infrastructure layer;
- data access layer;
- integration layer;
- API layer.;
Добра документація показує: Алгоритм — це абстракція над процесом розв’язання задачі.; '''Перевага:''' абстракція надає можливість будувати великі системи з менших зрозумілих частин.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;"> '''Практична порада:''' якщо ви вже двічі написали схожий код і бачите третій реальний випадок, можливо, час для абстракції.; } '''Найлюдяніший факт:''' абстракція — це причина, чому програміст має змогу думати про “користувача”, “замовлення” або “повідомлення”, а не про кожен байт у пам’яті.; '''Практична роль:''' цей checklist сприяє відрізнити корисну абстракцію від зайвого архітектурного шару.; з цієї причини головне задача розробника — не без ускладнень створювати абстракції, а вибирати правильний рівень абстракції для конкретної задачі.; як ілюстрація, sorting algorithm описує ідею впорядкування, не прив’язуючись до конкретної таблиці, файлу або UI.; У другому прикладі зрозуміліше: '''Практична роль:''' Docker абстрагує середовище застосунку, але не скасовує потребу розуміти мережу, volumes, security і ресурси.; Поняття } Розробник думає “пройдися по елементах”, а не “збільшуй індекс, перевіряй межі, діставай елемент”.; Ознаки over-abstraction: ORM має змогу приховувати: // complex storage logic .filter(user => user.active) * feature vectors; * embeddings; * model architecture; * labels; * prompts; * tokens; * latent representations; * agents; * tools; * policies; * evaluation metrics.; '''істотно:''' документація має рухатися від простого до складного, як сходи абстракції.;</div> * `calculateInvoiceTotal`; * `sendPasswordResetEmail`; * `createOrder`; * `validatePaymentMethod`; * `parseCsvFile`; * `UserRepository`; * `PaymentGateway`.; !; Без абстракції розробник мав би одночасно тримати в голові: '''Підказка:''' хороша абстракція часто має дієслівну або доменну назву: `sendEmail`, `createOrder`, `calculateTax`, `UserRepository`, `PaymentGateway`.; } * список приховує внутрішній масив; * словник приховує hash table; * об’єкт `User` приховує структуру полів; * database table приховує фізичне розміщення даних; * ORM model приховує частину SQL-запитів; * collection API приховує спосіб обходу елементів.;== Абстракція і складність == Абстракції часто створюють для reuse.; Якщо вона робить усе заплутанішим, це погана абстракція.;<syntaxhighlight lang="javascript"> '''Цікавий факт:''' SQL — це дуже сильна абстракція: розробник описує, які інформаційні дані потрібні, а database engine вирішує, як їх знайти.; Query planner == ORM як абстракція == Код, який приймає `PaymentProvider`, не мусить знати, чи це Stripe, PayPal або інший provider.; Але в критичних місцях потрібно вимірювати.;== Цікавий факт == <div style="background:#fdecea; border-left:6px solid #e74c3c; padding:12px; margin:12px 0;"> == Абстракція в UI/UX == <syntaxhighlight lang="typescript"> console.log(total); Interface має змогу визначати: Абстракція сприяє зменшити coupling між частинами системи.; Слабка або надмірна абстракція, навпаки, додає “магію”, приховує важливі обмеження й ускладнює debugging.; Типи допомагають: Спочатку зрозуміймо 2-3 реальні сценарії, а потім виділимо спільну модель.;<syntaxhighlight lang="typescript"> </div> // Stripe-specific logic } Приклади: Застосунок викликає `storage.save(file)`, а реалізація має змогу використовувати S3, Google Cloud Storage або локальну файлову систему.; Вона надає можливість приховувати складні деталі, виділяти суттєве, створювати зрозумілі інтерфейси й будувати великі системи з менших частин.; super(); } == Абстракція і залежності == === Cloud storage abstraction === } Приклади: Замість того щоб у кожному місці писати логіку SMTP або API провайдера, створюють `EmailService`.;</div> Мережеві протоколи побудовані шарами абстракції.; interface Logger { == Procedural Abstraction == Чи можна буде змінити реалізацію без зміни користувачів?;</div> Так само в коді рядок: </div> Так само слова: const activeUserEmails = users class FakeEmailSender { Приклад: name: string; await this.saveFile(pdf); Internet layer: IP Hardware зберігає біти // complex data loading == Абстракція в операційних системах == Документація додатково використовує абстракцію.; Тип `User` надає можливість говорити про користувача як про окреме поняття, а не без ускладнень про набір полів.;</div> describe(): string {
class StripePaymentProvider implements PaymentProvider {
переважні аспекти абстракції
Практична роль: AI-система не функціонує з “сенсом” так, як людина, а з абстрактними представленнями даних.; Багато design patterns є собою способами створення абстракцій.; where: { id: 42 }
Приклад:
- код повторюється;
- є собою кілька схожих реалізацій;
- деталі реалізації часто змінюються;
- потрібно спростити public API;
- потрібно ізолювати зовнішній сервіс;
- потрібно полегшити тестування;
- є собою чітке доменне поняття;
- логіка стала занадто довгою;
- частина системи має окрему відповідальність;
- потрібно стабілізувати контракт між модулями.;
Вона повинна:
Він не описує вручну індекси, тимчасові масиви й лічильники.; як ілюстрація, якщо код залежить від інтерфейсу `EmailSender`, у тесті можна підставити fake реалізацію:
</syntaxhighlight>
});
- головну ідею;
- базовий приклад;
- типові сценарії;
- обмеження;
- деталі за потреби;
- troubleshooting;
- API reference.; Бізнес-логіка функціонує з інтерфейсом `PaymentGateway`, а конкретна реалізація має змогу бути Stripe, PayPal або інший сервіс.; Docker — приклад абстракції середовища запуску.; API приховує:
У математиці абстракція надає можливість працювати з загальними структурами замість конкретних об’єктів.; * extract function;
- extract class;
- introduce interface;
- replace conditional with strategy;
- move logic to domain service;
- remove unnecessary abstraction;
- inline function;
- split module;
- create facade;
- simplify API.; class DataManager {
- `doStuff`;
- `processData`;
- `handleThing`;
- `Manager`;
- `Helper`;
- `Service2`;
- `CommonUtils`.; Кнопка “зберегти” — це абстракція над величезною кількістю технічних деталей.; send_email(user ["email"], subject, body)
users.append("Oleh")
</syntaxhighlight> Учню не потрібно знати все одразу.; * Найкращі абстракції часто здаються “очевидними”, бо добре приховують складність.; компонент приховує внутрішню реалізацію й відкриває тільки потрібний інтерфейс.; Абстракція існує не лише в коді.; * є собою лише один простий випадок;
- майбутні сценарії невідомі;
- код і так зрозумілий;
- абстракція не має хорошої назви;
- вона приховує важливі обмеження;
- вона створює більше файлів, ніж сенсу;
- вона потрібна лише “бо так архітектурно красиво”;
- вона ускладнює debugging;
- команда не розуміє її призначення.;
Service layer виконує бізнес-логіку
// unclear logic
== Facade як приклад абстракції ==
=== UI component ===
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
Шкодить, коли:
== Абстракція і продуктивність ==
</div>
Рекомендовано:
</div>
users.append("Anna")
const price = 100;
== Абстракція і назви ==
* sort;
* search;
* map;
* reduce;
* filter;
* shortest path;
* hashing;
* caching;
* retry;
* backoff;
* pagination.;== Абстракція і generics ==
платформа має змогу мати багато рівнів абстракції.; const user = await prisma.user.findUnique({
abstract class Shape {
Транзакції як ілюстрація, в інтернет-магазині є собою поняття:
Repository функціонує з базою
<div style="background:#f0eaff; border-left:6px solid #8e44ad; padding:12px; margin:12px 0;">
'''Практична роль:''' архітектурна абстракція надає можливість змінювати частини системи, не переписуючи все одразу.; * UI-кнопка має змогу приховувати десятки технічних кроків.; return pdf;
В архітектурі програмного забезпечення абстракція сприяє розділяти відповідальності.;
<syntaxhighlight lang="bash">
Практична порада: абстракція має чітко показувати, як вона поводиться при помилках: повертає null, кидає exception або повертає Result.; ORM або Object-Relational Mapping — це абстракція, яка надає можливість працювати з базою даних через об’єкти або моделі.; SQL-запити
Хороші практики абстракції
private async loadData(month: string) {
Практична роль: назва абстракції має пояснювати намір.; У програмуванні абстракція надає можливість викликати функцію, використовувати клас, працювати з API, відкривати файл, надсилати HTTP-запит або робити SQL-запит без потреби кожного разу думати про байти, пам’ять, сокети, драйвери, протоколи й фізичне зберігання даних.;Under-abstraction — протилежна проблема: коли абстракцій замало.; користувач системи натискає кнопку
console.log(item);Кнопка `PrimaryButton` приховує CSS, hover state, accessibility attributes і дизайн-систему.; Багато з них компілюються або оптимізуються дуже добре.;
id: UserId;
Погано: Вона дає:
!; Він має працювати з поняттями предметної області.; }
Абстракція в ООП
- розділяти код;
- зменшувати залежності;
- покращувати тестування;
- контролювати public API;
- приховувати internal functions;
- полегшувати refactoring;
- розвивати систему частинами.; const tax = price * 0.2;
Практична роль: типи роблять абстракції видимими для компілятора й редактора коду.; істотно: поганий код має змогу бути поганим і через надлишок абстракції, і через її нестачу.;
<syntaxhighlight lang="text">
== Under-abstraction ==
== Interface ==
як ілюстрація, embedding — це абстрактне числове представлення тексту, зображення або іншого об’єкта.;== Data Abstraction ==
== Абстракція в математиці ==
'''Leaky abstraction''' або “дірява абстракція” — це ситуація, коли приховані деталі все одно прориваються назовні.;== Цікаві факти про абстракцію ==
* Pod;
* Deployment;
* Service;
* ConfigMap;
* Secret;
* Ingress;
* PersistentVolume;
* Namespace;
* Job;
* StatefulSet.;== Абстракція в хмарних сервісах ==
== Абстракція і штучний інтелект ==
</div>
* користувач системи;
* замовлення;
* платіж;
* повідомлення;
* товар;
* документ;
* помилка;
* бізнес-процес.; * Операційні системи є собою величезним набором абстракцій над hardware.; Вона не показує все, але показує те, що потрібно для руху.; Код застосунку функціонує з `UserRepository`, а не з SQL-запитами в кожному controller.;== Недоліки і ризики абстракції ==
'''Практична роль:''' хороший UI — це хороша абстракція: він показує користувачу потрібні дії, а не внутрішню складність системи.; process(data: any) {
'''Практична роль:''' control abstraction надає можливість описувати намір, а не кожен механічний крок.;<syntaxhighlight lang="python">
'''Помилка:''' абстрагувати все наперед.; console.log("Hello");
База даних — потужна абстракція над фізичним зберіганням даних.; * SQL — приклад декларативної абстракції: користувач системи описує результат, а база вирішує спосіб виконання.; * [[Computer Science]]
* [[Програмування]]
* [[Software Engineering]]
* [[Object-Oriented Programming]]
* [[Encapsulation]]
* [[Interface]]
* [[API]]
* [[Class]]
* [[Function]]
* [[Module]]
* [[Design Patterns]]
* [[Facade Pattern]]
* [[Adapter Pattern]]
* [[Repository Pattern]]
* [[Domain Model]]
* [[Clean Code]]
* [[Refactoring]]
* [[Database]]
* [[SQL]]
* [[ORM]]
* [[Operating System]]
* [[Docker]]
* [[Kubernetes]]
* [[Cloud Computing]]
* [[Backend]]
* [[Frontend]]
* [[Безпека застосунків]]
* [[Документація]]
Це надає можливість тестувати бізнес-логіку без реального надсилання листів.; Тут код говорить:
function first<T>(items: T []): T | undefined {
interface PaymentGateway {
</div>
Абстракція відповідає на питання: “Який простий інтерфейс ми даємо?”
}
private async saveFile(pdf: unknown) {
'''Практична порада:''' хороша абстракція має змогу бути зручною, але не повинна бути непрозорою магією.; '''Цікавий факт:''' багато помилок у software design починаються не з коду, а з нечітких слів у моделі предметної області.; Код вище не мусить кожного разу перевіряти всі деталі пошуку користувача.;<div style="background:#fff4e5; border-left:6px solid #f39c12; padding:12px; margin:12px 0;">
</div>
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
Коли користувач системи бачить:
* незрозуміло, який код виконується;
* важко debug;
* поведінка залежить від naming convention;
* implicit dependencies;
* приховані side effects;
* складно знайти джерело помилки;
* документація слабка;
* framework “сам усе робить”, поки не ламається.; }
interface PaymentProvider {
Модулі допомагають:
</div>
Абстракцію варто створювати, коли:
</div>
* автомобіль має кермо, педалі й важіль передач, але водій не керує кожним клапаном двигуна;
* банкомат показує “зняти гроші”, але приховує мережевий обмін із банком;
* телефонна кнопка “подзвонити” приховує радіозв’язок, мережеву маршрутизацію й протоколи;
* карта міста приховує реальні будинки, дерева, бордюри й дроти, залишаючи дороги й орієнтири;
* меню в ресторані приховує бізнес-процес закупівельна діяльність, готування й логістику кухні.; Він викликає `calculateTotal`.;== Абстракція і тестування ==
<syntaxhighlight lang="typescript">
* створювати interface для кожного класу без потреби;
* називати все Manager або Helper;
* ховати просту логіку за багатьма шарами;
* не створювати функції й копіювати код;
* думати, що абстракція завжди означає ООП;
* не розуміти деталей нижчого рівня;
* сліпо довіряти ORM;
* не читати SQL, який генерує abstraction layer;
* робити generic solution без реальних сценаріїв;
* не документувати edge cases;
* приховувати помилки;
* робити API, яке виглядає простим, але має небезпечні side effects.; як ілюстрація, domain layer не має знати, чи інформаційні дані зберігаються в PostgreSQL, MongoDB або файлі.; Це трапляється, коли вона робить багато прихованих дій без очевидного пояснення.; Чи стане код простішим для користувача?; Кращий підхід:
<syntaxhighlight lang="typescript">
Email service
Абстракція має змогу допомагати безпеці або шкодити їй.; charge(amount: number): Promise<void>;
істотно: передчасна універсальність часто створює складніший код, ніж просте повторення на ранньому етапі.;== Абстракція і модульність ==
def send_welcome_email(user): Погано:
sent: string [] = [];
істотно: низькорівневе програмування не означає “без абстракцій”.; Воно позначає цілий клас об’єктів із певними ознаками.; Проста ідея: якщо блок коду має зрозумілу назву й повторюється, його часто варто перетворити на абстракцію.;== Абстракція і Design Patterns ==
throw new Error("User not found");
class Circle extends Shape { Приклади:
</syntaxhighlight>
Небезпека: погана абстракція має змогу бути гіршою за відсутність абстракції, бо вона не тільки складна, а ще й створює ілюзію простоти.; Файл — це абстракція.; Практична роль: design patterns — це не магічні рецепти, а перевірені способи керувати залежностями й абстракціями.; * Найгірші абстракції змушують розробника вивчити і саму абстракцію, і всі деталі під нею.;
}
API — це одна з найважливіших форм абстракції в програмуванні.;
== Абстракція в Docker ==
Основні переважні аспекти абстракції:
У функціональному програмуванні абстракція часто будується навколо функцій, композиції й трансформацій даних.;== Рівні абстракції ==
'''Encapsulation''' і '''abstraction''' часто плутають.; завдяки наявності це принцип спрощення складних речей через виділення головного й приховування зайвих деталей виступає ключовою рисою '''Abstraction''' або '''абстракція'''.;
- програмуванні;
- інформатиці;
- математиці;
- операційних системах;
- базах даних;
- мережах;
- API;
- об’єктно-орієнтованому програмуванні;
- функціональному програмуванні;
- дизайні інтерфейсів;
- архітектурі програмного забезпечення;
- моделюванні предметної області;
- документації;
- навчанні;
- повсякденному мисленні.;== Абстракція і Domain Model ==
const numberValue = first([1, 2, 3]);
істотно: абстрактний клас корисний, коли є собою спільна логіка.;
print(users [0])
Абстракція має ризики.; Приклади:
Repository layer
WAL і recovery як ілюстрація:
Практична роль: хороше навчання — це правильно підібраний рівень абстракції для поточного етапу.;</div>
Абстракція має змогу бути зайвою, якщо:
</div>
== Абстракція в програмуванні ==
Сильна абстракція робить систему зрозумілішою, тестованішою й гнучкішою.; Замість ручного запуску контейнерів користувач системи описує бажаний стан.; Link layer: Ethernet, Wi-Fi
== Тематичні мітки ==
== Абстракція і мова ==
Поширені шари:
}
Приклад:
користувач системи сервісу викликає `generateMonthlyReport`, а не керує всіма деталями.; // clear domain logic
'''Abstraction''' — це один із фундаментальних принципів інформатики й програмування.; Приклади:
Файлова платформа надає можливість працювати з іменами, папками й файлами замість фізичних деталей накопичувача.;== Абстракція в архітектурі ПЗ ==
}
'''Практична роль:''' файл — одна з найуспішніших абстракцій в історії комп’ютерів.;<div style="background:#e8f8f5; border-left:6px solid #16a085; padding:12px; margin:12px 0;">
Приклад:
Інкапсуляція відповідає на питання: “Що ми не дозволяємо змінювати напряму?”
Чи є собою реальне повторення або варіації?; }
Кращі назви:
}
- дублювання коду;
- copy-paste логіка;
- зміна одного правила потребує редагування багатьох місць;
- функції занадто довгі;
- бізнес-логіка змішана з SQL, HTML, HTTP і файлами;
- складно тестувати;
- код важко читати;
- платформа сильно зв’язана.; * Хороша абстракція не приховує правду, вона приховує шум.; }
</syntaxhighlight>
Приклад:
== Абстракція і функціональне програмування ==
</div>
* приховує секрети;
* централізує перевірку прав;
* уніфікує validation;
* дає безпечний API;
* прибирає прямий доступ до небезпечних операцій;
* стандартизує logging і audit.; У штучному інтелекті абстракція застосовують, коли потрібно для представлення складної реальності у вигляді моделей.; Окремо варто відзначити поняття й шари, які приховують внутрішні деталі і залишають користувачу або розробнику зрозумілий спосіб взаємодії.; Абстракція має змогу мати performance cost.;{{SEO
|title=Abstraction — абстракція в програмуванні, інформатиці, ООП, API, архітектурі й мисленні
|description=Abstraction — Wiki-стаття про абстракцію як принцип спрощення складних систем через приховування деталей і виділення суттєвого. Розглянуто абстракцію в програмуванні, інформатиці, ООП, API, функціях, класах, інтерфейсах, базах даних, операційних системах, мережах, архітектурі ПЗ, дизайні, математиці, мисленні, переваги, ризики, приклади, цікаві факти і хороші практики.
|keywords=Abstraction, абстракція, abstraction in programming, програмна абстракція, computer science, software engineering, OOP, API, interface, encapsulation, class, function, data abstraction, control abstraction, database abstraction, operating system abstraction, network abstraction, architecture, design patterns, software design
|alternativeTo=ручне керування всіма деталями; дублювання коду; прямий доступ до низькорівневих механізмів; hardcoded logic; tightly coupled design; spaghetti code; робота без API; робота без інтерфейсів; складні системи без шарів; реалізація без моделі; хаотичний код без розділення відповідальностей
}}
Приклад:
Приклади:
async charge(amount: number): Promise<void> {
Абстракція і інкапсуляція помилок
Physical layer: сигнали, радіохвилі, кабелі
Назва — важлива частина абстракції.; Procedural abstraction — це винесення послідовності дій у процедуру або функцію.;Control Abstraction
await stripe.charge(amount); Практична роль: функціональні абстракції часто дозволяють писати код ближче до опису перетворення даних.; Проста аналогія: операційна платформа — це перекладач між програмою й залізом.; Приклад для web-застосунку:
Практична роль: завдяки наявності абстракції розробник має змогу використовувати складну можливість через простий виклик.; Якщо API небезпечний у неправильному використанні, це потрібно явно документувати.;сприяє, коли:
const data = await this.loadData(month);
Коли розробник пише: Людська мова сама є собою системою абстракцій.; class ReportService {
// complex rendering
Інтерфейс користувача — це абстракція над діями системи.;== Абстракція і повторне використання == </syntaxhighlight>
Функція — одна з найпростіших форм абстракції.;Джерела
Критично: усі нетривіальні абстракції можуть протікати.; * давати абстракціям точні назви;
- приховувати нестабільні деталі;
- не створювати шари без потреби;
- проєктувати інтерфейс від користувача абстракції;
- документувати обмеження;
- робити абстракції тестованими;
- уникати “магії” без пояснення;
- не узагальнювати наперед;
- видаляти непотрібні абстракції;
- перевіряти performance у критичних місцях;
- знати базові деталі рівня нижче;
- розділяти domain logic і infrastructure;
- не плутати abstraction з hiding everything.; Зробімо універсальний компонент для всього, що має змогу колись знадобитися.;
Абстракція в API
Чи має абстракція зрозумілу назву?; Database engine читає інформаційні дані
- приховувати нестабільні деталі;
- мати зрозумілу назву;
- відповідати реальній моделі;
- не бути занадто загальною;
- не бути занадто вузькою;
- мати корисний інтерфейс;
- зменшувати складність;
- не створювати зайву магію;
- бути тестованою;
- не приховувати важливі обмеження.; * яка предметна область;
- що робить клас;
- які інформаційні дані приймає;
- який результат повертає.; Приклади:
Facade створює простий інтерфейс до складної підсистеми.; * Документація щодо operating systems, databases, APIs, networking, Docker, Kubernetes і cloud computing.; істотно: Kubernetes додає потужні абстракції, але додатково додає складність.; type User = {
Практична роль: рефакторинг — це не тільки “прибрати дублювання”, а й знайти правильні межі абстракцій.;Який її public interface?; * console logger;
- file logger;
- cloud logger;
- test logger.;
</syntaxhighlight>
- функції;
- loops;
- callbacks;
- promises;
- async/await;
- iterators;
- generators;
- event handlers;
- workflows;
- pipelines.; SELECT name FROM users WHERE id = 42;
</syntaxhighlight>
Розробник має змогу запустити:
<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
Слово “дерево” не є собою конкретним деревом.;== Типові помилки початківців ==
for (const item of items) {
}
Приклад:
== Приклад checklist для створення абстракції ==
</div>
* over-abstraction;
* прихована складність;
* performance overhead;
* leaky abstractions;
* складний debugging;
* занадто загальні назви;
* неправильна модель предметної області;
* зайві шари;
* важко знайти реальну реалізацію;
* abstraction mismatch;
* фальшиве відчуття простоти;
* залежність від framework magic.; Можливі проблеми:
Приклади:
'''Interface''' — це характеристика того, що об’єкт або компонент вміє робити, без обов’язкового розкриття того, як саме.; return items [0];
* virtual machine приховує фізичний сервер;
* object storage приховує диски й replication;
* managed database приховує частину адміністрування;
* serverless function приховує сервер;
* container platform приховує вузли;
* load balancer приховує набір backend-серверів.; Що саме вона приховує?;=== Payment gateway ===
!;
У програмуванні ці слова часто стають назвами класів, таблиць, функцій і модулів.;</syntaxhighlight>
Чи можна її протестувати?; Але не кожна абстракція має бути максимально універсальною.; Без абстракції:
Поганий підхід:
В інформатиці, програмуванні, дизайні систем і мисленні абстракція користувачі можуть працювати зі складністю так, щоб людина або програма могла користуватися об’єктом, функцією, системою чи ідеєю, не знаючи всіх внутрішніх механізмів.; async function getUserOrThrow(id: string) {
Абстракція в мережах
Операційна платформа — це великий набір абстракцій над hardware.; Погана абстракція не зникає, вона без ускладнень переїжджає в YAML.; Вона надає можливість створювати моделі забезпечується через Абстракція застосовується; додатково реалізовано інтерфейси.; Воно означає, що абстракції ближчі до hardware і мають менше прихованого запасу.; Frontend викликає API Найлюдяніший факт: абстракція — це спосіб не потонути в деталях.; async send(email: string) { Ці поняття не є собою без ускладнень таблицями або JSON-об’єктами.; * Документація мов програмування щодо functions, classes, interfaces, modules і generics.; .map(user => user.email);
}
- Матеріали з computer science щодо abstraction, data abstraction і control abstraction.; Transport layer: TCP, UDP
</syntaxhighlight>
- ORM приховує SQL, але повільний запит змушує читати EXPLAIN;
- cloud storage виглядає як файлова платформа, але має latency й eventual consistency;
- HTTP client приховує TCP, але timeout і retry все одно важливі;
- Docker приховує середовище, але permissions і volumes усе одно створюють проблеми;
- database transaction приховує concurrency, але deadlock усе одно має змогу статися.; Хороша абстракція часто народжується після того, як повторення й варіації вже стали видимими.; Приклади:
як ілюстрація, базу даних можна пояснити на рівнях:
Головна причина існування абстракції — складність.; зменшення складності.; * Класичні підручники з software engineering.;<div style="background:#eafaf1; border-left:6px solid #2ecc71; padding:12px; margin:12px 0;">
<div style="background:#e7f3ff; border-left:6px solid #2b7cff; padding:12px; margin:12px 0;">
== Абстракція і навчання ==
'''Over-abstraction''' — це надмірна абстракція, коли код стає складнішим через зайві інтерфейси, шари й узагальнення.; Краще:
</div>
- Абстракція є собою однією з головних причин, чому сучасне програмування взагалі можливе.; * Abstraction
- Абстракція
- Abstraction in programming
- Програмна абстракція
- Computer Science
- Software Engineering
- OOP
- API
- Interface
- Encapsulation
- Class
- Function
- Data abstraction
- Control abstraction
- Database abstraction
- Operating system abstraction
- Network abstraction
- Architecture
- Design patterns
- Software design
- Документація