我需要如何更改我的程序以使用打开/关闭原则?
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 不需要为每个新属性进行更改。您仍然需要为每个新属性添加注册,但这可以在“主”上下文中完成,这样“实体”代码不会受到影响,甚至不需要重新编译。
【讨论】:
以上是关于我需要如何更改我的程序以使用打开/关闭原则?的主要内容,如果未能解决你的问题,请参考以下文章
我们可以以编程方式从我们的应用程序打开/关闭 hdmi 设置吗