CodeBlanks Logo Icon CodeBlanks

Birleştirme

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

main.cpp
#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

main.cpp
#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ı

Soru
Framework fw; fw.____();
Cevap
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ş

İleri seviye bölümündeki tüm dersler