Abstraction — murakkab tizimning muhim xususiyatlarini ko‘rsatib, foydalanish uchun kerak bo‘lmagan ichki tafsilotlarni yashirish tamoyili.
Dasturlashda abstraction foydalanuvchiga “qanday ishlaydi?”dan ko‘ra “nima qiladi?” degan interfeysni beradi.
Masalan, faylni o‘qish uchun disk sectori, filesystem inode’i va device interruptini bilish shart emas. Dastur read kabi interfeysdan foydalanadi.
Abstraction darajalari
Kompyuter tizimi bir necha abstraction qatlamidan iborat:
Application
Library
Operating system API
Kernel
Driver
Hardware
Har qatlam pastki murakkablikni yashirib, yuqori qatlamga soddaroq model beradi.
Funksiya
Funksiya takroriy amallarni nomlangan abstractionga aylantiradi.
total = calculate_total(items)
Caller ichkarida:
- loop;
- discount;
- tax;
- rounding
qanday bajarilishini bilmasligi mumkin.
Function nomi va contracti muhim xatti-harakatni ifodalaydi.
Data abstraction
Data structure ichki representationni yashirib, operationlar orqali ishlashni beradi.
Masalan, queue:
- enqueue;
- dequeue;
- peek.
Queue array, linked list yoki ring buffer bilan implementatsiya qilinishi mumkin. Foydalanuvchi public contract o‘zgarmasa implementationni bilmaydi.
Interface
Interface abstractionning formal ko‘rinishi bo‘lishi mumkin.
U:
ni belgilaydi.
Turli class yoki module bir interface’ni boshqa usulda implementatsiya qiladi.
Abstract class
Abstract class umumiy state va behavior beradi, lekin ayrim methodlarni child classga qoldiradi.
U to‘g‘ridan-to‘g‘ri instance qilinmasligi mumkin.
Interface’dan farqli ravishda implementation va fieldlarni ham saqlashi mumkin. Aniq farq dasturlash tiliga bog‘liq.
API abstraction
API service ichki database va algorithmni yashiradi.
POST /payments
kabi operationni biladi.
Ichkarida:
- validation;
- fraud check;
- bank integration;
- transaction;
- event
bajarilishi mumkin.
API contract barqaror bo‘lsa, backend implementationi o‘zgaradi.
Hardware abstraction
Operatsion tizim driverlar orqali turli hardware’ni umumiy interfeysga keltiradi.
Masalan, turli disk qurilmalari file API orqali ishlatiladi.
Hardware Abstraction Layer platformaga xos tafsilotlarni ajratadi.
Virtualization abstraction
Virtual mashina guest OSga standart CPU, disk va network qurilma ko‘rsatadi.
Fizik hardware boshqa bo‘lishi mumkin.
Cloud instance foydalanuvchiga virtual resource modelini beradi.
Yaxshi abstraction
Yaxshi abstraction:
- aniq vazifaga ega;
- barqaror contract beradi;
- ichki o‘zgarishni yashiradi;
- foydalanuvchi uchun kam tushuncha talab qiladi;
- noto‘g‘ri ishlatishni qiyinlashtiradi;
- kerakli performance xususiyatlarini hujjatlashtiradi.
Leaky abstraction
Hech bir abstraction barcha tafsilotni to‘liq yashira olmaydi.
Pastki qatlam xususiyati yuqoriga chiqsa leaky abstraction deyiladi.
Masalan, database query API ishlatilsa ham:
ni bilish talab qilinishi mumkin.
Abstraction foydali, ammo fizik va operatsion cheklovlarni yo‘q qilmaydi.
Abstraction narxi
Har abstraction qo‘shimcha qatlam yaratadi.
Mumkin bo‘lgan xarajatlar:
- function call;
- allocation;
- dynamic dispatch;
- serialization;
- network hop;
- debugging murakkabligi;
- yashirin I/O;
- cheklangan boshqaruv.
Yuqori darajali interfeys performance-critical holatda pastki parametrlarni ochishi mumkin.
Noto‘g‘ri abstraction
Faqat code o‘xshash ko‘ringani uchun umumiy abstraction yaratilsa, kelajakda turli talablar uni murakkablashtiradi.
Belgilar:
- ko‘p boolean parameter;
- ko‘p special case;
- caller type bo‘yicha ichki shart;
- tushunarsiz umumiy nom;
- bir o‘zgarish ko‘p unrelated joyga ta’sir qiladi.
Ba’zan ozgina takrorlanish noto‘g‘ri abstractiondan yaxshiroq.
Abstraction va encapsulation
Abstraction kerakli modelni ko‘rsatadi.
Encapsulation state va implementationga kirishni nazorat qiladi.
Masalan, BankAccount.withdraw() abstraction sifatida pul yechish amalini beradi. Private balance esa encapsulation orqali himoyalanadi.
Ular bog‘liq, lekin bir xil tushuncha emas.
Abstraction va polymorphism
Interface umumiy abstraction beradi. Polymorphism esa turli implementationlarni bir interface orqali ishlatadi.
Masalan:
Storage
├── LocalStorage
├── S3Storage
└── MemoryStorage
Caller Storage abstractioniga tayanadi.
Domain abstraction
Business domain tushunchalari kodda aniq model qilinadi.
Masalan:
- Order;
- Invoice;
- Payment;
- Subscription.
Faqat database table yoki primitive stringlardan foydalanish business qoidani tarqoq qiladi.
Domain abstraction terminlarni va invariantlarni bir joyda saqlaydi.
Abstraction boundary
Boundary qaysi tafsilot ichkarida, qaysi contract tashqarida ekanini belgilaydi.
Boundarylar:
Boundary kesib o‘tilganda type, error, ownership va latency aniq belgilanadi.
Error abstraction
Pastki xatoni yuqori qatlamga aynan uzatish har doim to‘g‘ri emas.
Masalan, database driver xatosi service API’da domain xatosiga aylantirilishi mumkin.
Biroq diagnostika uchun asl sabab log yoki error chain’da saqlanadi.
Test
Abstraction testda dependency o‘rniga fake yoki mock implementation berishga yordam beradi.
Lekin juda ko‘p mayda interface testni mo‘rt va kodni murakkab qilishi mumkin.
Abstraction haqiqiy variation yoki boundary mavjud joyda yaratiladi.
Diagnostika
Abstraction ostidagi muammoni tahlil qilishda qatlamlar bosqichma-bosqich ochiladi:
- public contract;
- implementation;
- dependency;
- protocol;
- operating system;
- hardware.
Yuqori qatlam xabari yetarli bo‘lmasa tracing va low-level metric ishlatiladi.
Abstraction inversion
Yuqori qatlam odatda pastki implementationga tayanmasligi kerak. Dependency inversion orqali ikkala qatlam barqaror contractga tayanadi. Masalan, business service aniq database driverga emas, repository interface’iga bog‘lanadi. Bu database tafsilotini yo‘q qilmaydi, ammo uning o‘zgarish ta’sirini chegaralaydi.
Abstraction barqarorligi
Barqaror abstraction ichki implementation o‘zgarganda public contractni imkon qadar saqlaydi. Contract tez-tez o‘zgarsa, abstraction chegarasi noto‘g‘ri tanlangan yoki hali yetarlicha shakllanmagan bo‘lishi mumkin.
Bog‘liq tushunchalar
Encapsulation, Interface, Abstract class, Polymorphism, API, Module, Information hiding, Leaky abstraction, Domain model