设为首页 收藏本站
查看: 1225|回复: 0

[经验分享] 设计原则之开放闭合原则(OCP)

[复制链接]

尚未签到

发表于 2015-11-8 13:50:53 | 显示全部楼层 |阅读模式
  在《敏捷软件开发-原则、模式与实践》一书中,对开放闭合原则的定义为:
  软件实体(类、模块、函数等)应该是可以扩展的,但是不可以修改。
  简言之,两个特征:
  1、对于扩展是开放的;
  2、对于修改是关闭的
  这两点特征貌似自相矛盾,怎么样在不改动模块源码的情况下去更改他的行为呢?如果不更改一个模块,又怎么能够去改变它的功能呢?
  答案很简单,就是抽象。模块可能对抽象体进行操作。由于模块依赖于一个固定的抽象体,所以他对于更改可以是封闭的。同时,通过从这个抽象体去派生,可以扩展此模块的行为。
  


  在设计原则开篇一文中已经举例说明了如何应用这个原则。在这篇文章中再举一个例子,帮助大家加深认识。
  


  如果你有去看zend framework的源码,其中有一段代码是用来解析配置文件的,这次就拿这个案例来举例。
  version1:
  有多个配置文件:config.php、config.json、config.xml
  config.php:
  

<?php
return array(
'database' => array(
'host' => '127.0.0.1',
'username' => 'root',
'password' => '',
'dbname' => 'test'
)
);config.json:

{
&quot;database&quot;:{
&quot;host&quot;:&quot;127.0.0.1&quot;,
&quot;username&quot;:&quot;root&quot;,
&quot;password&quot;:&quot;&quot;,
&quot;dbname&quot;:&quot;test&quot;
}
}config.xml:  
  

<?xml version=&quot;1.0&quot; encoding=&quot;ISO-8859-1&quot;?>
<config>
<database>
<host>127.0.0.1</host>
<username>root</username>
<password></password>
<dbname>test</dbname>
</database>
</config>

  我们将配置文件交给config类去处理:
  

public function configToArray($configFile){
$extension = pathinfo($configFile, PATHINFO_EXTENSION);
$config = array();
switch ($extension) {
case 'php':
$config = require_once $configFile;
break;
case 'xml':
$xml = simplexml_load_file($configFile);
return json_decode(json_encode($xml), true);
case 'json':
$config = json_decode(file_get_contents($configFile), true);
break;
}
foreach ($config as $key => $value) {
$this->set($key, $value);
}
}


  
  这样的弊端在于,后期如果希望使用新的配置文件,比如ini文件、yaml文件等,我们就需要到switch语句里面去新增case。
  现在来看version 2的设计:
  首先声明了一个接口Configuration:
  

<?php
interface Configuration{
public function toArray($configFilePath);
}然后新增了3个具体的实现类:  
  jsonConfiguration.php


  

<?php
require_once &quot;configuration.php&quot;;
class JsonConfiguration implements Configuration{
public function toArray($configFilePath){
return json_decode(file_get_contents($configFilePath), true);
}
}phpConfiguration.php  
  

<?php
require_once &quot;configuration.php&quot;;
class phpConfiguration implements Configuration{
public function toArray($configFilePath){
$config = require_once $configFilePath;
return $config;
}
}xmlConfiguration.php

<?php
require_once &quot;configuration.php&quot;;
class XmlConfiguration implements Configuration{
public function toArray($configFilePath){
$xml = simplexml_load_file($configFilePath);
return json_decode(json_encode($xml), true);
}
}这样config类中的代码就可以修改为:  
  

public function configToArray(Configuration $configuration){
$config = is_array($configuration->toArray($this->configFilePath)) ? $configuration->toArray($this->configFilePath) : array();
foreach ($config as $key => $value) {
$this->set($key, $value);
}
}
  
  这样我们想再增加一个配置文件时,就可以新增一个实现类就可以了。也就做到了“对修改关闭,对扩展开放”了。
  这个案例和设计原则开篇一文中提到的案例非常相&#20284;,可以概括为“如何将if/else转换为抽象”和“如何将switch转换为抽象”, DSC0000.gif
  


  在许多方面,OCP都是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处:灵活性、可重用性和可维护性。然而,并不是说只要使用一种面向对象语言就是遵循了这个原则。对于应用程序中的每个部分都肆意地进行抽象同样不是一个好主意。正确的做法是,开发人员应该仅仅对程序中呈现出频繁变化的那些部分做出抽象。拒绝不成熟的抽象和抽象本身一样重要。

版权声明:本文为博主原创文章,转载请注明出处和作者名,尊重别人也是尊重自己

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-136633-1-1.html 上篇帖子: OCP考题解析_007: 同义词 下篇帖子: ORACLE OCP 考试指南
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表