Birleştirme
- C++ kursu
- İleri seviye
- Ders 83/83
- 6 dk
Tüm katmanları birleştirerek çalışan bir mini framework yazarsın.
Birleştirme
Son derste tüm katmanları birleştiriyoruz: iskelet, modern C++ veri işleme, concurrency paralel toplam ve design pattern görevleri. Artık çalışan bir mini framework'ümüz var.
Önceki derslerin tüm kodu yerinde: Framework sınıfı, process_data, parallel_sum, Logger, TaskFactory. Bu derste run metodunun sonuna bir tümleşme mesajı ekleyeceğiz. Bu mesaj, tüm katmanların başarıyla çalıştığını doğrular. Çıktı, dört dersin birikimi olarak büyüyor: hazır mesajı, toplam, paralel toplam, log ve tümleşme mesajı.
Son tümleşme mesajı
run metodunun sonunda, tüm katmanların çalıştığını doğrulayan bir mesaj yazacağız. Bu mesaj, execute() çağrısından sonra gelir.
Örnek: std::cout << std::endl << "çalıştırma tamam";. Bu satır, önceki [log] çıktısının altına yeni bir satırda tümleşme mesajını yazar. Böylece çıktı, dört dersin birikimini gösterir: "Proje hazır", "toplam: 4", "paralel: 4", "[log] görev tamam" ve "çalıştırma tamam". Framework artık tüm katmanlarla tam çalışır durumdadır.
Uygulama Son tümleşme mesajını ekle
run metodunda t->execute(); satırından sonra std::cout << std::endl << "çalıştırma tamam"; satırını ekle. Diğer kodlara dokunma.
Başlangıç kodu
#include <iostream>
#include <string>
#include <vector>
#include <ranges>
#include <algorithm>
#include <concepts>
#include <thread>
#include <atomic>
#include <memory>
class Logger {
public:
static Logger& instance() {
static Logger inst;
return inst;
}
void log(const std::string& msg) { std::cout << "[log] " << msg; }
private:
Logger() = default;
};
class Task {
public:
virtual ~Task() = default;
virtual void execute() = 0;
};
class PrintTask : public Task {
public:
PrintTask(const std::string& m) : msg_(m) {}
void execute() override { Logger::instance().log(msg_); }
private:
std::string msg_;
};
class TaskFactory {
public:
static std::unique_ptr<Task> makePrint(const std::string& m) {
return std::make_unique<PrintTask>(m);
}
};
class Framework {
public:
int run();
template<std::integral T>
int process_data(const std::vector<T>& data);
int parallel_sum(const std::vector<int>& data);
};
template<std::integral T>
int Framework::process_data(const std::vector<T>& data) {
int sum = 0;
for (auto x : data | std::views::filter([](T v) { return v > 0; })) {
sum += x;
}
return sum;
}
int Framework::parallel_sum(const std::vector<int>& data) {
std::atomic<int> total{0};
std::thread t1([&]() { for (auto x : data) if (x > 0) total += x; });
t1.join();
return total;
}
int Framework::run() {
std::cout << "Proje hazır" << std::endl;
std::vector<int> data{1, -2, 3};
std::cout << "toplam: " << process_data(data) << std::endl;
std::cout << "paralel: " << parallel_sum(data) << std::endl;
auto t = TaskFactory::makePrint("görev tamam");
t->execute();
// son tumlesme mesajini yaz
return 0;
}
int main() {
Framework fw;
fw.run();
return 0;
}Örnek çözüm
#include <iostream>
#include <string>
#include <vector>
#include <ranges>
#include <algorithm>
#include <concepts>
#include <thread>
#include <atomic>
#include <memory>
class Logger {
public:
static Logger& instance() {
static Logger inst;
return inst;
}
void log(const std::string& msg) { std::cout << "[log] " << msg; }
private:
Logger() = default;
};
class Task {
public:
virtual ~Task() = default;
virtual void execute() = 0;
};
class PrintTask : public Task {
public:
PrintTask(const std::string& m) : msg_(m) {}
void execute() override { Logger::instance().log(msg_); }
private:
std::string msg_;
};
class TaskFactory {
public:
static std::unique_ptr<Task> makePrint(const std::string& m) {
return std::make_unique<PrintTask>(m);
}
};
class Framework {
public:
int run();
template<std::integral T>
int process_data(const std::vector<T>& data);
int parallel_sum(const std::vector<int>& data);
};
template<std::integral T>
int Framework::process_data(const std::vector<T>& data) {
int sum = 0;
for (auto x : data | std::views::filter([](T v) { return v > 0; })) {
sum += x;
}
return sum;
}
int Framework::parallel_sum(const std::vector<int>& data) {
std::atomic<int> total{0};
std::thread t1([&]() { for (auto x : data) if (x > 0) total += x; });
t1.join();
return total;
}
int Framework::run() {
std::cout << "Proje hazır" << std::endl;
std::vector<int> data{1, -2, 3};
std::cout << "toplam: " << process_data(data) << std::endl;
std::cout << "paralel: " << parallel_sum(data) << std::endl;
auto t = TaskFactory::makePrint("görev tamam");
t->execute();
std::cout << std::endl << "çalıştırma tamam";
return 0;
}
int main() {
Framework fw;
fw.run();
return 0;
}Beklenen çıktı
Proje hazır toplam: 4 paralel: 4 [log] görev tamam çalıştırma tamam
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 run çağrısı
Framework fw; fw.____();
Framework fw; fw.run();
Açıklama: fw.run() framework'ü başlatır.
2 Tümleşme (integration) ne demektir?
- Kodu silmek
- Yeni sınıf eklemek
- Tüm katmanları bir arada çalıştırarak tümleşmiş bir uygulama elde etmek Doğru cevap
- Derlemeyi atlamak
Açıklama: Tümleşme, tüm katmanları bir arada çalıştırarak tümleşmiş bir uygulama elde etmektir.
3 Katmanı rolüne eşle
| Kavram | Anlamı |
|---|---|
process_data |
Veri işleme |
parallel_sum |
Paralel toplam |
Logger |
Günlük |
main() |
Tümleşik giriş |