C++设计原则——开闭原则(持续更新中)
系列文章目錄
C++開閉原則
C++迪米特法則
文章目錄
- 系列文章目錄
- 前言
- 一、開閉原則到底有什么用?
- 二、開閉原則有什么特點(diǎn)
前言
在一個(gè)新人剛?cè)刖幊踢@一行的時(shí)候,可能在正式參加到一個(gè)項(xiàng)目之前跟著書本或者教學(xué)視屏寫了一些五子棋、貪吃蛇等等的小程序。
在參加工作之后,領(lǐng)導(dǎo)直接扔過來(lái)一個(gè)項(xiàng)目讓你看看代碼,你可能專心的在看這個(gè)接口調(diào)用了哪些接口、一個(gè)類包含哪些功能。
再之后,大多會(huì)讓你先參與維護(hù)的工作,等工作了一兩年,可能讓你獨(dú)立支持一個(gè)項(xiàng)目的部分功能實(shí)現(xiàn)。
但是在工作了兩三年后,如果讓你直接挑戰(zhàn)一個(gè)大項(xiàng)目,從零開始設(shè)計(jì)、搭建項(xiàng)目,你真的可以設(shè)計(jì)出既滿足功能、代碼又很優(yōu)雅、迭代維護(hù)性高的工程嗎?
或者你了解一些什么工廠模式、開閉原則等淺薄的知識(shí),覺得自己可以挑戰(zhàn)一個(gè)大型項(xiàng)目,但實(shí)際上這遠(yuǎn)遠(yuǎn)不夠。
或許有人會(huì)說(shuō)這是架構(gòu)師的職責(zé),但是假如等到你以后跳槽了,或者工齡大了升職了,還不能挑起一個(gè)大項(xiàng)目,想到這些你會(huì)不會(huì)想現(xiàn)在提升一下自己呢?
如果可以全面按照C++的設(shè)計(jì)原則,并靈活應(yīng)用設(shè)計(jì)模式的話,就可以磨練出支撐大型項(xiàng)目的能力,在我們?cè)O(shè)計(jì)的時(shí)候要時(shí)刻牢記這些原則。
|版本聲明:山河君,未經(jīng)博主允許,禁止轉(zhuǎn)載
一、開閉原則到底有什么用?
開閉原則屬于六大設(shè)計(jì)原則之一,百度百科上面介紹開閉原則:開閉原則規(guī)定“軟件中的對(duì)象(類,模塊,函數(shù)等等)應(yīng)該對(duì)于擴(kuò)展是開放的,但是對(duì)于修改是封閉的”,這意味著一個(gè)實(shí)體是允許在不改變它的源代碼的前提下變更它的行為。
所謂的開閉,也正是對(duì)擴(kuò)展和修改兩個(gè)行為的一個(gè)原則。強(qiáng)調(diào)的是用抽象構(gòu)建框架,用實(shí)現(xiàn)擴(kuò)展細(xì)節(jié)。可以提高軟件系統(tǒng)的可復(fù)用性及可維護(hù)性。
二、開閉原則有什么特點(diǎn)
以下是構(gòu)造了一個(gè)計(jì)算器,它具有最基本的加、減、乘、除的功能。運(yùn)行虛函數(shù)的方法使得計(jì)算機(jī)是一個(gè)純虛父類,使用時(shí)使用父類指針指向子類,直接使用父類指針調(diào)用計(jì)算方法即可。
其實(shí)特點(diǎn)在上面已經(jīng)說(shuō)過了,可以擴(kuò)展,但是不能修改,開閉原則充分利用了父類指針指向子類的原理,在實(shí)際應(yīng)用中,實(shí)際上我們能拿到的只有父類指針,根據(jù)指向去使用子類,所以會(huì)經(jīng)常出現(xiàn)一種問題,使用開閉原則,我們有的時(shí)候壓根就不知道父類指針指向的是哪里。
關(guān)于以上特性我們直接看一下代碼輸出。
#include <iostream> #include <stdlib.h> using namespace std;//計(jì)算器類 class Calculator { public://抽象接口類,子類實(shí)現(xiàn)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; }父類是一個(gè)計(jì)算器類,是一個(gè)抽象類,當(dāng)然不一定非得是抽象類,但是如果不是抽象類,就要注意釋放問題,其四個(gè)子類分別為加、減、乘、除。而在實(shí)際使用中,我們也是直接定義父類指針指向子類。當(dāng)然,我們也可以直接使用子類,只用加功能,但是實(shí)際上我們的邏輯是用計(jì)算器的加功能,我們用的是計(jì)算器,而不是拆分下來(lái)的東西。
為什么說(shuō)這樣就可以保證擴(kuò)展性而不能修改呢,實(shí)際上什么代碼只要你想,都可以修改,只是有沒有需要,而使用開閉原則就可以在實(shí)際開發(fā)過程中,讓開發(fā)人員自然而然的不會(huì)想到直接修改代碼,而是通過擴(kuò)展功能來(lái)實(shí)現(xiàn)需求。
比方說(shuō),在這個(gè)基礎(chǔ)上我想增加求根的功能:
如果咱們現(xiàn)在只有一個(gè)計(jì)算器類,這個(gè)類里面有加、減、乘、除四種方法,那么想增加求根功能我們自然而然會(huì)想到在計(jì)算器中增加求根的方法,這樣就修改了我們的源代碼。
而使用了開閉原則,父類中的純虛函數(shù)就有一個(gè)求值的接口getompute,開發(fā)人員就會(huì)增加一個(gè)新的子類,進(jìn)行求根的操作,這樣就不會(huì)直接修改源代碼。
總結(jié)
以上是生活随笔為你收集整理的C++设计原则——开闭原则(持续更新中)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ioca0中断 pic单片机_PIC单片
- 下一篇: 【c++】计算工资