Реактивне програмування — це парадигма програмування, побудована на потоках даних і розповсюдженні змін. Це означає, що у мовах програмування має бути можливість легко виразити статичні чи динамічні потоки даних, а реалізована модель виконання буде автоматично розсилати зміни через потік даних.
Наприклад, в імперативному програмуванні вираз, означає, що отримує результат виконання безпосередньо під час обчислення виразу, і потім, якщо значення і зміняться, це не впливатиме на вже обчислене значення .
Проте, в реактивному програмуванні значення буде автоматично оновлено за новими значеннями, що є протилежністю функційного програмування.
Сучасна програма електронної таблиці є прикладом реактивного програмування. Комірки електронної таблиці можуть мати буквальні значення, або формули типу «=B1+C1», що обчислюються за значеннями інших комірок. Коли б не змінилося значення іншої комірки, значення формули оновлюється автоматично.
Інший приклад — це мова опису апаратури типу Verilog. У цьому випадку, реактивне програмування дозволяє моделювати зміни по ходу їх розповсюдження по електричному ланцюгу.
Реактивне програмування спочатку пропонувалося як засіб простого створення інтерфейсів користувача, анімацій у системах реального часу, але стало загальною парадигмою програмування.
Наприклад, у архітектурі Модель-вид-контролер, реактивне програмування дозволяє змінам у моделі автоматично відображатися у виді, і навпаки.
Концепції
Ступені експліцитности
Реактивні мови програмування можуть різнитись від дуже явних, де потоки даних встановлюються через використання стрілок, до неявних, де потоки даних є похідними від мовних конструкцій, як у імперативному або функційному програмуванні. Наприклад, в неявно викликаному функціонального реактивному програмуванні (FRP) виклик функції може неявно спричинити побудову вузла в графі потоку даних. Реактивні бібліотеки програмування для динамічних мов (такі як «Cells» у Ліспі та «Trellis» для Python'у), можуть будувати граф залежностей через аналіз значень, зчитуваних під час виконання певної функції, дозволяючи специфікації потоку даних бути як неявною, так і динамічною.
Іноді термін «реактивне програмування» стосується архітектурного рівня розробки програм, де окремі вузли в графі потоку даних є звичайними програмами, які взаємодіють одна з одною.
Статика проти динаміки
Реактивне програмування може бути чисто статичними, де потоки даних встановлюються статично, або бути динамічним, де потоки даних можуть змінюватися під час виконання програми.
Використання умовних переходів в графі потоку даних може деякою мірою змусити статичний граф потоку даних виглядати як динамічний, і злегка затушувати відмінність. Проте, чисто динамічне реактивне програмування може використовувати імперативне програмування для реконструкції графа потоку даних.
Реактивне програмування вищого порядку
Реактивне програмування можна назвати програмуванням вищого порядку, якщо воно підтримує ідею про те, що потоки даних можуть бути використані для побудови інших потоків даних. Тобто, результуюче значення з потоку даних є інший потік даних, який виконується з використанням тієї ж самої моделі обчислення, що і перший.
Диференціація потоку даних
В ідеальному випадку всі зміни даних поширюються миттєво, що не може бути забезпечено на практиці. Замість цього може бути необхідно надати різні пріоритети обчислення різним частинам графу потоку даних. Це можна назвати диференційованим реактивним програмуванням.
Наприклад, в текстовому процесорі маркування орфографічних помилок не обов'язково має бути повністю синхронізованим зі вставкою символів. Тут диференційоване реактивне програмування потенційно може бути використане для перевірки орфографії з нижчим пріоритетом, що дозволяє перевірці бути відкладеною, зберігаючи при цьому миттєвість інших потоків даних.
Проте, така диференціація вносить додаткову складність у конструкцію. Наприклад, треба вирішувати, як визначити різні області потоку даних, а також як обробляти події, що проходять між різними областями потоку даних.
Моделі обчислення у реактивному програмуванні
Обчислення, чи оцінювання у реактивних програмах не обов'язково засновані на тому ж, що й обчислення у програмах, що будуються на стеках. Замість цього, коли якісь дані змінюються, то зміна поширюється на всі дані, які були залежали від змінених даних. Це поширення зміни може бути досягнуто кількома способами, серед яких, можливо, найприроднішим способом є схема інвалідація/лінива-ревалідація.
Просте наївне поширення змін через стек може викликати проблеми, тому що існує потенційно експонентна складність оновлення для структур даних певної форми. Одна з таких форм може бути описана як "форма повторюваних діамантів", і має наступну структуру: An → Bn → An + 1, An → Cn → An + 1, де n = 1,2... Ця проблема може бути подолана шляхом поширення інвалідації лише тоді, коли деякі дані ще не інвалідовано, з наступною ре-валідацією даних в разі потреби, використовуючи ледачі обчислення.
Одна проблема, притаманна реактивному програмуванню, це те, що більшість обчислень, які у звичайній мові програмування були б зроблені і забуті, мусять лишатися в пам'яті у вигляді структур даних. Це може зробити реактивне програмування дуже вимогливим до об'єму пам'яті. Проте, дослідження, що називається "зниженням", має потенціал вирішити цю проблему.
З іншого боку, реактивне програмування є формою того, що можна описати як "явний паралелізм", і, таким чином, може бути корисним для використання потужностей паралельного апаратного забезпечення.
Схожість з шаблоном спостерігач
Реактивне програмування має принципову подібність до шаблону спостерігач, що зазвичай використовується в ООП. Проте, інтеграція концепцій потоку даних в мову програмування полегшить їх висловлення, і, таким чином, може збільшити ступінь деталізації графа потоку даних. Наприклад, шаблон "Спостерігач" зазвичай описує потоки даних між цілими класами/об'єктами, в той час, як об'єктно-орієнтоване реактивне програмування може націлюватися на членів об'єктів і класів.
Модель обчислення на основі стеку у загальновживаному ООП також не зовсім підходить для поширення потоку даних, тому що випадки "зворотного зв'язку дерева ребер" в структурах даних можуть зробити програму експонентно складною. Але через його відносно обмежене використання і низьку зернистість, це рідко є проблемою для шаблону Спостерігача на практиці.
Реалізація
JavaScript
let data = { price: 5, quantity: 2 } // Клас "спостерігач" який реалізовує реактивність let target = null class Dep { constructor () { this.subscribers = [] } depend () { if (target && !this.subscribers.includes(target)){ this.subscribers.push(target) } } notify () { this.subscribers.forEach(sub => sub()) } } Object.keys(data).forEach(key => { let internalValue = data[key] // пов'язуємо властивості із спостерігачем const dep = new Dep() Object.defineProperty(data, key, { get() { // запам'ятовуємо контекст виконання dep.depend() return internalValue }, set(newVal) { internalValue = newVal // переобчислюємо всі значення, які залежать на даній властивості dep.notify() } }) }) function watcher(myFunc){ target = myFunc target() target = null } watcher(() => { data.total = data.price * data.quantity }) // приклад виконання console.log(data.total); // 10 data.price = 20; console.log(data.total); // 40
Приклади
- React - js бібліотека
- Elm (мова програмування)
Примітки
- Trellis, , Tele community, архів оригіналу за 3 березня 2016, процитовано 7 березня 2016.
- (PDF). Архів оригіналу (PDF) за 16 квітня 2016.
Джерела
- Explanation of JavaScript Reactivity [ 27 квітня 2020 у Wayback Machine.]
Це незавершена стаття про програмування. Ви можете проєкту, виправивши або дописавши її. |
Ця стаття потребує додаткових для поліпшення її . (березень 2016) |
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Reaktivne programuvannya ce paradigma programuvannya pobudovana na potokah danih i rozpovsyudzhenni zmin Ce oznachaye sho u movah programuvannya maye buti mozhlivist legko viraziti statichni chi dinamichni potoki danih a realizovana model vikonannya bude avtomatichno rozsilati zmini cherez potik danih Napriklad v imperativnomu programuvanni viraz a b c displaystyle a b c oznachaye sho a displaystyle a otrimuye rezultat vikonannya b c displaystyle b c bezposeredno pid chas obchislennya virazu i potim yaksho znachennya b displaystyle b i c displaystyle c zminyatsya ce ne vplivatime na vzhe obchislene znachennya a displaystyle a Prote v reaktivnomu programuvanni znachennya a displaystyle a bude avtomatichno onovleno za novimi znachennyami sho ye protilezhnistyu funkcijnogo programuvannya Suchasna programa elektronnoyi tablici ye prikladom reaktivnogo programuvannya Komirki elektronnoyi tablici mozhut mati bukvalni znachennya abo formuli tipu B1 C1 sho obchislyuyutsya za znachennyami inshih komirok Koli b ne zminilosya znachennya inshoyi komirki znachennya formuli onovlyuyetsya avtomatichno Inshij priklad ce mova opisu aparaturi tipu Verilog U comu vipadku reaktivne programuvannya dozvolyaye modelyuvati zmini po hodu yih rozpovsyudzhennya po elektrichnomu lancyugu Reaktivne programuvannya spochatku proponuvalosya yak zasib prostogo stvorennya interfejsiv koristuvacha animacij u sistemah realnogo chasu ale stalo zagalnoyu paradigmoyu programuvannya Napriklad u arhitekturi Model vid kontroler reaktivne programuvannya dozvolyaye zminam u modeli avtomatichno vidobrazhatisya u vidi i navpaki KoncepciyiStupeni eksplicitnosti Reaktivni movi programuvannya mozhut riznitis vid duzhe yavnih de potoki danih vstanovlyuyutsya cherez vikoristannya strilok do neyavnih de potoki danih ye pohidnimi vid movnih konstrukcij yak u imperativnomu abo funkcijnomu programuvanni Napriklad v neyavno viklikanomu funkcionalnogo reaktivnomu programuvanni FRP viklik funkciyi mozhe neyavno sprichiniti pobudovu vuzla v grafi potoku danih Reaktivni biblioteki programuvannya dlya dinamichnih mov taki yak Cells u Lispi ta Trellis dlya Python u mozhut buduvati graf zalezhnostej cherez analiz znachen zchituvanih pid chas vikonannya pevnoyi funkciyi dozvolyayuchi specifikaciyi potoku danih buti yak neyavnoyu tak i dinamichnoyu Inodi termin reaktivne programuvannya stosuyetsya arhitekturnogo rivnya rozrobki program de okremi vuzli v grafi potoku danih ye zvichajnimi programami yaki vzayemodiyut odna z odnoyu Statika proti dinamiki Reaktivne programuvannya mozhe buti chisto statichnimi de potoki danih vstanovlyuyutsya statichno abo buti dinamichnim de potoki danih mozhut zminyuvatisya pid chas vikonannya programi Vikoristannya umovnih perehodiv v grafi potoku danih mozhe deyakoyu miroyu zmusiti statichnij graf potoku danih viglyadati yak dinamichnij i zlegka zatushuvati vidminnist Prote chisto dinamichne reaktivne programuvannya mozhe vikoristovuvati imperativne programuvannya dlya rekonstrukciyi grafa potoku danih Reaktivne programuvannya vishogo poryadku Reaktivne programuvannya mozhna nazvati programuvannyam vishogo poryadku yaksho vono pidtrimuye ideyu pro te sho potoki danih mozhut buti vikoristani dlya pobudovi inshih potokiv danih Tobto rezultuyuche znachennya z potoku danih ye inshij potik danih yakij vikonuyetsya z vikoristannyam tiyeyi zh samoyi modeli obchislennya sho i pershij Diferenciaciya potoku danih V idealnomu vipadku vsi zmini danih poshiryuyutsya mittyevo sho ne mozhe buti zabezpecheno na praktici Zamist cogo mozhe buti neobhidno nadati rizni prioriteti obchislennya riznim chastinam grafu potoku danih Ce mozhna nazvati diferencijovanim reaktivnim programuvannyam Napriklad v tekstovomu procesori markuvannya orfografichnih pomilok ne obov yazkovo maye buti povnistyu sinhronizovanim zi vstavkoyu simvoliv Tut diferencijovane reaktivne programuvannya potencijno mozhe buti vikoristane dlya perevirki orfografiyi z nizhchim prioritetom sho dozvolyaye perevirci buti vidkladenoyu zberigayuchi pri comu mittyevist inshih potokiv danih Prote taka diferenciaciya vnosit dodatkovu skladnist u konstrukciyu Napriklad treba virishuvati yak viznachiti rizni oblasti potoku danih a takozh yak obroblyati podiyi sho prohodyat mizh riznimi oblastyami potoku danih Modeli obchislennya u reaktivnomu programuvanni Obchislennya chi ocinyuvannya u reaktivnih programah ne obov yazkovo zasnovani na tomu zh sho j obchislennya u programah sho buduyutsya na stekah Zamist cogo koli yakis dani zminyuyutsya to zmina poshiryuyetsya na vsi dani yaki buli zalezhali vid zminenih danih Ce poshirennya zmini mozhe buti dosyagnuto kilkoma sposobami sered yakih mozhlivo najprirodnishim sposobom ye shema invalidaciya liniva revalidaciya Proste nayivne poshirennya zmin cherez stek mozhe viklikati problemi tomu sho isnuye potencijno eksponentna skladnist onovlennya dlya struktur danih pevnoyi formi Odna z takih form mozhe buti opisana yak forma povtoryuvanih diamantiv i maye nastupnu strukturu An Bn An 1 An Cn An 1 de n 1 2 Cya problema mozhe buti podolana shlyahom poshirennya invalidaciyi lishe todi koli deyaki dani she ne invalidovano z nastupnoyu re validaciyeyu danih v razi potrebi vikoristovuyuchi ledachi obchislennya Odna problema pritamanna reaktivnomu programuvannyu ce te sho bilshist obchislen yaki u zvichajnij movi programuvannya buli b zrobleni i zabuti musyat lishatisya v pam yati u viglyadi struktur danih Ce mozhe zrobiti reaktivne programuvannya duzhe vimoglivim do ob yemu pam yati Prote doslidzhennya sho nazivayetsya znizhennyam maye potencial virishiti cyu problemu Z inshogo boku reaktivne programuvannya ye formoyu togo sho mozhna opisati yak yavnij paralelizm i takim chinom mozhe buti korisnim dlya vikoristannya potuzhnostej paralelnogo aparatnogo zabezpechennya Shozhist z shablonom sposterigach Reaktivne programuvannya maye principovu podibnist do shablonu sposterigach sho zazvichaj vikoristovuyetsya v OOP Prote integraciya koncepcij potoku danih v movu programuvannya polegshit yih vislovlennya i takim chinom mozhe zbilshiti stupin detalizaciyi grafa potoku danih Napriklad shablon Sposterigach zazvichaj opisuye potoki danih mizh cilimi klasami ob yektami v toj chas yak ob yektno oriyentovane reaktivne programuvannya mozhe nacilyuvatisya na chleniv ob yektiv i klasiv Model obchislennya na osnovi steku u zagalnovzhivanomu OOP takozh ne zovsim pidhodit dlya poshirennya potoku danih tomu sho vipadki zvorotnogo zv yazku dereva reber v strukturah danih mozhut zrobiti programu eksponentno skladnoyu Ale cherez jogo vidnosno obmezhene vikoristannya i nizku zernistist ce ridko ye problemoyu dlya shablonu Sposterigacha na praktici RealizaciyaJavaScript Priklad realizaciyi movoyu JavaScript let data price 5 quantity 2 Klas sposterigach yakij realizovuye reaktivnist let target null class Dep constructor this subscribers depend if target amp amp this subscribers includes target this subscribers push target notify this subscribers forEach sub gt sub Object keys data forEach key gt let internalValue data key pov yazuyemo vlastivosti iz sposterigachem const dep new Dep Object defineProperty data key get zapam yatovuyemo kontekst vikonannya dep depend return internalValue set newVal internalValue newVal pereobchislyuyemo vsi znachennya yaki zalezhat na danij vlastivosti dep notify function watcher myFunc target myFunc target target null watcher gt data total data price data quantity priklad vikonannya console log data total 10 data price 20 console log data total 40PrikladiReact js biblioteka Elm mova programuvannya PrimitkiTrellis Tele community arhiv originalu za 3 bereznya 2016 procitovano 7 bereznya 2016 PDF Arhiv originalu PDF za 16 kvitnya 2016 DzherelaExplanation of JavaScript Reactivity 27 kvitnya 2020 u Wayback Machine Ce nezavershena stattya pro programuvannya Vi mozhete dopomogti proyektu vipravivshi abo dopisavshi yiyi Cya stattya potrebuye dodatkovih posilan na dzherela dlya polipshennya yiyi perevirnosti Bud laska dopomozhit udoskonaliti cyu stattyu dodavshi posilannya na nadijni avtoritetni dzherela Zvernitsya na storinku obgovorennya za poyasnennyami ta dopomozhit vipraviti nedoliki Material bez dzherel mozhe buti piddano sumnivu ta vilucheno berezen 2016