0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

程序设计技术之开闭原则(OCP)

AGk5_ZLG_zhiyua 来源:未知 作者:佚名 2017-09-14 14:49 次阅读

周立功教授数年之心血之作《程序设计与数据结构》以及《面向AMetal框架与接口编程(上)》,书本内容公开后,在电子行业掀起一片学习热潮。经周立功教授授权,本公众号特对《程序设计与数据结构》一书内容进行连载,愿共勉之。

第二章为程序设计技术,本文为2.4.3 开闭原则(OCP)

>>> 2.4.3 开闭原则(OCP)

开闭原则(Open-Closed Princple,OCP)就是敏捷软件开发的基本原则之一,一个模块应该“对扩展开放,而对修改关闭。”比如,一个USB端口可以扩展,但不需要做任何修改就可以接受一个新的设备,因此,对于USB应用设备来说,一台有USB端口的计算机是扩展开放而对修改关闭的。当设计遵循OCP原则时,它可以通过增加新的代码来进行扩展,而不是修改已有的代码。比如,即使某个模块的内部实现改变了,但对外的接口也不能变,其目的是隔离变化。OCP通常要求我们对软件进行抽象,因为只有具有共性的抽象的接口,才会有具体的实现的可能性。接口放在哪里呢?应该放在用户端,而不是实现的一方。

假设只允许将0~9之内的value值push到栈中,即min=0,max=9。根据OCP原则,需要编写一个调用push()功能的函数pushWithRangeCheck()。将其共性——范围值的合法性判断包含在函数体内,而可变的value值、min和max通过形参应对。其函数原型为:

如果value值非法,则返回false;如果value值合法,则调用push()。此时,如果栈不满,则返回true,否则返回false,详见程序清单 2.36。

程序清单 2.36 范围值校验器范例程序(1)

由此可见,如果正确地应用OCP,那么以后再进行同样的改动时,则只需要添加新的代码,而不必改动已经正常运行的代码。如果仅需1-2种校验器,则上述方法非常简单明了。当需要组合多种校验器一起使用时,则上述方法传递的参数太多,而且每次push时,都要传递允许的范围参数。如果将min和max分离出来成为一个Range类型结构体,即可避免以上问题:

根据OCP开闭原则,需要再编写一个扩展push功能的pushWithRangeCheck(),范围值校验器范例程序详见程序清单 2.37。

程序清单 2.37范围值校验器范例程序(2)

如果再添加一个奇偶校验器,则需要判断push到栈中的数据是否为偶数,创建与之相应的OddEven类型结构体如下:

根据OCP开闭原则,还需要再编写一个扩展push功能的pushWithOddEvenCheck()。即:

为了避免用户直接操作成员,则需要定义相应的校验接口函数。即:

由于范围值校验函数和偶数校验函数都有一个指向当前对象的指针,因此可以将特殊的Range *pRange和OddEven *pOddEven泛化为void *pData。即:

无论是范围值校验还是偶数校验,其共性是对输入参数进行校验,因此可以共用一个函数指针。其函数原型如下:

为了便于阅读,如程序清单 2.38所示展示了通用校验器的接口。

程序清单 2.38 通用校验器的接口(validator.h)

尽管无法预知将要支持什么校验器,但调用者知道,因此可以将范围值校验器和奇偶校验器功能分离出来成为单独的函数,编写一个通用的pushWithValidate()函数,通过函数指针调用相应的校验函数,且不用在意具体校验器内部的实现,使用validator.h接口的通用校验器范例程序详见程序清单 2.39。

程序清单 2.39通用校验器范例程序

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 开闭原则
    +关注

    关注

    0

    文章

    1

    浏览量

    900

原文标题:周立功:敏捷软件开发的基本原则——开闭原则(OCP)

