Kapsülleme (kompyuter dasturlash) - Encapsulation (computer programming)

Yilda ob'ektga yo'naltirilgan dasturlash (OOP), kapsulalash ma'lumotlarni ushbu ma'lumotlarda ishlaydigan usullar bilan birlashtirish yoki ob'ektning ba'zi tarkibiy qismlariga to'g'ridan-to'g'ri kirishni cheklashni anglatadi.[1] Enkapsulyatsiya a tarkibidagi ma'lumotlar ob'ektining qiymatlarini yoki holatini yashirish uchun ishlatiladi sinf, ruxsatsiz shaxslarning ularga to'g'ridan-to'g'ri kirishining oldini olish. Odatda sinfda jamoat uchun ochiq usullar mavjud (shunday deb nomlangan) "getters" va "setters" ) qiymatlarga kirish uchun va boshqa mijoz sinflari ushbu usullarni ob'ekt ichidagi qiymatlarni olish va o'zgartirish uchun chaqirishadi.

Ushbu mexanizm faqat OOP uchun xos emas. Amalga oshirish mavhum ma'lumotlar turlari masalan, modullar, shunga o'xshash inkassatsiya shaklini taklif eting. O'xshashlik dasturlash tili nazariyotchilari tomonidan quyidagicha tushuntirilgan ekzistensial turlari.[2]

Ma'nosi

Yilda ob'ektga yo'naltirilgan dasturlash tillari, va boshqa tegishli sohalar, inkapsulyatsiya ikkita bog'liq, ammo aniq tushunchalardan biriga, ba'zan esa ularning kombinatsiyasiga ishora qiladi:[3][4]

  • Ba'zilariga to'g'ridan-to'g'ri kirishni cheklash uchun til mexanizmi ob'ekt komponentlari.[5][6]
  • Bilan ma'lumotlar to'plamini osonlashtiradigan til konstruktsiyasi usullari (yoki boshqa funktsiyalar) ushbu ma'lumotlar asosida ishlaydi.[1][7]

Ayrim dasturlash tillarini o'rganuvchilar va akademiklar birinchi ma'nolarni yolg'iz yoki ikkinchisiga qo'shib foydalanib, ajralib turadigan xususiyat sifatida ishlatishadi ob'ektga yo'naltirilgan dasturlash, ta'minlovchi ba'zi dasturlash tillari esa leksik yopilishlar inkapsulyatsiyani tilning o'ziga xos xususiyati sifatida ko'rish ortogonal ob'ektga yo'naltirishga.

Ikkinchi ta'rif, ob'ektga yo'naltirilgan ko'plab tillarda va boshqa tegishli sohalarda tarkibiy qismlar avtomatik ravishda yashirilmasligi va bu bekor qilinishi mumkinligi bilan bog'liq; shunday qilib, ma'lumotni yashirish ikkinchi ta'rifni afzal ko'rganlar tomonidan alohida tushuncha sifatida belgilanadi.

Inkapsulyatsiya xususiyatlari yordamida qo'llab-quvvatlanadi sinflar aksariyat ob'ektga yo'naltirilgan tillarda, ammo boshqa alternativalar ham mavjud.

Enkapsulyatsiya va meros

Mualliflari Dizayn naqshlari orasidagi ziddiyatni muhokama qiling meros olish va uzoq vaqt davomida inkapsulyatsiya qilish va o'zlarining tajribalarida dizaynerlar merosdan ortiqcha foydalanishni ta'kidlaydilar. Ularning ta'kidlashicha, meros ko'pincha subklassni ota-onasining amalga oshirish tafsilotlariga ta'sir qilishini hisobga olgan holda, meros ko'pincha kapsulani buzadi.[8] Tomonidan tasvirlanganidek yo-yo muammo, merosdan ortiqcha foydalanish va shuning uchun kapsulani tuzatish juda murakkab va qiyin bo'lishi mumkin.

Ma'lumotni yashirish

