最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++開放封閉原則示例解析

 更新時間:2023年02月27日 08:29:51   作者:北冥有魚丶丶  
在如那就的設(shè)計模式中,不能修改,但可以擴(kuò)展的實現(xiàn)是一條十分重要的原則,它是開放-封閉原則(The Open-Clossed Principle,簡稱OCP)或開-關(guān)閉原則

我們在做任何系統(tǒng)的時候,都不要指望系統(tǒng)一開始就完全確定需求,然后再也不發(fā)生變化,這是不現(xiàn)實,也是不科學(xué)的想法,既然需求是一定會發(fā)生變化的,那么如何在面對需求的變化時,設(shè)計的軟件可以相對容易修改,不至于說,新需求一來就要把整個程序都推倒重來呢?

開放-封閉原則可以做到這樣,所謂開放-封閉原則就是指軟件實體(類、函數(shù)、模塊等)應(yīng)該可以擴(kuò)展,但是不可以修改,即我們設(shè)計這個類的時候就盡量讓這個類足夠好,寫好了就不要去修改了,原來的代碼能不動則不動,如果新需求來,我們增加一些類就完事了。面對需求的改變,對程序的改動是通過增加新代碼進(jìn)行的,而不是更改現(xiàn)有的代碼,這就是開放-封閉原則的精神所在。

在我們最初編寫代碼時,假設(shè)變化不會發(fā)生。當(dāng)變化發(fā)生時,我們將創(chuàng)建抽象來隔離以后發(fā)生的同類變化。

在之前的這篇博客中,https://blog.csdn.net/weixin_44049823/article/details/128907849,我們實現(xiàn)了計算器的5個版本,這其中就運(yùn)用了開放-封閉原則,這里,我們通過該篇博客實現(xiàn)的2.0版本和4.0版本來學(xué)習(xí)開放-封閉原則。

2.0版本:

#include<iostream>
using namespace std;
#include<string>
class opeException
{
public:
	void getMessage()
	{
		cout << "您的輸入有誤!" << endl;
	}
};
//判斷一個字符串是不是數(shù)字
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 << "請輸入左操作數(shù):" << endl;
		cin >> num1;
		if (!isStringNum(num1))
			throw opeException();
		cout << "請輸入右操作數(shù):" << 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 << "除數(shù)不能為0" << endl;
		}
	}
	catch (opeException ex)
	{
		ex.getMessage();
	}
	return 0;
}

在計算器2.0版本中,如果我們要增加開平方、平方、立方等運(yùn)算,需要對代碼進(jìn)行大量修改,這顯然不滿足開放-封閉原則,可維護(hù)性很差,面對這些可能的變化,在4.0版本的代碼中將各種具體運(yùn)算,比如加減乘除分別抽象成為加法類、減法類、乘法類、除法類,這樣如果我們需要增加一些運(yùn)算,面對這些變化,我們只需要再創(chuàng)建相應(yīng)的運(yùn)算類即可。

4.0版本:

#include<iostream>
using namespace std;
#include<string>
//業(yè)務(wù)邏輯
//異常類用于處理異常情況
class opeException
{
public:
	void getMessage()
	{
		cout << "您的輸入有誤!" << endl;
	}
};
//運(yùn)算類
class Operation
{	
	//判斷一個字符串是不是數(shù)字
	bool isStringNum(string& s)
	{
		bool flag = true;
		for (auto e : s)
			if (!(isdigit(e)))
			{
				flag = false;
				break;
			}
		return flag;
	}
protected:
//判斷輸入的操作數(shù)和操作符是否有誤
	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;
};
//加法運(yùn)算類
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;
	}
};
//減法運(yùn)算類
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;
	}
};
//乘法運(yùn)算類
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;
	}
};
//除法運(yùn)算類
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 << "請輸入左操作數(shù):" << endl;
		cin >> _strNum1;
		cout << "請輸入右操作數(shù):" << 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;
}

當(dāng)然,并不是什么時候應(yīng)對變化都是容易的。我們希望的是在開發(fā)工作展開不久就知道可能發(fā)生的變化。查明可能發(fā)生的變化所等待的時間越長,要創(chuàng)建正確的抽象就越困難。比如,如果加減運(yùn)算都在很多地方應(yīng)用了,再考慮抽象、考慮分離,就很困難。

