Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Ko'pincha men SOLID tamoyillari haqida eshitmagan ishlab chiquvchilarni uchrataman (biz bu yerda ular haqida batafsil gapirib berdi. β€” Transl.) yoki ob'ektga yo'naltirilgan dasturlash (OOP) yoki ular haqida eshitgan, lekin amalda foydalanmang. Ushbu maqolada ishlab chiquvchiga kundalik ishida yordam beradigan OOP tamoyillarining afzalliklari tasvirlangan. Ulardan ba'zilari yaxshi ma'lum, boshqalari unchalik ko'p emas, shuning uchun maqola yangi boshlanuvchilar uchun ham, tajribali dasturchilar uchun ham foydali bo'ladi.

Sizga eslatib o'tamiz: barcha Habr o'quvchilari uchun - Habr reklama kodidan foydalangan holda har qanday Skillbox kursiga yozilishda 10 000 rubl chegirma.

Skillbox tavsiya qiladi: Ta'lim onlayn kurs "Java dasturchisi".

QURUQ (O'zingizni takrorlamang)

Juda oddiy printsip, uning mohiyati nomidan aniq: "O'zingizni takrorlamang". Dasturchi uchun bu ikki nusxadagi koddan qochish zarurligini, shuningdek, o'z ishida abstraksiyadan foydalanish imkoniyatini anglatadi.

Agar kodda ikkita takrorlanuvchi bo'lim mavjud bo'lsa, ularni bitta usulda birlashtirish kerak. Agar qattiq kodlangan qiymat bir necha marta ishlatilsa, uni umumiy doimiyga aylantirishga arziydi.

Bu kodni soddalashtirish va uni saqlashni osonlashtirish uchun zarur, bu OOP ning asosiy maqsadi hisoblanadi. Siz ham ittifoqdan ortiqcha foydalanmasligingiz kerak, chunki bir xil kod ham OrderId, ham SSN bilan tekshirishdan o'tmaydi.

O'zgarishlarni qamrab olish

Aksariyat kompaniyalarning dasturiy mahsulotlari doimiy ravishda rivojlanib boradi. Bu kodga o'zgartirishlar kiritish kerakligini anglatadi, uni qo'llab-quvvatlash kerak. Inkapsulyatsiya yordamida hayotingizni osonlashtirasiz. Bu sizga mavjud kod bazasini yanada samaraliroq tekshirish va saqlash imkonini beradi. Mana bir misol.

Agar siz Java-da yozsangiz, unda sukut bo'yicha shaxsiy usullar va o'zgaruvchilarni tayinlash.

Ochiq/yopiq printsip

Ushbu tamoyilni quyidagi bayonotni o'qish orqali osongina eslab qolish mumkin: "Dasturiy ta'minot ob'ektlari (sinflar, modullar, funktsiyalar va boshqalar) kengaytirish uchun ochiq, lekin o'zgartirish uchun yopiq bo'lishi kerak". Amalda, bu ularning xatti-harakatlarini manba kodini o'zgartirmasdan o'zgartirishga ruxsat berishini anglatadi.

Printsip dastlabki kodga o'zgartirishlar kodni qayta ko'rib chiqish, birlik testi va boshqa protseduralarni talab qilganda muhimdir. Ochiq/yopiq printsipga amal qiladigan kod kengaytirilganda o'zgarmaydi, shuning uchun u bilan bog'liq muammolar juda kam.

Mana bu tamoyilni buzadigan kod misoli.

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Agar siz undagi biror narsani o'zgartirishingiz kerak bo'lsa, bu juda ko'p vaqtni oladi, chunki kodning kerakli bo'lak bilan bog'langan barcha bo'limlarini o'zgartirish kerak bo'ladi.

Aytgancha, ochiqlik-yopiqlik SOLID tamoyillaridan biridir.

Yagona javobgarlik printsipi (SRP)

SOLID to'plamidan yana bir tamoyil. Unda aytilishicha, "sinf o'zgarishiga sabab bo'lgan birgina sabab bor". Sinf faqat bitta muammoni hal qiladi. U bir nechta usullarga ega bo'lishi mumkin, ammo ularning har biri faqat umumiy muammoni hal qilish uchun ishlatiladi. Barcha usullar va xususiyatlar faqat bunga xizmat qilishi kerak.

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Ushbu printsipning ahamiyati shundaki, u individual dasturiy ta'minot komponenti va kod o'rtasidagi bog'lanishni yumshatadi. Agar siz sinfga bir nechta funksiyalarni qo'shsangiz, u ikkita funktsiya o'rtasidagi munosabatni kiritadi. Shunday qilib, agar siz ulardan birini o'zgartirsangiz, birinchisiga bog'liq bo'lgan ikkinchisini buzish ehtimoli katta. Va bu barcha muammolarni oldindan aniqlash uchun sinov davrlarini ko'paytirishni anglatadi.

Bog'liqlik inversiyasi printsipi (DIP)

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Yuqorida AppManager EventLogWriter-ga bog'liq bo'lgan kod misoli keltirilgan, bu esa o'z navbatida AppManager bilan chambarchas bog'langan. Agar sizga bildirishnomani ko'rsatishning boshqa usuli kerak bo'lsa, u push, SMS yoki elektron pochta bo'lsin, AppManager sinfini o'zgartirishingiz kerak.

Muammoni DIP yordamida hal qilish mumkin. Shunday qilib, AppManager o'rniga biz EventLogWriter-ni so'raymiz, u ramka yordamida kiritiladi.

DIP bog'liqlik modulini o'zgartirish orqali alohida modullarni boshqalar bilan osongina almashtirish imkonini beradi. Bu bitta modulni boshqalarga ta'sir qilmasdan o'zgartirish imkonini beradi.

Meros o'rniga kompozitsiya

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillariKodni qayta ishlatishning ikkita asosiy usuli mavjud: meros va tarkib, ikkalasining ham o'ziga xos afzalliklari va kamchiliklari bor. Odatda ikkinchisiga afzallik beriladi, chunki u yanada moslashuvchan.

Tarkibi ish vaqtida sinfning xususiyatlarini o'rnatish orqali uning harakatini o'zgartirish imkoniyatini beradi. Interfeyslarni amalga oshirishda polimorfizm qo'llaniladi, bu esa yanada moslashuvchan amalga oshirish imkonini beradi.

Hatto Joshua Blochning Effektiv Java dasturi merosdan ko'ra kompozitsiyani tanlashni maslahat beradi.

Barbara Liskovni almashtirish printsipi (LSP)

SOLID asboblar to'plamidan yana bir tamoyil. Unda aytilishicha, subtiplar supertip o'rnini bosishi kerak. Ya'ni, superklass bilan ishlaydigan usullar va funktsiyalar uning kichik sinflari bilan muammosiz ishlashi kerak.

LSP ham yagona mas'uliyat printsipi, ham umumiy javobgarlik printsipi bilan bog'liq. Agar sinf pastki sinfga qaraganda ko'proq funksionallikni ta'minlasa, ikkinchisi ushbu printsipni buzgan holda ba'zi funktsiyalarni qo'llab-quvvatlamaydi.

Bu erda LSP ga zid bo'lgan kod parchasi.

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Maydon(To'rtburchak r) usuli to'rtburchakning maydonini hisoblab chiqadi. Kvadrat bajarilgandan so'ng dastur ishlamay qoladi, chunki bu erda kvadrat to'rtburchak emas. LSP printsipiga ko'ra, asosiy sinflarga havolalardan foydalanadigan funktsiyalar qo'shimcha ko'rsatmalarsiz olingan sinflar ob'ektlaridan foydalanish imkoniyatiga ega bo'lishi kerak.

Kichik tipning o'ziga xos ta'rifi bo'lgan ushbu tamoyil Barbara Liskov tomonidan 1987 yilda "Ma'lumotlarning abstraktsiyasi va ierarxiyasi" deb nomlangan konferentsiyaning asosiy ma'ruzasida taklif qilingan, shuning uchun uning nomi.

Interfeysni ajratish printsipi (ISP)

Yana bir SOLID printsipi. Unga ko'ra, ishlatilmaydigan interfeys amalga oshirilmasligi kerak. Ushbu printsipga rioya qilish tizimning moslashuvchan bo'lib qolishiga yordam beradi va operatsion mantiqqa o'zgartirishlar kiritilganda refaktoringga mos keladi.

Ko'pincha, bu holat interfeys bir vaqtning o'zida bir nechta funktsiyalarni o'z ichiga olganida yuzaga keladi va mijoz ulardan faqat bittasini talab qiladi.

Interfeys yozish qiyin ish bo'lganligi sababli, ish tugagandan so'ng uni hech narsani buzmasdan o'zgartirish qiyin bo'ladi.

Java-da ISP printsipining afzalligi shundaki, barcha usullar birinchi navbatda amalga oshirilishi kerak va shundan keyingina ular sinflar tomonidan qo'llanilishi mumkin. Shuning uchun printsip usullar sonini kamaytirishga imkon beradi.

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Amalga oshirish uchun emas, balki interfeys uchun dasturlash

Bu erda hamma narsa sarlavhadan aniq. Ushbu tamoyilni qo'llash interfeysning har qanday yangi ilovasi bilan ishlay oladigan moslashuvchan kodni yaratishga olib keladi.

O'zgaruvchilar, qaytarish turlari yoki usul argument turi uchun interfeys turidan foydalanishingiz kerak. Misol subClass o'rniga SuperClassdan foydalanishdir.

Ya'ni:

Ro'yxat raqamlari = getNumbers();

Lekin emas:

ArrayList raqamlari = getNumbers();

Mana, yuqorida muhokama qilingan narsaning amaliy amalga oshirilishi.

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Delegatsiya printsipi

Umumiy misol Java-dagi equals() va hashCode() usullari. Ikki ob'ektni solishtirish zarur bo'lganda, bu harakat mijozning o'rniga mos keladigan sinfga topshiriladi.

Printsipning afzalligi shundaki, kodning takrorlanishi yo'q va xatti-harakatni o'zgartirish nisbatan oddiy. Bu tadbir delegatsiyasiga ham tegishli.

Har bir dasturchi bilishi kerak bo'lgan 10 ta ob'ektga yo'naltirilgan dasturlash tamoyillari

Bu tamoyillarning barchasi sizga yuqori uyg'unlik va past ulanish bilan yanada moslashuvchan, chiroyli va ishonchli kod yozish imkonini beradi. Albatta, nazariya yaxshi, lekin ishlab chiquvchi olingan bilimlardan haqiqatda foydalanishi uchun amaliyot kerak. OOP tamoyillarini o'zlashtirganingizdan so'ng, keyingi qadamingiz dasturiy ta'minotni ishlab chiqishda keng tarqalgan muammolarni hal qilish uchun dizayn naqshlarini o'rganish bo'lishi mumkin.

Skillbox tavsiya qiladi:

Manba: www.habr.com

a Izoh qo'shish