iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++开放封闭原则示例解析
  • 315
分享到

C++开放封闭原则示例解析

C++开放封闭原则C++开闭原则 2023-02-27 08:02:00 315人浏览 独家记忆
摘要

我们在做任何系统的时候,都不要指望系统一开始就完全确定需求,然后再也不发生变化,这是不现实,也是不科学的想法,既然需求是一定会发生变化的,那么如何在面对需求的变化时,设计的软件可以相

我们在做任何系统的时候,都不要指望系统一开始就完全确定需求,然后再也不发生变化,这是不现实,也是不科学的想法,既然需求是一定会发生变化的,那么如何在面对需求的变化时,设计的软件可以相对容易修改,不至于说,新需求一来就要把整个程序都推倒重来呢?

开放-封闭原则可以做到这样,所谓开放-封闭原则就是指软件实体(类、函数、模块等)应该可以扩展,但是不可以修改,即我们设计这个类的时候就尽量让这个类足够好,写好了就不要去修改了,原来的代码能不动则不动,如果新需求来,我们增加一些类就完事了。面对需求的改变,对程序的改动是通过增加新代码进行的,而不是更改现有的代码,这就是开放-封闭原则的精神所在。

在我们最初编写代码时,假设变化不会发生。当变化发生时,我们将创建抽象来隔离以后发生的同类变化。

在之前的这篇博客中,https://blog.csdn.net/weixin_44049823/article/details/128907849,我们实现了计算器的5个版本,这其中就运用了开放-封闭原则,这里,我们通过该篇博客实现的2.0版本和4.0版本来学习开放-封闭原则。

2.0版本:

#include<iOStream>
using namespace std;
#include<string>
class opeException
{
public:
	void getMessage()
	{
		cout << "您的输入有误!" << endl;
	}
};
//判断一个字符串是不是数字
bool isStringNum(string& s)
{
	bool flag = true;
	for (auto e : s)
		if (!isdigit(e))
		{
			flag = false;
			break;
		}	
	return flag;
}
int main()
{
	string num1 = "0";
	string num2 = "0";
	string ope = " ";
	try
	{
		cout << "请输入左操作数:" << endl;
		cin >> num1;
		if (!isStringNum(num1))
			throw opeException();
		cout << "请输入右操作数:" << endl;
		cin >> num2;
		if (!isStringNum(num2))
			throw opeException();
		cout << "请输入操作符" << endl;
		cin >> ope;
		if (ope != "+" && ope != "-" && ope != "*" && ope != "/")
			throw opeException();
		if (ope == "+")
		{
			cout<< stoi(num1) + stoi(num2)<<endl;
		}
		else if (ope == "-")
		{
			cout << stoi(num1) - stoi(num2) << endl;
		}
		else if (ope == "*")
		{
			cout << stoi(num1) * stoi(num2) << endl;
		}
		else if (ope == "/")
		{
			if (stoi(num2) != 0)
			{
				cout << stoi(num1) / stoi(num2) << endl;
			}
			else
				cout << "除数不能为0" << endl;
		}
	}
	catch (opeException ex)
	{
		ex.getMessage();
	}
	return 0;
}

在计算器2.0版本中,如果我们要增加开平方、平方、立方等运算,需要对代码进行大量修改,这显然不满足开放-封闭原则,可维护性很差,面对这些可能的变化,在4.0版本的代码中将各种具体运算,比如加减乘除分别抽象成为加法类、减法类、乘法类、除法类,这样如果我们需要增加一些运算,面对这些变化,我们只需要再创建相应的运算类即可。

4.0版本:

#include<iostream>
using namespace std;
#include<string>
//业务逻辑
//异常类用于处理异常情况
class opeException
{
public:
	void getMessage()
	{
		cout << "您的输入有误!" << endl;
	}
};
//运算类
class Operation
{	
	//判断一个字符串是不是数字
	bool isStringNum(string& s)
	{
		bool flag = true;
		for (auto e : s)
			if (!(isdigit(e)))
			{
				flag = false;
				break;
			}
		return flag;
	}
protected:
//判断输入的操作数和操作符是否有误
	bool isError(string& _strNum1, string& _strNum2, string& _ope)
	{
		if (!(Operation::isStringNum(_strNum1) && Operation::isStringNum(_strNum2) && (_ope == "+" || _ope == "-" || _ope == "*" || _ope == "/")))
		{
			return false;
		}
	}
public:
	virtual int getResult() = 0;
};
//加法运算类
class addOperation:public Operation
{
private:
	string strNum1;
	string strNum2;
	string ope;
	int re;
public:
	addOperation(string& _strNum1, string& _strNum2, string& _ope) :strNum1(_strNum1),strNum2(_strNum2),ope(_ope),re(0) {}
	virtual int getResult() override
	{
		if (!isError(strNum1, strNum2, ope))
			throw opeException();
		else
			re = stoi(strNum1) + stoi(strNum2);
		return re;
	}
};
//减法运算类
class subOperation :public Operation
{
private:
	string strNum1;
	string strNum2;
	string ope;
	int re;
public:
	subOperation(string& _strNum1, string& _strNum2, string& _ope) :strNum1(_strNum1), strNum2(_strNum2), ope(_ope), re(0) {}
	virtual int getResult() override
	{
		if (!isError(strNum1, strNum2, ope))
			throw opeException();
		else
			re = stoi(strNum1) - stoi(strNum2);
		return re;
	}
};
//乘法运算类
class mulOperation :public Operation
{
private:
	string strNum1;
	string strNum2;
	string ope;
	int re;
public:
	mulOperation(string& _strNum1, string& _strNum2, string& _ope) :strNum1(_strNum1), strNum2(_strNum2), ope(_ope), re(0) {}
	virtual int getResult() override
	{
		if (!isError(strNum1, strNum2, ope))
			throw opeException();
		else
			re = stoi(strNum1) * stoi(strNum2);
		return re;
	}
};
//除法运算类
class divOperation :public Operation
{
private:
	string strNum1;
	string strNum2;
	string ope;
	int re;
public:
	divOperation(string& _strNum1, string& _strNum2, string& _ope) :strNum1(_strNum1), strNum2(_strNum2), ope(_ope), re(0) {}
	virtual int getResult() override
	{
		if (!isError(strNum1, strNum2, ope))
			throw opeException();
		else if (stoi(strNum2) != 0)
			re = stoi(strNum1) / stoi(strNum2);
		else
			throw opeException();
		return re;
	}
};
//界面逻辑
int main()
{
	try
	{
		string _strNum1 = " ";
		string _strNum2 = " ";
		string _ope = " ";
		cout << "请输入左操作数:" << endl;
		cin >> _strNum1;
		cout << "请输入右操作数:" << endl;
		cin >> _strNum2;
		cout << "请输入操作符:" << endl;
		cin >> _ope;
		if (_ope == "+")
		{
			addOperation addoperation(_strNum1, _strNum2, _ope);
			cout << addoperation.getResult() << endl;
		}
		else if (_ope == "-")
		{
			subOperation suboperation(_strNum1, _strNum2, _ope);
			cout << suboperation.getResult() << endl;
		}
		else if (_ope == "*")
		{
			mulOperation muloperation(_strNum1, _strNum2, _ope);
			cout << muloperation.getResult() << endl;
		}
		else if (_ope == "/")
		{
			divOperation muloperation(_strNum1, _strNum2, _ope);
			cout << muloperation.getResult() << endl;
		}
		else
			cout << "您的输入有误!" << endl;
	}
	catch (opeException ex)
	{
		cout << "您的输入有误" << endl;
	}
	return 0;
}

当然,并不是什么时候应对变化都是容易的。我们希望的是在开发工作展开不久就知道可能发生的变化。查明可能发生的变化所等待的时间越长,要创建正确的抽象就越困难。比如,如果加减运算都在很多地方应用了,再考虑抽象、考虑分离,就很困难。

开放-封闭原则是面向对象设计的核心所在。遵循这个原则可以带来面向对象技术所声称的巨大好处,也就是可维护、可扩展、可复用、灵活性好。开发人员应该仅对程序中呈现出频繁变化的那些部分做出抽象,然而,对于应用程序中的每个部分都刻意地进行抽象同样不是一个好主意。拒绝不成熟的抽象和抽象本身一样重要。

到此这篇关于c++开放封闭原则示例解析的文章就介绍到这了,更多相关C++开放封闭原则内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++开放封闭原则示例解析

