我需要如何更改我的程序以使用打开/关闭原则?

Posted

技术标签:

【中文标题】我需要如何更改我的程序以使用打开/关闭原则?【英文标题】:How do I need to change my program to use Open/close Principle? 【发布时间】:2020-06-04 16:21:56 【问题描述】:

重写此代码以使用打开/关闭原则的最佳方法是什么? 这是我班的一种方法:

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 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;
;

请给我看一些关于我的代码的例子。

【问题讨论】:

您希望在实体类中打开设计以进行扩展和关闭以进行修改。函数 insertPropertyIfExists 应该接受 EntityType,它对于每种类型的实体都有自己的工厂函数。函数 insertPropertyIfExists 只会路由 EntityTypes setproperty 函数。 【参考方案1】:

这个问题不是c++特有的,最好标记为设计问题。

不过,关于问题本身。 Open/Close 原则表明我们的设计将易于扩展,但可以进行密切修改。换句话说,您希望在不影响现有功能和代码的情况下扩展代码功能。

在提出修改建议之前要问一个好问题,预计会改变什么?然后,我们将确保我们的设计封装了正在更改/扩展的部分。

正如@Mahesh Attarde 所说,您似乎希望确保可以添加新的“属性”而不影响现有的属性功能。

使用工厂方法确实是正确的方向,对于每个字符串你应该有一个工厂方法来创建正确的属性,这就是为什么当你想要添加新属性时你不需要改变现有的工厂方法,而是创建一个新的。

在我看来,需要一些“HUB”来根据字符串标识符定向到正确的工厂方法这一事实是无可避免的。但是,您可以使用“注册”方法使代码更接近于修改。意味着在某些结构中动态注册字符串 id 和匹配工厂,以便 insertPropertyIfExists 不需要为每个新属性进行更改。您仍然需要为每个新属性添加注册,但这可以在“主”上下文中完成,这样“实体”代码不会受到影响,甚至不需要重新编译。

【讨论】:

以上是关于我需要如何更改我的程序以使用打开/关闭原则?的主要内容,如果未能解决你的问题,请参考以下文章

visual studio中的exe以管理员身份运行

我们可以以编程方式从我们的应用程序打开/关闭 hdmi 设置吗

如何在 App Store 中更改我的卖家名称? [关闭]

如何在警报视图中隐藏关闭按钮和关闭操作以仅显示“打开应用程序”按钮

如何从我的组件打开的窗口中反应性地检查更改

使用C#和Xamarin表单 - 如何在不设置闭包链的情况下关闭一个模态