Programmalıq támiynat qurılması hám evolyuciyası / 8-ameliy_PTQE
.pdf
8-ámeliy jumıs. Programmalıq támiynattı konstrukciyalaw principleri.
Jumıstıń maqseti: SOLID (Single Responsibility, Open/Closed, Liskov
Substitution, Interface Segregation, Dependency Inversion) principlerin ámeliyatta qollanıwdı úyreniw. C++ tilinde "jaman" (principlerge qarsı) kodtı analizlep, onı SOLID boyınsha refactoring etiw. Kodtıń keńeytiwsheńligin hám ońlawǵa qolaylılıǵın arttırıw.
Teoriyalıq bólim:
SRP: Bir klass - bir wazıypa.
OCP: Keńeytiwge ashıq, ózgertiwge jabıq.
LSP: Bala klass ata-ananıń ornın basa alıwı kerek.
ISP: Úlken interfeyslerdi bóliw.
DIP: Abstrakciyaǵa ǵárezli bolıw.
ÁMELIY BÓLIM:
SOLID principleriniń buzılıwın hám dúzetiliwin kóremiz.
1-mısal: SRP (Jalǵız Juwapkershilik)
Másele: `User` klassı hám maǵlıwmat saqlaydı, hám e-mail jiberedi.
Kod (Buzılǵan):
class User {
public:
string name;
void save() { /* Bazaǵa jazıw */ }
void sendEmail(string msg) { /* Email jiberiw */ }
};
Kod (Dúzetilgen):
class User {
public:
string name;
};
class UserRepository { // Baza menen islesiw public:
void save(User u) { ... }
};
class EmailService { // Email menen islesiw public:
void sendEmail(User u, string msg) { ... }
};
2-mısal: OCP (Ashıq/Jabıq)
Másele: Jańa figura qosılsa, `AreaCalculator` ózgeredi. Kod (Buzılǵan):
double area(object shape) {
if (shape is Circle) return ...;
if (shape is Rect) return ...; // Jańa figura ushın kodtı ózgertiw kerek
}
Kod (Dúzetilgen): class Shape { public:
virtual double area() = 0;
};
class Circle : public Shape { double area() override { ... }
};
// Endi area() funkciyası ózgermeydi, tek jańa klass qosıladı.
3-mısal: LSP (Liskov)
Másele: `Penguin` (Pingvin) `Bird` (Qus) klasınan miyras aladı, biraq usha almaydı.
Kod (Buzılǵan):
class Bird { virtual void fly() {} }; class Penguin : public Bird {
void fly() override { throw "Usha almayman!"; } // LSP buzıldı
};
Kod (Dúzetilgen): class Bird {};
class FlyingBird : public Bird { virtual void fly() {} }; class NonFlyingBird : public Bird {};
class Penguin : public NonFlyingBird {}; // Ushaw metodı joq
4-mısal: ISP (Interfeysti Ajıratıw)
Másele: `Worker` interfeysi `eat()` metodına iye, biraq `Robot` awqatlanbaydı. Kod (Buzılǵan):
interface IWorker {
void work(); void eat();
};
class Robot : IWorker { void work() { ... }
void eat() { /* Bos, biraq bolıwı shárt */ }
};
Kod (Dúzetilgen):
interface IWorkable { void work(); }; interface IFeedable { void eat(); };
class Robot : IWorkable { void work() { ... } }; // Eat joq
ÁMELIY TAPSÍRMALAR
1-tapsırma: SRP (Report).
`Report` klasın (`generate()`, `print()`, `saveToFile()`) 3 klassqa bóliń: `Report`,
`Printer`, `FileSaver`.
2-tapsırma: OCP (Logger).
`Logger` klassında `log(string type)` bar. Eger type="File", faylǵa jazadı, type="Console", ekranǵa.
Bunı abstrakt `ILogger` hám onıń miyrasxorları (`FileLogger`, `ConsoleLogger`) arqalı sheshiń.
3-tapsırma: DIP (Elektr).
`Switch` (Ajıratqısh) klassı `LightBulb` (Lampochka) klasına tikkeley baylanısqan.
`Switchable` (Jaǵılıwshı) interfeysin jaratıp, `Switch` ti oǵan ǵárezli etiń. Sonda `Switch` penen `Fan` (Samallatqısh) tı da jaǵıwǵa boladı.
4-tapsırma: LSP (Tórtmúyeshlik).
`Square` (Kvadrat) klasın `Rectangle` klasınan alıw durıs pa? (Kvadratta eni hám boyı birdey bolıwı kerek, al Rectangle da hár qıylı).
Bul máseleni analizleń hám durıs ierarxiya (ekewi de `Shape`-ten alıwı kerek) dúziń.
5-tapsırma: ISP (Smart Device).
`SmartDevice` interfeysi (`print`, `fax`, `scan`) bar.
`SimplePrinter` tek `print` ete aladı.
Interfeysti bóliń (`IPrinter`, `IFax`, `IScanner`) hám klasslarǵa durıs implementaciya beriń.
