簡體   English   中英

如何在 C++ 中實現干凈的架構組件邊界?

[英]How to implement clean architecture component boundaries in c++?

我正在閱讀 Robert C. Martin 的 Clean Architecture,我想將書中的知識應用到我的 C++ 程序中。 然而,我不明白的一件事是接口邊界應該如何工作。

“內層”(業務規則)不應該知道任何關於外層的信息。 意思是紅線上方的東西不應該知道下圖中紅線下方的東西。

但是,如果業務規則使用 C++ 接口(純抽象類)與數據庫(下圖中的數據庫接口)通信,它們是否不必在“數據庫訪問/數據庫”中包含對實現標頭的引用模塊,因為抽象基類不能被實例化? 這難道不會違反業務規則不應了解外層的原則嗎?

在 C++ 中正確的方法是什么?

圖 17.2,干凈的架構

圖片:圖 17.2 來自 Clean Architecture

C++ 中的純虛擬接口大致類似於 C# 或 Java 等托管語言中的接口:

struct DatabaseInterface {
    virtual ~DatabaseInterface();
    virtual std::string get(std::string key) = 0;
    virtual void put(const std::string& key, const std::string& value) = 0;
};

依賴於數據庫的類可以依賴於指向抽象基類的擁有指針。 它不需要了解有關實現的任何信息:

struct BusinessRules {
    std::unique_ptr<DatabaseInterface> db; // reference
    BusinessRules(std::unique_ptr<DatabaseInterface>);
    /* stuff using the database interface */
};

雖然您不能直接實例化它,但您可以讓另一個類繼承接口,並且您可以將具體類的實例傳遞給需要指向抽象類接口的指針的使用者:

struct SpecificDatabaseAccess: public DatabaseInterface {
    SpecificDatabaseAccess(const std::string& connectionString);
    std::string get(std::string key) override;
    void put(const std::string& key, const std::string& value) override;
};

/* ... */

// dependency injection through the constructor
auto db = std::make_unique<SpecificDatabaseAccess>("...");
auto rules = BusinessRules(std::move(db));

標准庫對istream做了類似的事情。 istream有一堆方法,它們作用於較低級別的streambuf成員之上。 streambuf是一個抽象接口,其實現執行 I/O 訪問(對 stdin、文件字符串等)。

雖然這些都與 Clean Architecture 沒有直接關系,但您可以通過這種方式使組件的實現獨立於它們的依賴項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM