public interface BearKeeper {
void washTheBear();
void feedTheBear();
void petTheBear();
}
Hayvonot bog'larining qo'riqchilari sifatida biz sevimli ayiqlarni yuvish va boqishdan mamnunmiz. Ammo biz ularni erkalatish xavfini juda yaxshi bilamiz. Afsuski, bizning interfeysimiz juda katta va ayiqni boqish uchun kodni amalga oshirishdan boshqa ilojimiz yo'q.
Buni katta interfeysimizni uchta alohida interfeysga bo'lish orqali tuzatamiz:
public interface BearCleaner {
void washTheBear();
}
public interface BearFeeder {
void feedTheBear();
}
public interface BearPetter {
void petTheBear();
}
Endi, interfeyslarni ajratish tufayli biz faqat o'zimiz uchun muhim bo'lgan usullarni amalga oshiramiz:
public class BearCarer implements BearCleaner, BearFeeder {
public void washTheBear() {
//I think we missed a spot...
} public void feedTheBear() {
//Tuna Tuesdays... }
}
Va nihoyat, xavfli narsalarni beparvo odamlarga topshirishimiz mumkin:
public class CrazyPerson implements BearPetter {
public void petTheBear() {
//Good luck with that!
}
}
Oldinga boradigan bo'lsak, xuddi shu tarzda interfeys ajratishidan foydalanish uchun BookPrinter sinfimizni avvalgi misolimizdan ajratishimiz mumkin. Printer interfeysini bitta bosib chiqarish usuli bilan amalga oshirish orqali biz alohida ConsoleBookPrinter va OtherMediaBookPrinter sinflarini yaratamiz.
Qaramlik inversiyasi
Qaramlik inversiyasining printsipi dasturiy ta'minot modullarini ajratib olishni anglatadi. Shunday qilib, past darajadagi modullarga bog'liq bo'lgan yuqori darajadagi modullar o'rniga, ikkalasi ham abstraktsiyalarga bog'liq bo'ladi.
Buni namoyish etish uchun keling, eski maktabga boramiz va kodi bo'lgan Windows 98 kompyuterini hayotga tatbiq etamiz:
Ammo monitor va klaviaturasiz kompyuterdan nima foyda? Keling, har birimiz yaratgan har bir Windows98Compyuter Monitor va StandardKeyboard bilan to'ldirilgan bo'lishi uchun konstruktorimizga bittadan qo'shaylik:
public class Windows98Machine {
private final StandardKeyboard keyboard;
private final Monitor monitor;
public Windows98Machine() {
monitor = new Monitor();
keyboard = new StandardKeyboard();
}
}
Ushbu kod ishlaydi va biz Windows98Computer sinfimizda StandardKeyboard va Monitor-dan erkin foydalana olamiz.
Muammo hal qilindimi? Yo'q. StandardKeyboard va Monitor-ni yangi kalit so'z bilan e'lon qilish orqali biz ushbu uchta sinfni birlashtirdik.
Bu nafaqat bizning Windows98Compyuterimizni sinovdan o'tkazishni qiyinlashtiradi, balki zarurat tug'ilganda biz StandardKeyboard sinfini boshqasi bilan almashtirish imkoniyatidan mahrum bo'ldik. Va biz Monitor sinfimiz bilan ham bog'lanib qoldik.
Klaviatura interfeysini yanada kengroq qo'shib, buni sinfimizda ishlatib, mashinamizni StandardKeyboard-dan ajratib olaylik:
public interface Keyboard { }
public class Windows98Machine{
private final Keyboard keyboard;
private final Monitor monitor;
public Windows98Machine(Keyboard keyboard, Monitor monitor) {
this.keyboard = keyboard;
this.monitor = monitor;
}
}
Bu erda biz Windows98Machine sinfiga Klaviatura qaramligini qo'shishni osonlashtirish uchun qaramlikni in'ektsiya usulidan foydalanmoqdamiz.
Klaviatura interfeysini Windows98Machine sinfiga kiritish uchun mos keladigan tarzda amalga oshirish uchun StandardKeyboard sinfimizni o'zgartiramiz:
Endi bizning darslarimiz bir-biridan ajratilgan va Klaviatura abstraktsiyasi orqali aloqa qilishadi. Agar xohlasak, biz interfeysni boshqacha tatbiq etish bilan mashinamizdagi klaviatura turini osongina o'chirib qo'yishimiz mumkin. Biz Monitor klassi uchun xuddi shu printsipga amal qilishimiz mumkin.
Zo'r! Biz bog'liqliklarni ajratib oldik va Windows98Machine-ni qaysi sinov doirasi tanlaganimiz bilan sinab ko'rishimiz mumkin.
Xulosa:
Ushbu maqolada biz ob'ektga yo'naltirilgan dizaynning SOLID tamoyillariga chuqur sho'ng'ib chiqdik.
Biz SOLID tarixining tezkor qismidan va ushbu printsiplarning mavjud bo'lish sabablaridan boshladik.
Harflar bilan xat, biz har bir printsipning ma'nosini tezkor kod namunasi bilan buzdik. Keyin biz kodimizni qanday tuzatishni va uni SOLID tamoyillariga rioya qilishni ko'rdik.
Do'stlaringiz bilan baham: |