簡體   English   中英

我需要如何更改我的程序以使用打開/關閉原則?

[英]How do I need to change my program to use Open/close Principle?

重寫此代碼以使用打開/關閉原則的最佳方法是什么? 這是我的 class 的一種方法:

void Entity::insertPropertyIfExists(std::string& name, std::string& value)
{
    else if (name == "Age")
        set_property("Age", std::make_shared<Age>(std::atoi(value.c_str())));
    else if (name == "City")
        set_property("City", std::make_shared<City>(value));
    //...
    else if (name == "Interests")
        set_property("Interests", std::make_shared<InterestList>(value));
}

這是一個 class 示例,您需要為其實現打開/關閉原則

class Property {
public:
    virtual int compare(Property& p) = 0;
    virtual ~Property() = default;
};

class City final : public Property {
public:
    City(std::string new_city);
    int compare(Property& p) override;
private:
    std::string city;
};

請給我看一些關於我的代碼的例子。

這個問題不是c++特有的,最好標記為設計問題。

然而,關於問題本身。 Open/Close 原則表明我們的設計將易於擴展,但可以密切修改。 換句話說,您希望在不影響現有功能和代碼的情況下擴展您的代碼功能。

在提出修改建議之前要問一個好問題,預計會改變什么? 然后,我們將確保我們的設計封裝了正在更改/擴展的部分。

正如@Mahesh Attarde 所述,您似乎想確保可以在不影響現有屬性功能的情況下添加新的“屬性”。

使用工廠方法確實是正確的方向,對於每個字符串,您應該有一個創建正確屬性的工廠方法,這就是為什么當您想要添加新屬性時,您不需要更改現有的工廠方法,而是創建一個新的。

在我看來,需要一些“HUB”來根據字符串標識符定向到正確的工廠方法這一事實是無可避免的。 但是,您可以使用“注冊”方法使代碼更接近於修改。 這意味着在某些結構中動態注冊字符串 id 和匹配工廠,以便 insertPropertyIfExists 不需要為每個新屬性進行更改。 您仍然需要為每個新屬性添加注冊,但這可以在“主”上下文中完成,這樣“實體”代碼不會受到影響,甚至不需要重新編譯。

暫無
暫無

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

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