系列文章目录

C++开闭原则
C++迪米特法则

文章目录

  • 系列文章目录
  • 前言
  • 一、开闭原则到底有什么用?
  • 二、开闭原则有什么特点

前言

在一个新人刚入编程这一行的时候,可能在正式参加到一个项目之前跟着书本或者教学视屏写了一些五子棋、贪吃蛇等等的小程序。

在参加工作之后,领导直接扔过来一个项目让你看看代码,你可能专心的在看这个接口调用了哪些接口、一个类包含哪些功能。

再之后,大多会让你先参与维护的工作,等工作了一两年,可能让你独立支持一个项目的部分功能实现。

但是在工作了两三年后,如果让你直接挑战一个大项目,从零开始设计、搭建项目,你真的可以设计出既满足功能、代码又很优雅、迭代维护性高的工程吗?

或者你了解一些什么工厂模式、开闭原则等浅薄的知识,觉得自己可以挑战一个大型项目,但实际上这远远不够。

或许有人会说这是架构师的职责,但是假如等到你以后跳槽了,或者工龄大了升职了,还不能挑起一个大项目,想到这些你会不会想现在提升一下自己呢?

如果可以全面按照C++的设计原则,并灵活应用设计模式的话,就可以磨练出支撑大型项目的能力,在我们设计的时候要时刻牢记这些原则。

|版本声明:山河君,未经博主允许,禁止转载

一、开闭原则到底有什么用?

开闭原则属于六大设计原则之一,百度百科上面介绍开闭原则:开闭原则规定“软件中的对象(类,模块,函数等等)应该对于扩展是开放的,但是对于修改是封闭的”,这意味着一个实体是允许在不改变它的源代码的前提下变更它的行为。
所谓的开闭,也正是对扩展和修改两个行为的一个原则。强调的是用抽象构建框架,用实现扩展细节。可以提高软件系统的可复用性及可维护性。

二、开闭原则有什么特点

以下是构造了一个计算器,它具有最基本的加、减、乘、除的功能。运行虚函数的方法使得计算机是一个纯虚父类,使用时使用父类指针指向子类,直接使用父类指针调用计算方法即可。

其实特点在上面已经说过了,可以扩展,但是不能修改,开闭原则充分利用了父类指针指向子类的原理,在实际应用中,实际上我们能拿到的只有父类指针,根据指向去使用子类,所以会经常出现一种问题,使用开闭原则,我们有的时候压根就不知道父类指针指向的是哪里。

关于以上特性我们直接看一下代码输出。

#include <iostream>
#include <stdlib.h>
using namespace std;//计算器类
class Calculator
{public://抽象接口类,子类实现virtual double getompute() = 0;virtual void getParam(double a, double b) = 0;
};//除
class Division : public Calculator
{public:virtual double getompute(){return mA / mB;}virtual void getParam(double a, double b){mA = a;mB = b;}
private:double mA;double mB;
};
//乘
class Multiplication : public Calculator
{public:virtual double getompute(){return mA * mB;}virtual void getParam(double a, double b){mA = a;mB = b;}
private:double mA;double mB;
};
//减
class Subtraction : public Calculator
{public:virtual double getompute(){return mA - mB;}virtual void getParam(double a, double b){mA = a;mB = b;}
private:double mA;double mB;
};
//加
class Addition : public Calculator
{public:virtual double getompute(){return mA + mB;}virtual void getParam(double a, double b){mA = a;mB = b;}
private:double mA;double mB;
};int main()
{Calculator* Add = new Addition;Add->getParam(1,2);double c = Add->getompute();cout << c << endl;system("pause");return 0;
}

父类是一个计算器类,是一个抽象类,当然不一定非得是抽象类,但是如果不是抽象类,就要注意释放问题,其四个子类分别为加、减、乘、除。而在实际使用中,我们也是直接定义父类指针指向子类。当然,我们也可以直接使用子类,只用加功能,但是实际上我们的逻辑是用计算器的加功能,我们用的是计算器,而不是拆分下来的东西。

为什么说这样就可以保证扩展性而不能修改呢,实际上什么代码只要你想,都可以修改,只是有没有需要,而使用开闭原则就可以在实际开发过程中,让开发人员自然而然的不会想到直接修改代码,而是通过扩展功能来实现需求。

比方说,在这个基础上我想增加求根的功能:
如果咱们现在只有一个计算器类,这个类里面有加、减、乘、除四种方法,那么想增加求根功能我们自然而然会想到在计算器中增加求根的方法,这样就修改了我们的源代码。
而使用了开闭原则,父类中的纯虚函数就有一个求值的接口getompute,开发人员就会增加一个新的子类,进行求根的操作,这样就不会直接修改源代码。