文章出处:【微信号:ZLG_zhiyuan,微信公众号:ZLG致远电子】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    SOLID设计原则

    设计原则(SOLID)使用各个原则的首字母组成了一个单词:SOLID。SRP:Single Responsibility Principle,单一职责原则OCP:Open Close
    发表于 11-08 07:44

    单片机程序中的六个设计原则分别是哪些

    片头在上一篇文章中已经介绍了“单一职责原则”在单片机程序中的使用,并以“环形缓存”作为介绍切入点,因为“环形缓存”在应用中比较多,所以在介绍“开闭原则”时依然以它作为介绍切入点。六个设
    发表于 03-01 06:06

    《C/ C++/ Java 程序设计经典教程》

    《C/ C++/ Java 程序设计经典教程》(Deitel 著) ●集作者几十年程序设计经验精华,从软件工程的原理强调结构化程序设计方法,追求
    发表于 04-08 02:10 398次下载

    JAVA程序设计教程

    JAVA程序设计教程
    发表于 04-10 14:46 0次下载
    JAVA<b class='flag-5'>程序设计</b><b class='flag-5'>之</b>教程

    PIC单片机学习知识程序设计(二)

    上文中我们讲述了PIC单片机基础学习程序设计(一),接下来将继续为大家讲解PIC单片机程序设计(二),供大家学习。
    发表于 06-27 11:50 5869次阅读

    DSP基带码发生器程序设计与仿真

    DSP基带码发生器程序设计与仿真,很好的DSP自学资料,快来学习吧。
    发表于 04-15 17:42 4次下载

    DSP频率计程序设计与仿真

    DSP频率计程序设计与仿真,很好的DSP自学资料,快来学习吧。
    发表于 04-15 17:42 6次下载

    面向对象的程序设计总结与过程化程序设计有什么区别?

    面向对象程序设计(简称OOP)技术最近几年在计算机领域得到了迅猛发展,它是程序设计方法的一场革命。与传统的结构化程序设计(面向过程程序设计
    发表于 09-19 14:12 0次下载
    面向对象的<b class='flag-5'>程序设计</b>总结与过程化<b class='flag-5'>程序设计</b>有什么区别?

    Java程序设计Java安全技术网络编程的详细资料说明

    本文档详细介绍的是Java程序设计Java安全技术网络编程的详细资料说明主要内容包括了:1 安全基本知识 ,2 Java的安全模型 ,3 Java的密码学结构
    发表于 02-26 14:15 6次下载
    Java<b class='flag-5'>程序设计</b><b class='flag-5'>之</b>Java安全<b class='flag-5'>技术</b>网络编程的详细资料说明

    单片机C语言程序设计实例双向来回的流水灯

    本文档的主要内容详细介绍的是单片机C语言程序设计实例双向来回的流水灯免费下载。
    发表于 02-01 16:45 14次下载
    单片机C语言<b class='flag-5'>程序设计</b>实例<b class='flag-5'>之</b>双向来回的流水灯

    单片机C语言程序设计实例闪烁的LED

    本文档的主要内容详细介绍的是单片机C语言程序设计实例闪烁的LED程序和工程文件免费下载。
    发表于 02-01 16:45 5次下载

    《嵌入式软件设计方法》--设计原则

    设计原则(SOLID)使用各个原则的首字母组成了一个单词:SOLID。SRP:Single Responsibility Principle,单一职责原则OCP:Open Close
    发表于 11-03 15:36 12次下载
    《嵌入式软件设计方法》--设计<b class='flag-5'>原则</b>

    C语言程序设计第四讲结构化程序设计选择

    C语言程序设计第四讲结构化程序设计选择
    发表于 12-22 10:34 0次下载

    高质量程序设计指南C++C语言

    高质量程序设计指南C++C语言
    发表于 01-07 11:46 0次下载

    c语言程序设计概述

    电子发烧友网站提供《开源硬件-开发者智慧c语言程序设计(带书签).pdf》资料免费下载
    发表于 11-20 10:25 1次下载
    c语言<b class='flag-5'>程序设计</b>概述