Inkapsulyatsiya "ma'lumotlar a'zolari va a'zo funktsiyalarini yashirish uchun ishlatilishi mumkin" degan ta'rifga ko'ra, an ning ichki vakili ob'ekt odatda ob'ekt ta'rifidan tashqarida yashiringan. Odatda, faqat ob'ektning o'ziga xos usullari uning maydonlarini bevosita tekshirishi yoki boshqarishi mumkin. Ob'ektning ichki qismini yashirish, foydalanuvchilarning tarkibiy qismlarining ichki ma'lumotlarini yaroqsiz yoki mos kelmaydigan holatga qo'yishiga yo'l qo'ymaslik orqali uning yaxlitligini himoya qiladi. Enkapsulyatsiyaning taxminiy foydasi shundaki, u tizimning murakkabligini kamaytirishi va shu bilan ko'payishi mumkin mustahkamlik, ishlab chiquvchiga dasturiy ta'minot komponentlari o'rtasidagi o'zaro bog'liqlikni cheklashga imkon berish orqali.[iqtibos kerak ]

Ba'zi tillar yoqadi Kichik munozarasi va Yoqut faqat ob'ekt usullari orqali kirishga ruxsat berish, lekin boshqalarning aksariyati (masalan, C ++, C #, Delphi yoki Java ) dasturchiga yashiringan narsalarni boshqarish darajasini, odatda kalit so'zlar orqali taklif eting jamoat va xususiy.[6] ISO C ++ standartiga tegishli himoyalangan, xususiy va jamoat kabi "kirish ko'rsatkichlari "va" hech qanday ma'lumotni yashirmasliklari "kerak. Ma'lumotni yashirish, sarlavha fayli orqali bog'langan manba kodining kompilyatsiya qilingan versiyasini taqdim etish orqali amalga oshiriladi.

Deyarli har doim bunday himoyani bekor qilishning bir usuli bor - odatda orqali aks ettirish API (Ruby, Java, C # va boshqalar), ba'zida shunga o'xshash mexanizm orqali mangling nomlari (Python ) yoki maxsus kalit so'zlardan foydalanish kabi do'stim C ++ da.

Misollar

Ma'lumotlar maydonlarini cheklash

Tillar yoqadi C ++, C #, Java, PHP, Tez va Delphi ma'lumotlar maydonlariga kirishni cheklash usullarini taklif eting.

Quyida misol keltirilgan C # a yordamida ma'lumotlar maydoniga kirishni qanday cheklash mumkinligini ko'rsatadigan xususiy kalit so'z:

sinf Dastur{    jamoat sinf Hisob qaydnomasi    {        xususiy o‘nli kasr hisob balansi = 500.00m;        jamoat o‘nli kasr CheckBalance()        {            qaytish bu.hisob balansi;        }    }    statik bekor Asosiy()    {        Hisob qaydnomasi mening hisobim = yangi Hisob qaydnomasi();        o‘nli kasr myBalance = mening hisobim.CheckBalance();        / * Ushbu asosiy usul balansni jamoatchilik orqali tekshirishi mumkin         * "Hisob" klassi tomonidan taqdim etilgan "CheckBalance" usuli          * lekin u "accountBalance" qiymatini o'zgartira olmaydi * /    }}

Quyida misol keltirilgan Java:

jamoat sinf Xodim {    xususiy BigDecimal ish haqi = yangi BigDecimal(50000.00);        jamoat BigDecimal ish haqi() {        qaytish bu.ish haqi;    }    jamoat statik bekor asosiy() {        Xodim e = yangi Xodim();        BigDecimal sal = e.ish haqi();    }}

Inkapsulyatsiya ob'ektiv bo'lmagan tillarda ham mumkin. Yilda C Masalan, tuzilma API-ning mijozlariga kira olmaydigan ma'lumotlar a'zolarini o'z ichiga olgan ma'lumotlar elementida ishlaydigan funktsiyalar to'plami uchun sarlavha fayli orqali umumiy API-da e'lon qilinishi mumkin. tashqi kalit so'z.[9][10]

// Sarlavha fayli "api.h"tuzilmaviy Tashkilot;          // Yashirin a'zolar bilan shaffof bo'lmagan tuzilish// "Entity" ob'ektlarida ishlaydigan API funktsiyalaritashqi tuzilmaviy Tashkilot *  ochiqlik(int id);tashqi int              jarayon_taddi(tuzilmaviy Tashkilot *ma'lumot);tashqi bekor             yaqinlik(tuzilmaviy Tashkilot *ma'lumot);// extern kalit so'zlari bu erda ortiqcha, ammo zarar qilmang.// extern joriy fayldan tashqarida chaqirilishi mumkin bo'lgan funktsiyalarni belgilaydi, hatto kalit so'zsiz ham odatiy xatti-harakatlar

Mijozlar API funktsiyalarini an ob'ektlarini ajratish, ishlash va ajratish uchun chaqirishadi shaffof bo'lmagan ma'lumotlar turi. Ushbu turdagi tarkib faqat API funktsiyalarini amalga oshirish uchun ma'lum va ularga kirish mumkin; mijozlar to'g'ridan-to'g'ri uning tarkibiga kira olmaydilar. Ushbu funktsiyalar uchun manba kodi tarkibning haqiqiy tarkibini belgilaydi:

// "api.c" amalga oshirish fayli# shu jumladan "api.h"tuzilmaviy Tashkilot {    int     ent_id;         // ID raqami    char    ent_name[20];   // Ism    ... va boshqa a'zolar ...};// API funktsiyasini amalga oshirishtuzilmaviy Tashkilot * ochiqlik(int id){ ... }int jarayon_taddi(tuzilmaviy Tashkilot *ma'lumot){ ... }bekor yaqinlik(tuzilmaviy Tashkilot *ma'lumot){ ... }

Mangling nomi

Quyida misol keltirilgan Python, bu o'zgaruvchan kirish cheklovlarini qo'llab-quvvatlamaydi. Shu bilan birga, konventsiya shuni anglatadiki, nomi pastki chiziq bilan qo'shilgan o'zgaruvchini shaxsiy deb hisoblash kerak.[11]

sinf Avtomobil:     def sherzod(o'zini o'zi) -> Yo'q:        o'zini o'zi._maxspeed = 200     def haydash(o'zini o'zi) -> Yo'q:        chop etish(f"Maksimal tezlik {self._maxspeed}.") redcar = Avtomobil()redcar.haydash()  # Bu "Maksimal tezlik - 200" ni chiqaradi.redcar._maxspeed = 10redcar.haydash()  # Bu "Maksimal tezlik - 10" ni chiqaradi.

Shuningdek qarang

Adabiyotlar

  1. ^ a b Rojers, Vm. Pol (2001 yil 18-may). "Enkapsulyatsiya ma'lumotni yashirmaydi". JavaWorld. Olingan 2020-07-20.
  2. ^ Pirs 2002 yil, § 24.2 Mavjud ma'lumotlar bilan ma'lumot olish
  3. ^ Skott, Maykl Li (2006). Dasturlash tili pragmatikasi (2 nashr). Morgan Kaufmann. p. 481. ISBN  978-0-12-633951-2. Inkapsulyatsiya mexanizmlari dasturchiga ma'lumotlarni va ular ustida ishlaydigan subroutinalarni bir joyda birlashtirishga imkon beradi va abstraktsiya foydalanuvchilaridan ahamiyatsiz ma'lumotlarni yashiradi.
  4. ^ Deyl, Nell B.; Weems, Chip (2007). Java bilan dasturlash va muammolarni hal qilish (2-nashr). Jons va Bartlett. p. 396. ISBN  978-0-7637-3402-2.
  5. ^ Mitchell, Jon C. (2003). Dasturlash tillaridagi tushunchalar. Kembrij universiteti matbuoti. p. 522. ISBN  978-0-521-78098-8.
  6. ^ a b Pirs, Benjamin (2002). Dasturlash turlari va turlari. MIT Press. p. 266. ISBN  978-0-262-16209-8.CS1 maint: ref = harv (havola)
  7. ^ Konnoli, Tomas M.; Begg, Kerolin E. (2005). "Ch. 25: Ob'ekt DMBS-ga kirish § Ob'ektga yo'naltirilgan tushunchalar". Ma'lumotlar bazalari tizimlari: loyihalashtirish, amalga oshirish va boshqarish uchun amaliy yondashuv (4-nashr). Pearson ta'limi. p. 814. ISBN  978-0-321-21025-8.
  8. ^ Gamma, Erix; Helm, Richard; Jonson, Ralf; Vlissidlar, Jon (1994). Dizayn naqshlari. Addison-Uesli. ISBN  978-0-201-63361-0.
  9. ^ King, K. N. (2008). C dasturlash: zamonaviy yondashuv (PDF) (2-nashr). W. W. Norton & Company. p. 464. ISBN  978-0393979503. Olingan 1 noyabr 2019.
  10. ^ Qirol, Kim N. C dasturlash: zamonaviy yondashuv. WW Norton & Company, 2008. Ch. 18, p. 464, ISBN  0393979504
  11. ^ Bader, Dan. "Pythonda pastki chiziqlarning ma'nosi". Python mahoratini oshiring. Olingan 1 noyabr 2019.