Access modifier — class, field, method yoki modulga qaysi kod murojaat qilishi mumkinligini compile time yoki runtime qoidalari bilan belgilovchi til konstruksiyasidir. public, private, protected va package yoki internal ko‘rinish keng tarqalgan. U encapsulation va API chegarasini boshqaradi, ammo operatsion tizim yoki tarmoq darajasidagi xavfsizlik nazorati o‘rnini bosmaydi.
Ko‘rinish darajalari
Public a’zo tashqi consumerlar uchun contractga aylanadi. Private faqat e’lon qilingan class yoki modul ichida ishlatiladi. Protected subclasslarga va ayrim tillarda ayni package’ga kirish beradi. Internal yoki package-private bir komponent assembly yoki package chegarasida ko‘rinadi.
Til semantikasi farq qiladi. C++ friend aniq class yoki functionga private kirish beradi. Java package ko‘rinishini default sifatida ishlatadi. C# internal assembly doirasiga tegishli. Python underscore convention va name mangling beradi, lekin qat’iy enforcement emas. Hujjat ayni til qoidalariga tayanadi.
Encapsulation
Eng tor modifier implementationni tashqi dependency’dan himoya qiladi. Field private bo‘lib, ma’noli method orqali o‘zgarsa class invariantni markazlashtiradi. Getter va setter’ni avtomatik public qilish private fieldni nomigagina yashiradi; consumer data representationga bog‘lanib qoladi.
Public surface kichik bo‘lsa API evolyutsiyasi oson. Bir marta tashqi kod tayanadigan protected hookni o‘zgartirish ham breaking change bo‘lishi mumkin. Framework qaysi extension point supported, qaysi a’zo internal ekanini aniq ko‘rsatadi.
Inheritance va override
Subclass override qiladigan method access’ni parent contractidan toraytira olmaydi, chunki parent type orqali chaqiruvchi undan foydalana olishi kerak. Ayrim tillar access’ni kengaytirishga ruxsat beradi. Private method polymorphic override qilinmasligi, subclassda ayni nomdagi boshqa method bo‘lishi mumkin.
Protected mutable field fragile base class yaratadi. Subclass parent invariantini chetlab o‘tadi. Private state va tor protected operation yaxshiroq. Composition tashqi collaboratorga faqat interface orqali access berib, inheritance couplingni kamaytiradi.
Xavfsizlik chegarasi
Reflection, serialization framework yoki native memory access private fieldni o‘qishi mumkin. Ayni process ichidagi zararli plugin modifierni himoya devori sifatida qabul qilmaydi. Sensitive operation server-side authorization va principal permission bilan tekshiriladi.
Private key source fieldi private bo‘lsa ham process dump yoki log orqali sizishi mumkin. Secret manager, process isolation va minimal privilege zarur. Access modifier developerga noto‘g‘ri bog‘lanishni compile time’da cheklaydi, threat actorni emas.
Testlash
Test private methodni to‘g‘ridan-to‘g‘ri chaqirish o‘rniga public behaviorni tekshiradi. Murakkab private logic alohida collaboratorga ajratilsa uning contracti mustaqil testlanadi. “Faqat test uchun public” API yuzasini ifloslantiradi. Friend test yoki internal visibility ishlatilsa production assembly va security ta’siri nazorat qilinadi.
API chegarasini saqlash
Modifier tanlovi kutubxonaning uzoq muddatli API shartnomasiga ta’sir qiladi. Ommaviy qilingan metoddan tashqi kod foydalanishni boshlagach, uning nomi yoki xatti-harakatini o‘zgartirish qiyinlashadi. Shu sabab sinf ichki tafsilotlari imkon qadar yopiq saqlanib, faqat barqaror operatsiyalar ochiladi. Test yozish uchun ichki a’zoni asossiz public qilish kapsulyatsiyani buzadi; paket darajasidagi test, dependency injection yoki xatti-harakatni tashqi interfeys orqali tekshirish ma’qul. Reflection kabi mexanizmlar texnik jihatdan yopiq a’zoga yetishi mumkin, ammo bu modifierning dizayn maqsadini bekor qilmaydi. Xavfsizlik nazorati esa faqat modifierga tayanmaydi, chunki jarayon ichidagi zararli kod ko‘proq imkoniyatga ega bo‘lishi mumkin.
Bog‘liq tushunchalar
Encapsulation, Visibility, Public API, Private member, Protected member, Inheritance, Module