Що це за ключеве слово using
Зміст
Про що мова?⌗
Основа допису – репозиторій tc39 ECMAScript Explicit Resource Management з детальним технічним описом ключового слова using
та мотивацією для чого варто його додавати у стандарт ECMAScript. Тут же я в двох словах без зайвого шуму поясню що це нам дає і які у цього потенцій перспективи.
Це щось нове?⌗
Для світу javascript – так. Для інших МП – ні. У C# є також using
(хто б сумнівався, що людина з Microsoft, автор нововведення, запропонує якесь інше ключове слово для JS), в Java є try-with-resource
, у Python просто with
, у Go defer
, а у C++ паттерн RAII, який взагалі став одним зі стовпів в МП Rust
.
Що це значить для кінцевого споживача, який пише просто бізнес логіку⌗
Насправді зміниться не багато, по факту розробники бібліотек сховають більшість мануальних степів під капот. Найпростіший, потенційний, приклад, це відкриття/закриття нового з’єднання з БД
// раніше
function doSomethingWithDB(...params) {
const db = new DBConnection();
// якась логіка, читання чи запис
db.close(); // треба обов'язково закрити підключення, бо GC не закриває
}
// з ключевим словом using
function doSomethingWithDB(...params) {
using db = new DBConnection();
// якась логіка, читання чи запис
} // <-- кінець скоупу в якому було ініціалізовано підключення до БД
Тобто using
каже, що після виходу зі скоупу необхідно виконати якусь дію, а у нашому умовному прикладі це неявний виклик функції, яка закриє підключення до БД і очистить памʼять.
Як цим користуватись і головне хто цим буде користуватись⌗
Для того, щоб ваша функція змогла зреагувати на using
і вихід зі скоупу вам треба відповідати всього одній вимозі – у вас повинно бути реалізоване поле з ключем Symbol.dispose
const myCoolFunc = () => {
// якась логіка
return {
myField: "foo",
myAnotherField: 1,
[Symbol.dispose]() {
// код, який буде виконаний під час виходу зі скоупу
},
};
};
Зараз у багатьох сучасних фреймворках є функції/методи/хуки життєвого циклу і поле Symbol.dispose
це їх найближчий аналог, тому для більшості це не стане якоюсь магією.
Треба усвідомлювати, що першочергове застосування using
разом з полем Symbol.dispose
це неявне вивільнення ресурсів, які не очищаються самостійно за допомогою Garbage Collector, а це робота з файловою системою в Node-like середовищі, підключення до БД, робота з Web Sockets тощо. Тобто не варто зловживати і робити абстракції в яких потім не розібратись.
Замість висновків⌗
Очікується, що основним користувачем будуть розробники бібліотек, а звичайні девелопери, лише замінять const
на using
у специфічних випадках, та і не будуть думати про те, чи вивільнили вони памʼять після того, як зробили потрібну операцію.