开闭原则是否意味着我们必须将每个方法都定义为虚拟的?
Does Open Closed Principle mean that we have to define every method as virtual?
我无法理解开放封闭原则背后的想法。
据我所知,原理是说每一个class都应该对修改关闭,对扩展开放。对吗?
所以这意味着我们必须使 class 中的每个方法都是虚拟的,这样我们就可以扩展 class 而无需修改它。这是正确的吗?
我认为您对开闭原则的含义有些误解。
开闭原则指出,软件实体应该对修改关闭,对扩展开放。此上下文中的软件实体是指 classes、结构方法等
基本思想是您的实体不需要经常根据要求进行更改。如果出现新要求,您的实体应该扩展以适应新功能。
假设我们有以下函数:
public List<Product> GetProducts(Criteria criteria)
{
return context.Where(x => x.criteria1 = criteria.criteria1)
.Where(x => x.criteria2 = criteria.criteria2)
.Where(x => x.criteria3 = criteria.criteria3)
.Where(x => x.criteria4 = criteria.criteria4);
}
很容易看出,当另一个标准要求出现时,这将需要修改 "ProductRepository" class 及其功能。当然,这个 class 中的更多函数可能需要修改,因为它也可能使用条件对象。
假设我们可以这样写:
private List<Product> GetProducts(Criteria criteria)
{
return cleverContext.Apply(criteria);
}
我们立即获得了灵活性,只需修改或扩展负责标准的代码。
改进设计以满足开闭原则的最大方法是使用丰富的域。当您的域为企业业务规则建模时,规则永远不应该改变。我们将 Domain 与 Use-Cases 分开来处理应用程序规则。
bob 叔叔在他的 clean architecture 中写了更多这方面的内容。
让我知道是否有任何我可以阐明的内容,或者尝试进一步解释:)
我无法理解开放封闭原则背后的想法。
据我所知,原理是说每一个class都应该对修改关闭,对扩展开放。对吗?
所以这意味着我们必须使 class 中的每个方法都是虚拟的,这样我们就可以扩展 class 而无需修改它。这是正确的吗?
我认为您对开闭原则的含义有些误解。
开闭原则指出,软件实体应该对修改关闭,对扩展开放。此上下文中的软件实体是指 classes、结构方法等
基本思想是您的实体不需要经常根据要求进行更改。如果出现新要求,您的实体应该扩展以适应新功能。
假设我们有以下函数:
public List<Product> GetProducts(Criteria criteria)
{
return context.Where(x => x.criteria1 = criteria.criteria1)
.Where(x => x.criteria2 = criteria.criteria2)
.Where(x => x.criteria3 = criteria.criteria3)
.Where(x => x.criteria4 = criteria.criteria4);
}
很容易看出,当另一个标准要求出现时,这将需要修改 "ProductRepository" class 及其功能。当然,这个 class 中的更多函数可能需要修改,因为它也可能使用条件对象。
假设我们可以这样写:
private List<Product> GetProducts(Criteria criteria)
{
return cleverContext.Apply(criteria);
}
我们立即获得了灵活性,只需修改或扩展负责标准的代码。
改进设计以满足开闭原则的最大方法是使用丰富的域。当您的域为企业业务规则建模时,规则永远不应该改变。我们将 Domain 与 Use-Cases 分开来处理应用程序规则。
bob 叔叔在他的 clean architecture 中写了更多这方面的内容。
让我知道是否有任何我可以阐明的内容,或者尝试进一步解释:)