本文链接: https://www.lsjlt.com/news/197585.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++开放封闭原则示例解析
    我们在做任何系统的时候,都不要指望系统一开始就完全确定需求,然后再也不发生变化,这是不现实,也是不科学的想法,既然需求是一定会发生变化的,那么如何在面对需求的变化时,设计的软件可以相...
    99+
    2023-02-27
    C++开放封闭原则 C++开闭原则
  • C++开放封闭原则实例代码分析
    这篇文章主要介绍“C++开放封闭原则实例代码分析”,在日常操作中,相信很多人在C++开放封闭原则实例代码分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++开放封闭原则实例代码分析”的疑惑有所帮助!接下来...
    99+
    2023-07-05
  • java面向对象设计原则之开闭原则示例解析
    概念 唯一不变的是不断的变化,在软件开发中应该对需求的变化持开放态度,我们要做的就是如何将这种变化对我们现有的成果带来最小的冲击。开闭原则直接面对面向对象程序的目标扩展性和可维护性,...
    99+
    2024-04-02
  • Java开闭原则实例分析
    这篇文章主要介绍“Java开闭原则实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java开闭原则实例分析”文章能帮助大家解决问题。定义开闭原则( Open Close Principle )...
    99+
    2023-06-29
  • 浅谈Java设计模式之开放封闭原则
    写在前面最近, 接手了一个新业务,系统的架构可圈可点。但有些地方让人望而生畏,有些代码臃肿难以维护,让人不敢恭维。于是,结合了Java的开放封闭原则,对其中一部分代码进行了重构优化。先来看下以前系统的老代码ShareChannelManag...
    99+
    2023-05-31
    开放 封闭 ava
  • 开放封闭原则_动力节点Java学院整理
    定义:软件实体(类、模块、函数等)应该是可以扩展的,但是不可修改。对于扩展是开放的,对于更改是封闭的。关键是抽象,将一个功能的通用部分和实现细节部分清晰的分离开来。这里要求我们写代码要有抽象的概念。什么是抽象?指由实体抽离出概念的思考过程。...
    99+
    2023-05-31
    开放封闭原则 java ava
  • C#面向对象编程中开闭原则的示例详解
    目录开闭原则C# 示例改进总结在面向对象编程中,SOLID 是五个设计原则的首字母缩写,旨在使软件设计更易于理解、灵活和可维护。这些原则是由美国软件工程师和讲师罗伯特&mi...
    99+
    2024-04-02
  • C#面向对象设计原则之开闭原则
    开闭原则(OCP) 定义:对扩展开发,对修改关闭。好处: 适应性和灵活性。稳定性和延续性。可复用性与可维护性。 解释说明:开闭原则指的是两方面:对功能扩展开发,对修改进行关闭;有时当...
    99+
    2024-04-02
  • epoll封装reactor原理剖析示例详解
    目录reactor是什么?reactor模型三个重要组件与流程分析组件流程将epoll封装成reactor事件驱动封装每一个连接sockfd变成ntyevent封装epfd和ntye...
    99+
    2024-04-02
  • C++单一职责原则示例代码浅析
    单一职责原则: 就一个类而言,应该只有一个引起它变化的原因,如果一个类承担的职责过多就等于把这些职责耦合在一起,至少会造成以下两方面的问题: 我们要去修改该类中的一个职责可能会影响到...
    99+
    2023-02-27
    C++ 单一职责 C++ 单一职责原则
  • C#中依赖倒置原则DIP的示例分析
    这篇文章主要介绍C#中依赖倒置原则DIP的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、前言我们先来看看传统的三层架构,如下图所示:从上图中我们可以看到:在传统的三层架构中,层与层之间是相互依赖的,UI层...
    99+
    2023-06-29
  • AndroidMediaPlayer音频播放器封装示例浅析
    在 Android 中封装优雅的 MediaPlayer 音频播放器,可以遵循以下几个原则: 采用单例模式,确保整个应用中只有一个播放器实例,避免资源浪费和冲突。封装音频播放器的基本...
    99+
    2023-05-15
    Android MediaPlayer音频播放器 Android MediaPlayer Android音频播放器
  • Sentinel熔断规则原理示例详解分析
    目录概述熔断(降级)策略慢调用比例概念测试异常比例概念测试异常数概念测试概述 除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。 由于调用关系的复杂...
    99+
    2024-04-02
  • CSS设计原则的示例分析
    今天就跟大家聊聊有关CSS设计原则的示例分析,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。相信大多数人都有过关于CSS的痛苦经历,从我加入公司到现在...
    99+
    2024-04-02
  • Java设计模式七大原则之开闭原则详解
    目录定义案例需求方案一执行结果方案二执行结果对比分析总结定义 开闭原则( Open Close Principle ),又称为OCP原则,即一个软件实体如类,模块和函数应该对扩展开放...
    99+
    2024-04-02
  • JavaScript解析机制与闭包原理的示例分析
    小编给大家分享一下JavaScript解析机制与闭包原理的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!具体如下:js解...
    99+
    2024-04-02
  • Java设计模式之开闭原则精解
    目录1.什么是开闭原则?2.违反Ocp代码案例3.遵守Ocp代码案例1.什么是开闭原则? 开闭原则(Open Closed Principle)是编程中最基础、最重要的设计原则。一个...
    99+
    2024-04-02
  • MySQL索引创建原则的示例分析
    小编给大家分享一下MySQL索引创建原则的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、适合创建索引1、字段的数值有唯一性限制根据Alibaba规范,...
    99+
    2023-06-29
  • C#中正则表达式的示例分析
    这篇文章将为大家详细讲解有关C#中正则表达式的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。(1)“@”符号符下两ows表研究室的火热,当晨在“@”虽然并非C#正则表达式的“成员”,但是它经常与C...
    99+
    2023-06-18
  • Go语言基础闭包的原理分析示例详解
    目录一. 闭包概述二. 代码演示运行结果代码说明一. 闭包概述 闭包就是解决局部变量不能被外部访问的一种解决方案 闭包是把函数当作返回值的一种应用 二. 代码演示...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作