Programmalıq támiynat qurılması hám evolyuciyası / 7-ameliy_PTQE
.pdf
7-ámeliy jumıs. Programmalıq támiynat konstrukciyalawda ózgerislerdi kútiw.
Jumıstıń maqseti: Programmalıq támiynatta "Ózgerislerdi kútiw" (Anticipating Change) principin úyreniw. Kodtı sonday etip jazıw kerek, keleshekte talaplar ózgerse, kodtıń minimal bólegin ózgertiw jetkilikli bolsın. "Loose Coupling" (Hálsiz baylanıs) hám "High Cohesion" (Joqarı birlik) principlerin ámeliyatta qollanıw. Konfiguraciya fayllarınan paydalanıw.
Teoriyalıq bólim:
Kod "qatıp qalǵan" (Hardcoded) bolmawı kerek.
YAGNI (Kerek emesti qospa) hám "Future-proof" (Keleshekke tayın) arasındaǵı balans.
*Usıllar:
1.Konstantalar: Sanlardı kod ishine jazbaw.
2.Interfeysler: Anıq klasslarǵa emes, abstrakciyalarǵa súyeniw.
3.Konfiguraciya: Parametrlerdi faylǵa shıǵarıw.
ÁMELIY BÓLIM:
Kodtı ózgerislerge beyimleymiz.
1-mısal: Hardcoded vs Constants
Másele: Salıq stavkası búgin 12%, erteń 15% bolıwı múmkin.
Kod (Jaman):
double calculateTax(double salary) { return salary * 0.12; // 12% qattı jazılǵan
}
// Ózgerse, kodtı qayta kompilyaciya etiw kerek.
Kod (Jaqsı):
// config.h
const double TAX_RATE = 0.12;
//main.cpp #include "config.h"
double calculateTax(double salary) { return salary * TAX_RATE;
}
//Tek config.h ózgeredi.
2-mısal: Enum (Túrlerdi basqarıw)
Másele: Paydalanıwshı túrleri ("Admin", "User", "Guest") ózgeriwi múmkin.
Kod (Jaman):
if (type == 1) { ... } else if (type == 2) { ... }
// 1 hám 2 neni bildiredi?
Kod (Jaqsı):
enum UserType { ADMIN, USER, GUEST }; if (type == ADMIN) { ... }
// Jańa túr qosılsa, enum-ǵa qosamız.
3-mısal: Interfeysler (Dependency Injection)
Másele: Búgin biz maǵlıwmatlardı konsolǵa shıǵaramız, erteń faylǵa, arǵıkúni printerge.
Kod (Jaman): class Report { public:
void print() {
cout << "Report..." << endl; // Tek konsol
}
};
Kod (Jaqsı):
// Interfeys class IOutput { public:
virtual void write(string msg) = 0;
};
class ConsoleOutput : public IOutput { public:
void write(string msg) override { cout << msg << endl; }
};
class Report {
IOutput* out; // Interfeyske ǵárezli public:
Report(IOutput* o) : out(o) {}
void print() { out->write("Report..."); }
};
// Endi biz Report kodın ózgertpey, oǵan FileOutput bere alamız.
4-mısal: Konfiguraciya faylı (Simulyaciya)
Másele: Programma parametrlerin (Til, Téma) kodtı ózgertpey almastırıw.
Kod:
#include <fstream>
//config.txt:
//LANGUAGE=EN
//THEME=DARK
void loadConfig() { ifstream file("config.txt"); string param;
while (file >> param) {
if (param == "LANGUAGE=EN") setLanguage("English");
// ...
}
}
Analiz: Paydalanıwshı bloknot arqalı programmanı sazlay aladı.
ÁMELIY TAPSÍRMALAR
1-tapsırma: Valyuta konverteri.
`convert(amount, "USD")` funkciyasın jazıń.
Valyuta kursların (`USD=12500`, `EUR=13500`) kodtıń ishine emes, bólek `map<string, double>` strukturasına jaylastırıń. Kurs ózgerse, tek map jańalanadı.
2-tapsırma: Log faylı.
`Logger` klasın jazıń. Ol loglardı faylǵa jazıwı kerek.
Fayl atı (`"log.txt"`) konstruktor arqalı berilsin. Default mánis qollanbań, sebebi fayl atı ózgeriwi múmkin.
3-tapsırma: Sortlaw strategiyası.
`Sorter` klasın jazıń. Oǵan `sort(vector<int>)` metodın qosıń.
Konstruktor arqalı "Ósiw" yamasa "Kemeyiw" strategiyasın (funkciya kórsetkishin) qabıllasın.
Sortlaw tártibi ózgerse, `Sorter` klasın ózgertiw kerek bolmasın.
4-tapsırma: UI Xabarları.
Programmadaǵı barlıq tekstlerdi ("Sálem", "Qáte", "Shıǵıw") kodtıń ishinen alıp, `Messages` klasınıń statikalıq konstantalarına (`MSG_HELLO`, `MSG_ERROR`) almastırıń. (Lokalizaciyaǵa tayarlıq).
5-tapsırma: Maǵlıwmat deregi (Data Source).
`DataReader` klasın jazıń. Ol maǵlıwmatlardı `read()` metodı arqalı oqısın.
Bul metodtı virtual etiń hám eki nusqasın jazań: `FileReader` (fayldan) hám
`KeyboardReader` (klaviaturadan). `main`-de ekewin almastırıp kóriń.