開放-封閉原則是面向?qū)ο笤O(shè)計的核心所在。遵循這個原則可以帶來面向?qū)ο蠹夹g(shù)所聲稱的巨大好處,也就是可維護(hù)、可擴(kuò)展、可復(fù)用、靈活性好。開發(fā)人員應(yīng)該僅對程序中呈現(xiàn)出頻繁變化的那些部分做出抽象,然而,對于應(yīng)用程序中的每個部分都刻意地進(jìn)行抽象同樣不是一個好主意。拒絕不成熟的抽象和抽象本身一樣重要。

到此這篇關(guān)于C++開放封閉原則示例解析的文章就介紹到這了,更多相關(guān)C++開放封閉原則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C語言通訊錄管理系統(tǒng)完整代碼

    C語言通訊錄管理系統(tǒng)完整代碼

    這篇文章主要為大家詳細(xì)介紹了C語言通訊錄管理系統(tǒng)完整代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • C++中將string類型轉(zhuǎn)化為int類型

    C++中將string類型轉(zhuǎn)化為int類型

    本文主要介紹了C++中將string類型轉(zhuǎn)化為int類型的方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 使用c++實現(xiàn)OpenCV繪制旋轉(zhuǎn)矩形圖形

    使用c++實現(xiàn)OpenCV繪制旋轉(zhuǎn)矩形圖形

    這篇文章主要給大家介紹了使用c++實現(xiàn)OpenCV繪制圖形旋轉(zhuǎn)矩形的方法案例,通過圖文及代碼形式進(jìn)行了詳細(xì)的描述,有需要的朋友可以參考下,希望可以有所幫助
    2021-08-08
  • 編寫C++程序使DirectShow進(jìn)行視頻捕捉

    編寫C++程序使DirectShow進(jìn)行視頻捕捉

    這篇文章主要介紹了如何編寫C++程序來使DirectShow進(jìn)行視頻捕捉的方法,DirectShow是微軟公司在ActiveMovie和Video for Windows的基礎(chǔ)上推出的新一代基于COM(Component Object Model)的流媒體處理的開發(fā)包,要的朋友可以參考下
    2016-03-03
  • C++超詳細(xì)講解泛型

    C++超詳細(xì)講解泛型

    泛型編程,故如其名,是一個泛化的編程方式。其實現(xiàn)原理為程序員編寫一個函數(shù)/類的代碼示例,讓編譯器去填補(bǔ)出不同的函數(shù)實現(xiàn)
    2022-07-07
  • C++進(jìn)程共享數(shù)據(jù)封裝成類實例

    C++進(jìn)程共享數(shù)據(jù)封裝成類實例

    這篇文章主要介紹了C++進(jìn)程共享數(shù)據(jù)封裝成類的方法,以實例形式講述了其封裝代碼與具體用法,具有一定的實用價值,需要的朋友可以參考下
    2014-10-10
  • C++指向類成員的指針詳解

    C++指向類成員的指針詳解

    指向類成員的指針總的來講可以分為兩大類四小類(指向數(shù)據(jù)成員還是成員函數(shù),指向普通成員還是靜態(tài)成員),希望本片文章能給你帶來幫助
    2021-09-09
  • C++實現(xiàn)LeetCode(143.鏈表重排序)

    C++實現(xiàn)LeetCode(143.鏈表重排序)

    這篇文章主要介紹了C++實現(xiàn)LeetCode(143.鏈表重排序),本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 基于Qt實現(xiàn)日志打印系統(tǒng)

    基于Qt實現(xiàn)日志打印系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了如何利用Qt開發(fā)一個日志打印系統(tǒng),可以實現(xiàn)打印日志按日期、大小保存,過期刪除,窗口實時顯示日志,網(wǎng)絡(luò)傳輸日志遠(yuǎn)程調(diào)試,需要的可以參考下
    2023-12-12
  • C++入門到精通之循環(huán)語句的使用教程

    C++入門到精通之循環(huán)語句的使用教程

    這篇文章主要給大家介紹了關(guān)于C++中循環(huán)語句的用法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評論

女性| 平定县| 兰坪| 延津县| 托里县| 西林县| 德钦县| 罗源县| 历史| 许昌县| 彭阳县| 宜都市| 连城县| 毕节市| 团风县| 屏东县| 乌拉特后旗| 嵊泗县| 沐川县| 泾源县| 龙井市| 合川市| 吉林省| 区。| 南宫市| 定南县| 东源县| 永吉县| 淄博市| 平南县| 资阳市| 华池县| 庄浪县| 墨江| 静乐县| 顺平县| 沁源县| 阳原县| 和平区| 班戈县| 渭源县|