S.O.L.I.D tamoyillari rasmlarda
Agar siz Object-Oriented Programming(OOP)dan habaringiz bo’lsa, ehtimol siz SOLID tamoyillari haqida ham eshitgan bo’lishingiz kerak.
Bu besh tamoyillar Robert C. Martin tomonidan ommaga tanitiladi va ular dasturni ishlab chiqishda qo’llanilishi kerak bo’lgan ko’rsatmalarni o’z ichiga olib, bu orqali dasturni kengaytirish va uning kodlarini saqlash ancha osonlashadi.
Internetda SOLID haqida juda ko’p ajoyib maqolalar bor, lekin men rasmli misollarni juda ham kam ko’rdim. Bu kabi mavzular menga o’xshagan vizual o’rganuvchilarga o’rganish jarayonini biroz qiyinlashtiradi.
Maqolaning asosiy maqsadi — bu printsiplarni illyustratsiyalar yordamida yaxshiroq tushuntirish va har bir tamoyilning asl vazifasini to’liqligicha o’rganish.
O’zingiz ko’rib turganingizdek, bu printsiplarning ba’zilari o’xshash bo’lishi mumkin, lekin ular bir maqsadga mo’ljallanmagan. Bir tamoyildan boshqasini buzgan holda foydalanish mumkin, garchi ular o’xshash bo’lsada.
Bu qo’llanmani yanada osonroq tushuntirish uchun maqola davomida «Klass» so’zini ko’proq ishlataman, lekin shuni esda tutingki, uning o’rniga xuddi shu vazifani Funksiya, Metod yoki Module ham bajara olishi mumkin.
Qani endi boshladik!
SOLID Tamoyili
S — Single Responsibility
Klass faqat bitta mas’uliyatga ega bo’lishi kerak.
Agar klassning bittadan ko’p mas’uliyati bo’lsa, bu xatolik uchrashining ehtimolini oshiradi, chunki uning vazifalaridan biriga o’zgartirish kiritish, boshqalarning ishlashiga ta’sir etishi mumkin.
Maqsad
Bu tamoyil vazifalarni qismlarga ajratishga qaratilgan bo’lib agar biror bir xatolik sizning dastur kodingizga kiritgan o’zgartirishingiz oqibatida uchrasa, u boshqa ajratilgan vazifalarga ta’sir etmaydi.
O — Open-Closed
Klasslar qo’shimchalar qo’shish uchun ochiq, lekin o’zgartirish kiritish uchun yopiq bo’lishi kerak.
Klass vazifalarini o’zgartirish klassdan foydalanadigan barcha tizimlarga ta’sir etadi.
Agar siz Klassni ko’proq funksiyalarni bajarishini xohlasangiz, unda bunga ideal yondashuv — mavjud funksiyalarni o’zgartirish emas, aksincha yangilarini avvalgilari yoniga qo’shishingiz kerak.
Maqsad
Bu tamoyilning maqsadi Klassning imkoniyatlariga o’zgartirish kiritmagan holda kengaytirish. Bu printsip klass qayerda ishlatilishidan qat’iy nazar xatoliklarni oldini olish uchun ishlab chiqilgan.
L — Liskov Substitution
Agar S — T ning tipi bo’lsa, u holda dasturning T tipidagi obyektlarini, xuddi shu dasturning kerakli xususiyatlarini o’zgartirmagan holda S tipidagi obyektlar bilan o’rin almashtirib qo’yilishi mumkin.
Agar bola klass ota klass kabi bir xil harakatlarni bajara olmasa, bu ba’zibir xatoliklarni keltirib chiqarishi mumkin.
Deylik siz biror bir klass orqali boshqa bir klassni yaratsangiz bunda avvalgi klass ota, undan yaralgani esa bola klass bo’ladi. Bola klass ota qila oladigan barcha narsani qila olishi kerak. Bu jarayon Inheritance deyiladi.
Bola klassi bir xil so’rovlarni bajarishi va ota klassi bilan bir xil natijani berishi kerak.
Rasmda ota klassi qahva yetkazib berilishi ko’rsatilgan (har qanday qahva bo’lishi mumkin). Shu ko’rinishda bola ham Cappucino yetkazib berishi normal holat, chunki u o’ziga xos qahva turidir, lekin suv yetkazib berishi umuman notog’ri.
Agar bola klassi yuqoridagi talablarga javob bermasa, demak, klass butunlay o’zgartirilgan bo’ladi va bu L(Liskov Substitution) ****tamoyiliga zid keladi.
Maqsad
Bu printsip izchillikni ta’minlashga qaratilgan bo’lib ota klass yoki uning bolasi hech qanday muommolarsiz bir yo’lda ishlatilishi ta’minlanadi.
I — Interface Segregation
Klientlar o’zlari ishlatmaydigan metodlarga muhtoj bo’lmasliklari kerak.
Agar klass foydali bo’lmagan vazifalarni bajarishi kerak bo’lsa, u behudaga ishlatiladi va agar klassda bu harakatlarni bajarish imkoniyati umuman bo’lmasa unda kutilmagan xatoliklar paydo bo’lishi mumkin.
Klass o’z rolini bajarishi uchun zarur bo’lgan harakatlarni bajarishi kerak. Agar klass funksiyasi keyinchalik boshqa bir klass tomonidan bajariladigan bo’lsa unda bu funksiyani mavjud klassdan umuman talab qilmaslik kerak.
Maqsad
Bu tamoyil bir qator harakatlar majmuini kichikroq bo’laklarga bo’lishni maqsad qiladi, shunda klass faqat kerakli harakatlarnigina bajaradi.
D — Dependency Inversion
— Yuqori darajali modullar quyi darajali modullarga bog’liq bo’lmasliklari kerak. Ikkalasi ham asbtraction ga bog’liq bo’lishi lozim.
— Abstraction detallarga bog’liq bo’lmasligi kerak. Detallar abstraction ga bog’liq bo’lishi lozim.
Birinchi navbatta keling yuqoridagi atamalarni o’rganib chiqamiz.
Yuqori Darajali Modul(yoki Klass): biror bir harakatni vosita orqali bajaruvchi klass.
Quyi Darajali Modul(yoki Klass): harakatni bajaruvchi vosita.
Abstraction: ikki klassni bir biriga bog’lovchi interface.
Detallar: vositani qay tarzda ishlashi.
Bu printsipga ko’ra, klass harakatni bajarish uchun ishlatadigan vosita bilan birlashib bir obyekt ko’rinishiga kelmasligi kerak. Aksincha, u vosita klassga bog’lanish imkonini beradigan interfeysga ulangan bo’lishi lozim.
Bundan tashqari, klass ham, interfeys ham vositaning qanday ishlashini bilmasligi kerakligi aytiladi. Biroq, vosita interfeys spetsifikatsiyasiga javob berishi kerak.
Maqsad
Bu tamoyil interfeys yaratish orqali yuqori darajadagi klassning quyi darajadagi klassga bog’liqligini kamaytirishga qaratilgan.
Xulosa
Hozircha biz ushbu beshta tamoyilni boshlang’ich darajada ko’rdik va ularning maqsadlarini o’rganib chiqdik. Ular sizning kodingizni o’zgartirish, kengaytirish va testdan o’tkazish jarayonlari yengillashtirishda yordam beradi.
Agar sizda biron bir savol yoki taklif bo’lsa, quyida comment qoldirishingiz mumkin.
Manba:
Algoritm
S.O.L.I.D tamoyillari rasmlarda