开放封闭原则基本怀疑

时间:2015-11-03 14:39:20

标签: design-principles

我确实看到很多关于OC原则的问题,有些问题有很好的回答,我仍然对此有一些疑问,下面就是那些。

1)假设我的应用程序中有注册模块目前它只支持一个国家,我得到更改请求,我现在必须支持另外3个国家(注册表格不会改变它仍然保持不变)这只是我有根据国家/地区对用户进行分类。只有在我的应用程序中更改才能从UI获取国家/地区数据并将其保存在数据库中,我是否必须在此处应用OCP。

2)OCP是否意味着我的方法(函数)中不应该有任何if else逻辑,我知道如果对象创建不好但是如果我有一些基于场景实现的业务逻辑我不应该使用如果还有更多条件被添加,我必须修改代码。

1 个答案:

答案 0 :(得分:1)

Open Closed原则适用于几乎所有设计和您的设计。与您所描述的场景(这些是有效场景)的唯一区别在于,您已将其归结为变更请求(第1点)和编码实践(第2点)。

开放封闭原则应该在更高层次即设计层面上进行更多考虑。同时它应被视为应该瞄准的最佳实践,并且应该尽可能接近开放封闭设计。 (即,为扩展而打开系统的最大可能部分,并关闭系统的最大部分以进行修改)。让我来看两个场景,并解释如何将Open-Closed应用于它们 -

第1点:3个新国家/地区场景只有3个新值添加到UI字段并不能保证设计更改。但是,如果您的代码中包含特定于国家/地区的业务逻辑,则此更改确实会影响设计。 对于特定于国家/地区的逻辑,您应该以这样的方式设计业务逻辑实现,即您可以编写一个新的服务类/特定于国家/地区的处理程序来扩展基本处理程序。可以将此国家/地区特定服务调用配置为基于所选择的实际国家/地区来调用,或者可以基于在UI中选择的国家来实例化国家/地区特定处理程序。然后打开扩展。

另一方面,基类service / BaseHandler保持不变,代码执行顺序保持不变(或序列图保持不变)。因此,应用程序的核心已关闭以进行修改。

这就是Open-Closed可以应用于这一点的方式。

第2点:If-else - If-else是否违反Open Open Rule取决于在哪里应用它。 if-else在服务方法中用于细粒度的业务逻辑是绝对正确的。如果您使用它来选择从处理程序的工厂实例化哪个处理程序,那就更好了。

但是,如果您使用单一服务方法处理所有国家/地区并且您正在执行if-else检查国家1是否保存在数据库中,如果国家/地区2然后忽略等,那就不行了。这不是"关闭以进行修改"设计。

希望我能够向你解释这个概念。

我在博客上写了一篇关于开放封闭原则的文章,我已经详细解释了这个原则 - http://www.javabrahman.com/programming-principles/open-closed-principle-with-examples-in-java/。如果你仍然有任何疑问,你也可以查看。