Oldingi darsda temporal o‘lcham muammosini ko‘rdik: qismni olib tashlaganda, u qilgan hamma narsa to‘liq bekor bo‘lishi kerak. Bu darsning g‘oyasi juda oddiy aytiladi: har bir o‘zgarish o‘zining teskari amali (inverse) bilan birga yursa, qismni olib tashlash muammo bo‘lmay qoladi.
Markaziy g‘oya
Muhitning har bir o‘zgarishi o‘zining inverse amali bilan juft holda yuritiladi va tizim uni saqlaydi.
- Yuklash — bir qator o‘zgarishlarni qo‘llash va ularning inverslarini stack’ga terib qo‘yish.
- Tushirish — shu stack’ni qo‘llash. Boshqa hech narsa.
Kafolat shunchaki «o‘xshash» bo‘lish emas — natija bir xil (identical) bo‘ladi. Qismlar qanday tartibda kelib-ketmasin, natija o‘zgarmaydi.
// ILLUSTRATIVE — haqiqiy API shakli boshqacha bo‘lishi mumkin.
// G‘oya: qism yuklanganda effektlar qo‘llanadi, inverslar stack'ga tushadi.
stack.push(inverse(registerService('search')))
stack.push(inverse(subscribe(listener4)))
// Qism tushirilganda: stack teskari tartibda qo‘llanadi.
while (stack.length) stack.pop()()
Amaliy maslahat
Ergonomik detal: dasturchi faqat har bir *kichik* amalning inversini yozadi. Butun qismning inversini tizimning o‘zi hosil qiladi — qism ichida o‘nlab o‘zgarish bo‘lsa ham.
Oson holat va haqiqiy holat
Oson holat: teskari tartibda bekor qilish har doim ishlaydi va hech qanday shart talab qilmaydi. Har bir inverse o‘z amali yaratgan holatga to‘liq mos tushadi.
Haqiqiy holat: real tizimlar bunday tartibda bekor qilmaydi. Qismni o‘rtadan olib tashlaysan — boshqalar ishlayveradi. Yoki bir nechta qism o‘zgarishlarni aralashtirib yuborgan: bir qismning inverslari boshqa qismning o‘zgarishlari bilan ajratilgan.
Bunday paytda inverse boshqalar ko‘chirgan holatga tushadi. Aynan shu yerda shart kerak bo‘ladi.
Shart: mustaqillik (independence)
Maqola buni mustaqillik deb ataydi va uning ikki qismi bor:
| Qism | Ma’nosi |
|---|---|
| 1. Ular kommutatsiyalanadi (commute) | Bir qismning amallari va boshqasiniki istalgan tartibda bir xil natija beradi |
| 2. Ular bir-birining inverslarini buzmaydi | Hech biri ikkinchisi hosil qilgan inversni o‘zgartirmaydi |
Muhim
Deyarli har bir xulosa mustaqillikning ikkinchi yarmini tashlab ketadi. Birinchi yarmi — tartib; ikkinchisi — inverslarning buzilmasligi. Ikkalasi ham zarur.
Shart har bir juftlik uchun bajarilsa, natija olinadi: istalgan tartibda bekor qilish mumkin va tizim boshlang‘ich holatiga qaytadi.
Misol: event subscriber’larning reestri shartni qanoatlantiradi — ikkita ro‘yxatdan o‘tish istalgan tartibda bir xil natija beradi. Filtrlar zanjiri (ordered chain of filters) esa — qanoatlantirmaydi, chunki filtrlar tartibga bog‘liq.
Halollik haqida
Maqola tan oladi: «boshlang‘ich holatga qaytish» haqida gapirish — ideallashtirish. Jismoniy holat aslida qaytmaydi:
- Xotirani bo‘shatish blokni qaytaradi, lekin xotira avvalgi joylashuvini tiklamaydi.
- Yaratilgan identifikator tashlab yuborilganda qaytib kelmaydi — keyingi yaratish yangisini oladi.
Shuning uchun barcha tengliklar kuzatuvchi ajrata oladigan narsa nuqtai nazaridan o‘qiladi. Va bu talabni pasaytirish emas — aksincha, natijani erishish mumkin qiladigan narsa: ikki amal farqlanmaydigan holatlarni qoldirib, ekvivalent hisoblanishi mumkin.
Xulosa
- Effekt — muhitga kiritilgan o‘zgarish; inverse — uni bekor qiluvchi amal. Har biri juft holda saqlanadi.
- Yuklash — o‘zgarishlar + inverslar stack’i; tushirish — stack’ni qo‘llash.
- Teskari tartibda bekor qilish shartsiz ishlaydi; aralashgan tartibda mustaqillik sharti kerak.
- Mustaqillikning ikki qismi: commute va inverslarni buzmaslik.
- Natija «o‘xshash» emas — «bir xil», kuzatuvchi ajrata olmaydigan darajada.
Keyingi darsda spatial o‘lchamni ko‘ramiz: reaktiv koeffektlar — qismning tashqi muhitdan nimaga muhtojligi.