Programmalıq támiynat qurılması hám evolyuciyası / 4-ameliy_PTQE
.pdf
4-ámeliy jumıs. Quramalılıqtı basqarıw usıllarınıń analizi.
Jumıstıń maqseti: Úlken hám quramalı programmalıq sistemalardı basqarıw usılların (Decomposition, Abstraction, Information Hiding) ámeliyatta qollanıw. "Joqarıdan-tómen" (Top-Down) hám "Tómennen-joqarı" (Bottom-Up) proektlestiriw usılların salıstırıw. Kodtıń logikalıq strukturasın jaqsılaw arqalı onıń quramalılıǵın (Complexity) azaytıw hám turaqlılıǵın arttırıw kónlikpelerin qáliplestiriw.
Teoriyalıq bólim: Quramalılıqtı basqarıw (Managing Complexity) – programmalıq injeneriyanıń baslı wazıypası.
Usıllar:
1.Dekompoziciya (Bóliw): Úlken máseleni kishi, ǵárezsiz bóleklerge (modullerge) bóliw.
2.Abstrakciya: Detallardı jasırıw. Mısalı, "Sortlaw" degende biz onıń ishki algoritmin (QuickSort, MergeSort) oylamaymız, tek nátiyjesin oylaymız.
3.Information Hiding (Maǵlıwmatlardı jasırıw): David Parnas principi. Modul basqa modullerge óziniń ishki jumısın kórsetpewi kerek (Interface vs
Implementation).
4.Top-Down: Ulıwma súwretten baslap, detallarǵa túsiw.
5.Bottom-Up: Kishi bóleklerden baslap, olardı biriktiriw.
ÁMELIY BÓLIM:
Bir máseleni – "Studentlerdi basqarıw sistemasın" (SMS) eki hár qıylı usılda (Top-Down hám Bottom-Up) proektlestirip kóremiz.
1-mısal: Top-Down (Joqarıdan-tómen) Proektlestiriw
Biz dáslep `main` funkciyasın (joqarı dáreje) jazamız, ishki funkciyalar ele joq (stub).
Kod (1-qádem: Ulıwma struktura):
int main() {
// 1. Maǵlıwmatlardı júklew loadData();
//2. Menyudı kórsetiw while (true) {
int choice = showMenu();
if (choice == 1) addStudent();
else if (choice == 2) listStudents(); else break;
}
//3. Maǵlıwmatlardı saqlaw
saveData(); return 0;
}
Kod (2-qádem: Detallastırıw - Stub funkciyalar):
void loadData() { cout << "Maǵlıwmat júklendi (Stub)" << endl; } int showMenu() {
cout << "1. Qosıw\n2. Kóriw\n3. Shıǵıw\nTańlań: "; int c; cin >> c; return c;
}
void addStudent() { cout << "Student qosıldı (Stub)" << endl; } void listStudents() { cout << "Studentler dizimi (Stub)" << endl; } void saveData() { cout << "Maǵlıwmat saqlandı (Stub)" << endl; }
Analiz: Biz programmanıń skeletin tez qurdıq. Endi hár bir funkciyanı (addStudent, listStudents) bólek-bólek toltırıp shıǵamız. Bul usıl logikanı tez túsiniwge járdem beredi.
2-mısal: Bottom-Up (Tómennen-joqarı) Proektlestiriw
Biz dáslep eń kishi bóleklerdi (Student klassı, maǵlıwmat strukturası) jazamız, keyin olardı `main` de biriktiremiz.
Kod (1-qádem: Tómengi dáreje - Klass):
class Student { public:
string name; int id;
Student(string n, int i) : name(n), id(i) {}
void print() { cout << id << ": " << name << endl; }
};
Kod (2-qádem: Orta dáreje - Baza): vector<Student> database;
void addToDB(string n, int i) { Student s(n, i);
database.push_back(s);
}
Kod (3-qádem: Joqarı dáreje - Main):
int main() {
// Kishi bloklardı testlep kóremiz addToDB("Azamat", 1); addToDB("Guli", 2);
for (auto s : database) s.print(); return 0;
}
Analiz: Biz fundamentten (klasstan) basladıq. Bul usıl isenimli, sebebi hár bir kishi blok (Student) testlengen. Biraq ulıwma sistema (menyu) eń sońında payda boladı.
3-mısal: Information Hiding (Parnas principi)
Másele: Studenttiń ID nomerin tikkeley ózgertiwden qorǵaw.
Kod (Jaman - Ashıq):
struct Student {
int id; // Hámme ózgerte aladı
};
// s.id = -5; // Qáte!
Kod (Jaqsı - Jasırın):
class Student {
private:
int id; // Jasırın
public:
void setID(int newID) {
if (newID > 0) id = newID; // Tekseriw (Logika)
else cout << "Qáte ID" << endl;
}
int getID() { return id; }
};
// s.setID(-5); // Qáte shıǵadı, id ózgermeydi.
Analiz: Biz `id` nıń qalay saqlanatuǵının (int pe, string pe) jasırıp qoydıq.
Keleshekte `id` stringke aylansa da, `main` degi kod ózgermeydi (tek `setID` ishki kodı ózgeredi).
4-mısal: Abstrakciya (Interfeys)
Másele: Maǵlıwmatlardı qay jerge saqlawdı (Faylǵa ma, Bazaǵa ma?) jasırıw.
Kod:
//Interfeys (Abstrakt klass) class IStorage {
public:
virtual void save(string data) = 0;
};
//Implementaciya 1: Fayl
class FileStorage : public IStorage { public:
void save(string data) override {
cout << "Faylǵa jazıldı: " << data << endl;
}
};
// Implementaciya 2: Baza (SQL)
class DatabaseStorage : public IStorage { public:
void save(string data) override {
cout << "SQL INSERT: " << data << endl;
}
};
void processData(IStorage* storage) { storage->save("Test Data");
}
int main() { FileStorage fs;
processData(&fs); // Faylǵa jazadı
DatabaseStorage db; processData(&db); // Bazaǵa jazadı return 0;
}
Analiz: `processData` funkciyası maǵlıwmat qayaqqa ketip atırǵanın bilmeydi (Abstrakciya). Ol tek `save` dep aytadı.
ÁMELIY TAPSÍRMALAR
1-tapsırma: Top-Down (Kalkulyator).
"Kalkulyator" programmasın Joqarıdan-Tómen usılında proektlestiriń.
1.`main`: Menyu hám ámellerdi shaqırıw.
2.Stub funkciyalar: `add()`, `sub()`, `mul()`, `div()`.
3.Keyin funkciyalardı toltırıń.
2-tapsırma: Bottom-Up (Kitapxana).
"Kitapxana" sistemasın Tómennen-Joqarı usılında proektlestiriń.
1.`Book` klassı (atı, avtorı).
2.`Library` klassı (`vector<Book>`).
3.`main`: Kitap qosıw hám kórsetiw.
3-tapsırma: Information Hiding (Tórtmúyeshlik).
`Rectangle` klasın jaratıń. `width` hám `height` ózgeriwshileri `private` bolsın. Olarǵa mánis beriwde (setter) teris san kirgizilmewin támiyinleń.
`getArea()` metodı arqalı maydandı alıń.
4-tapsırma: Dekompoziciya (Bankomat).
`withdrawMoney(int amount)` degen úlken funkciya bar. Onı 3 kishi funkciyaǵa bóliń:
1.`checkBalance()` - Balans jetkilikli me?
2.`updateBalance()` - Balanstı kemeytiw.
3.`dispenseCash()` - Aqshanı shıǵarıw. Tiykarǵı funkciya tek usılardı shaqırsın.
5-tapsırma: Abstrakciya (Logger).
`Logger` interfeysin jaratıń (`log(string msg)`).
Eki túrin jazıń: `ConsoleLogger` (ekranǵa) hám `FileLogger` (faylǵa). Polimorfizm arqalı ekewin almastırıp kóriń.
