系列文章目录

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. Oracle嵌套表实例说明
  2. 哪个版本好_《道德经》道尽人生大智慧,哪个版本《道德经》的注释比较好呢?...
  3. 计算机软考证书英文名称完全翻译指南
  4. 近似装箱问题(三种联机算法实现)
  5. python保留字的是_Python保留字
  6. 山东大学2017-2018年校历
  7. linux下pip换源——修改pip.conf文件
  8. 2021年互联网公司春招有何新变化?大厂要求是这样!
  9. android编译framework架包运行报错 (转)
  10. acer软件保护卡怎么解除_Acer软件保护卡下载
  11. 5号,7号电池充电时间计算方法
  12. css页脚怎么居中,无法使我的页脚内容居中
  13. 读懂K线,就能理解期货股票交易中人性的期望、猜疑、幻想、贪婪、恐惧...
  14. 借助MATLAB与SIMULINK仿真嵌入式C算法
  15. 蓝湖--UI切图软件,适用于ios,安卓,Web
  16. #KINDLE 电子书制作指南 html转kf8/mobi
  17. NB-IoT的上行SC-FDMA与下行OFDMA的matlab误码率仿真
  18. 验证集和测试集的区别?
  19. 考试自动评分系统C语言改错,基于XML结构的C语言考试的自动评分系统.doc
  20. c#操作Excel类

热门文章

  1. 相比微信、支付宝支付,apple pay支付优缺点是什么呢?
  2. 服务器主板显示e2,大金中央空调有一台机面板显示E2是什么问题如何解决故障...
  3. 淘宝/天猫API接口,买家卖家订单信息获取
  4. 如果不做测试了,自己还能干点啥?
  5. The Places of Our Lives: Visiting Patterns and Automatic Labeling from Longitudinal Smartphone Data
  6. 当领导招了100个初级开发去做3个资深开发的工作
  7. 手机浏览器能接收彩信,还hold住吗?
  8. 各路牛人【找工总结】
  9. qml----Model/View入门(四)XmlListModel
  10. 基于ssm流浪猫狗|流浪狗宠物救助网站