SOLID Printsiplari (I-qism)

SOLID Printsiplari (I-qism)

SOLID Printsiplari (I-qism)

SOLID printsiplari, Obyektga Yo’naltirilgan Dasturlashda ishlatilinadigan asosiy dizayn tamoyillaridan biridir. SOLID so’zi u qamrab olgan beshta printsiplarni bosh harflaridan tashkil topgan:

1. Single Responsibility Principle (Yagona Javobgarlik Printsipi);

2. Open-Closed Principle (Ochiqlik-Yopiqlik Printsipi);

3. Liskov Substitution Principle (Liskovning Almashinuv Printsipi);

4. Interface Segregation Principle (Interfeysni Ajratish Printsipi);

5. Dependency Inversion (Qaramlikni Qaytarish).

Yagona Javobgarlik Printsipi

Bu printsipning ikki hil izohi mavjud:

1. Klassning zimmasiga faqat bitta majburiyat yuklanilishi lozim;

2. Klassga faqat bir turdagi obyekt o’zgartirish kirita oladi;

Arxitekturani shu tarzda qurishning foydali tomoni shundaki, biz klasslar orasidagi bog’liqlikni kamaytiramiz va bir klassga kiritgan o’zgarishimiz boshqasiga ta’sir qilmaydi.

Quyidagi misolda bu printsipga izoh berishga harakat qilaman:

class Cook {
    public funtion prepareIngridients();
    public funtion cut();
    public funtion fry();
    public funtion getOrder();
    public funtion serveDish();
};

Etibor bergan bo’lsangiz, bizning klassimiz ikki xil jism bilan ishlayabti — bu taom va mijoz. Agarda, biz bu jismlarning biriga bog’liq logikani o’zgartirsak, bu ikkinchi jismga ham ta’sir qiladi, chunki ular bir klass ichida turibdi. Bunday holatlarda Yagona Javobgarlik Printsipi bizga as qotadi. Unga asoslanib, klassimizni faqat bir xil turdagi majburiyatga ega klasslarga ajratamiz.

class Cook {
 public funtion prepareIngridients();
    public funtion cut();
    public funtion fry();
}
class Waiter {
    public funtion getOrder();
    public funtion serveDish();
}

Endilikda, obyektlarning bir biriga bog’liqligi kamaydi va klasslar ancha tushunarli ko’rinish oldi.

Ochiqlik-Yopiqlik Printsipi

Bu printsipga asosan: ‘Dastur komponentlari (klasslar, funksiyalar v.k.) kengayish uchun ochiq va modifikatsiya uchun yopiq bo’lishlari kerak. Yani, biz klasslarning ishlash yo’lini, ularni tashkil qiluvchi kodga teginmasdan, o’zgartira olishimiz lozim.

Testdan o’tkazilgan va ishlatilishga vakolatli deb hisoblanuvchi klasslarga o’zgartirish kiritish yomon odat deb hisoblanadi, chunki u kelajakda kutilmagan xatolarga olib kelishi mumkin.

Quyidagi misolda, AreaCalculator klassining calculateArea() funksiyasi unga uzatilgan shakllarning yuzini hisoblaydi.

class AreaCalculator {
 public funtion calculateArea($shape) {
          switch (get_class($shape)) {
           case 'Square' : {
               return pow($shape->a, 2);
               break;
           }
           case 'Circle' : {
               return pow($shape->radius, 2) * 3.14;
               break;
           }
           ....
          }
 }
}
class Square() {...}
class Circle() {...}
$square = new Square();
$circle = new Circle();
$areaCalculator = new AreaCalculator;
echo $areaCalculator->calculateArea($circle);

Bu dasturning zaif tomoni shundaki, agar biz unga yangi shakl kiritishni va shaklning yuzini topishni istasak, biz calculateArea() funksiyani ham o’zgartirishimiz, ya’ni unga yangi shart qo’shishimiz kerak boladi. Demak AreaCalculator klassi Ochiqlik-Yopiqlk Printsipiga amal qilmaydi.

Buni to’girlashning bir yo’li — yuzani hisoblovchi funksiyani har bir shakl klassi uchun individual tarzda belgilab chiqishdir.

class Square() {
 private $a = 5; //test uchun
 public function getArea()
 {
     return pow($this->a, 2);
 }
}
class Circle() {
 private $radius = 4; //test uchun
 public function getArea()
 {
     return pow($this->radius, 2) * 3.14;
 }
}
$square = new Square();
$square->getArea();

Shunday qilib, biz dasturimizga istalgancha yangi klass va funksiyalar qo’shishimiz mumkin va bu mavjud klasslarga ta’sir o’tkazmaydi.

Umumiy Dasturlash
SOLID Printsiplari (I-qism)