C++设计原则——开闭原则(持续更新中)相关推荐

  1. 面向对象软件设计的“开—闭”原则

    1.什么是开闭原则         "开-闭"原则是指软件实体应当对扩展性开放,对修改关闭.即软件实体应该在不修改的前提下扩展,这个原则实际上为软件设计指明了目标.我们知道软件设计 ...

  2. 带你认识六种设计原则(开闭原则、里氏代换原则、依赖倒转原则....)

    前言 1. 设计原则 1.1. 开-闭原则 1.2. 里氏代换原则 1.3. 依赖倒转原则 1.4. 接口隔离原则 1.5. 合成/聚合原则 1.6. 迪米特法则 前言 学习设计模式之前先要了解其中的 ...

  3. 六大设计原则--开闭原则

    定义 software entities like classes, modules and functions should be open for extension but closed for ...

  4. 一周技术学习笔记(第67期)-CPU的设计跟开闭原则有关系吗

    你能想到CPU的设计是开闭原则的设计吗 说CPU的设计很符合软件设计的开闭原则,估计一般的同学肯定不会这样意识到.其实我也一样不太可能把它们能够想在一起,并将它们关联起来. 可确实就这样发生了.实际上 ...

  5. 六大设计模式原则-开闭原则

    一.开闭原则定义 开闭原则是面向对象的可复用设计的第一块基石,是最重要的面向对象设计原则.定义如下: 开闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开放,对修 ...

  6. 设计模式6大原则-开闭原则

    设计模式6大原则-开闭原则 定义:一个软件实体如类.模块和函数应该对扩展开放,对修改关闭. 开闭原则理念就是当需求改变时,希望在不改变原有代码的前提下,通过扩展模块.函数来满足新需求. 开闭原则是其他 ...

  7. 设计模式之王者原则 开闭原则

    设计模式之王者原则  开闭原则 为什么说 它--开闭原则是王者原则呢? 因为所有原则都是围绕它来实现的,怎么说呢,为什么会有这么多原则呢,都是为了完成它,只要实现它你的代码就不会有什么大的问题 一.定 ...

  8. 【设计模式】软件设计七大原则 ( 开闭原则 )

    文章目录 一.开闭原则简介 二.开闭原则代码示例 1.商品接口 2.普通商品类 3.折扣商品类 4.测试类 一.开闭原则简介 开闭原则 : 定义 : 一个 软件实体 , 类 / 模块 / 函数 , 对 ...

  9. 软件设计原则——开闭原则

    开闭原则 对扩展开放,对修改关闭. 在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果.简言之,是为了使程序的扩展性好,易于维护和升级. 想要达到这样的效果,我们需要使用接口和抽象类 ...

最新文章

  1. torch序列化 pickle 慢
  2. mybatis直接使用自定义sql查询数据
  3. Python3学习笔记:使用代理访问url地址
  4. 【boundfield】GridView中BoundField与TemplateField的区别_boundfield
  5. gtp怎么安装系统_UEFI+GTP模式下使用GHO文件安装WIN7或WIN8系统图文教程详解
  6. Python3 文件读写(持续更新)
  7. mysql 开放远程连接权限连不上
  8. dbi mysql_DBI和DBD-mysql模块的安装_MySQL
  9. Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装
  10. 递归——阶乘加斐波那契数列(简单掌握递归思想的敲门砖)
  11. mysql 单块读 多块读_dbfilesequentialread等待事件
  12. 热烈庆祝个人博客突破1万人!
  13. Nginx从入门到掌握【(第3节(共3节)】
  14. 神经元与网络结构概论
  15. opera档案学习(一)
  16. nmap扫描服务器端口不稳定,端口扫描命令nmap
  17. Lync2013扩展开发
  18. CSS 样式属性大全
  19. 运算器组成实验(计算机组成原理)
  20. 开闭原则(Open Closed Principle)

热门文章

  1. 蚂蚁金服开放平台-支付宝新版接口的参数设置
  2. 蚂蚁区块链平台BaaS技术解析与实践 1
  3. 爬取QQ音乐周杰伦前五页歌曲的歌词
  4. 从零开始速通百度云网盘
  5. 对8421码,5421码,2421码,余3码的认识
  6. 使用Python获取股市市场概念数据
  7. 一起学时序分析之延迟与时钟偏斜和抖动
  8. DL之RNN:人工智能为你写周董歌词——基于TF利用RNN算法实现【机器为你作词】、训练测试过程全记录
  9. 大前端时代的挑战与机遇(深圳场)正式开放报名
  10. XGBoost之类别特征的处理