Side effect — expression yoki funksiya qiymat qaytarishdan tashqari dastur yoki tashqi muhitning kuzatiladigan holatini o‘zgartirishidir. O‘zgaruvchiga yozish, fayl yaratish, tarmoq so‘rovi, log yozish, exception tashlash va qurilma bilan ishlash bunga misol. Side effect zarur, ammo u yashirin va nazoratsiz bo‘lsa kodni tushunish, testlash va parallel bajarishni murakkablashtiradi.
Pure funksiya
Pure funksiya bir xil input uchun bir xil output beradi va kuzatiladigan side effect qilmaydi. sum(2, 3) faqat 5 qaytarsa, uni cache qilish, qayta tartiblash va mustaqil testlash oson. Global vaqt, random generator yoki mutable singletonni o‘qish ham natijani tashqi holatga bog‘lab purityni buzishi mumkin.
Referential transparency expressionni uning qiymati bilan almashtirganda dastur xatti-harakati o‘zgarmasligini bildiradi. Bu algebraik reasoning va compiler optimizationga yordam beradi.
State mutation
Assignment local yoki shared state’ni o‘zgartiradi. Local mutation kichik scope’da ko‘rinadigan bo‘lsa boshqarish osonroq. Global mutable state uzoq modullar orasida yashirin dependency yaratadi va test tartibiga bog‘liq xato keltiradi.
Immutable data yangi qiymat yaratib, eskisini o‘zgartirmaydi. Persistent data structure umumiy qismlarni bo‘lishib, to‘liq nusxa narxini kamaytirishi mumkin. Har joyda mutatsiyani taqiqlash shart emas; ownership va aniq boundary muhim.
I/O va takrorlash
Tarmoq so‘rovi yoki database write qayta bajarilganda natija takrorlanishi mumkin. Retry uchun idempotency key bir logical operationni bir marta qo‘llashga yordam beradi. “Function xato qaytardi” tashqi side effect bo‘lmaganini anglatmaydi; timeoutdan oldin server yozuvni yaratgan bo‘lishi mumkin.
Transaction bir nechta database side effectni atomik qiladi, ammo email yoki external API bilan bir transaction bo‘lmasligi mumkin. Outbox pattern state change va yuboriladigan eventni birga yozib, keyin ishonchli jo‘natadi.
Evaluation order
Ikki expression side effect qilsa qaysi biri avval bajarilishi natijani o‘zgartiradi. Til evaluation orderni belgilashi yoki ayrim operatorlarda erkin qoldirishi mumkin. Bir statementda bir variable’ni bir necha marta o‘zgartirish noaniq va portability xatosiga olib keladi.
Short-circuit condition o‘ng tomondagi side effectni ba’zan bajarmaydi. ready || initialize() kabi kod qisqa, lekin niyatni yashirishi mumkin. Explicit control flow kritik operatsiyada tushunarliroq.
Effectni ifodalash
Dependency injection vaqt, random, filesystem va networkni interface orqali beradi. Test fake implementation bilan natijani boshqaradi. Functional architecture pure core ichida qaror chiqarib, imperative shell’da I/Oni bajaradi.
Effect system function qaysi ta’sirga ega ekanini type’da ifodalashi mumkin. Async, exception yoki state effect composable abstraction orqali boshqariladi. Biroq type annotation mavjudligi implementation haqiqatan to‘g‘ri permission va transaction ishlatishini kafolatlamaydi.
Kuzatuv va audit
Muhim side effect, masalan permission o‘zgarishi yoki payment yuborilishi, operation ID bilan audit qilinadi. Log yozishning o‘zi ham side effect bo‘lib, asosiy transaction muvaffaqiyatsiz bo‘lsa noto‘g‘ri “success” xabari qoldirmasligi kerak.
Test side effectni spy bilan ko‘rishi mumkin, lekin faqat chaqiruv soniga bog‘langan brittle test implementationni muzlatadi. Asosiy contract va tashqi natija tekshiriladi. Dry-run rejimi rejalashtirilgan amallarni bajarishdan oldin ko‘rsatadi, ammo haqiqiy permission va race sharoitini to‘liq takrorlamasligi mumkin. Command va queryni ajratish state o‘zgaradigan yo‘llarni ko‘rinadigan qiladi.
Bog‘liq tushunchalar
Pure function, Referential transparency, Immutability, State, Idempotency, Evaluation order, Effect system