开放封闭原则是否意味着我们必须将每种方法都定义为虚拟方法?

时间:2019-04-01 23:14:17

标签: oop solid-principles open-closed-principle

我很难理解开放封闭原则背后的想法。

据我所知,该原理说每个类都应关闭以进行修改,并应打开以进行扩展。对吧?

因此,这意味着我们必须将类中的每个方法都设为虚拟,以便我们可以扩展类而无需对其进行修改。这是正确的吗?

1 个答案:

答案 0 :(得分:0)

我认为您在某种程度上误解了开放式封闭原则。

开放-封闭原则指出,应关闭软件实体以进行修改并可以扩展。在这种情况下,软件实体是指类,结构方法等。

基本思想是您的实体不需要经常更改需求。如果出现新的要求,则应扩展您的实体以适应新功能。

假设我们具有以下功能:

    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”类及其功能。当然,该类中的许多其他功能可能也需要修改,因为它也可能使用标准对象。

假设我们可以这样写:

    private List<Product> GetProducts(Criteria criteria)
    {
        return cleverContext.Apply(criteria);
    }

如果仅修改或扩展负责标准的代码,我们将立即获得灵活性。

改进设计以满足开放式封闭原则的最大途径是使用丰富的域。当您的域为企业业务规则建模时,规则将永远不会更改。我们将Domain和Use-Cases分开以处理应用程序规则。

bob叔叔在其干净的体系结构中对此作了更多介绍。

让我知道是否有什么可以阐明的,或者尝试进一步解释:)