• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

      設(shè)計(jì)模式之狀態(tài)模式在C++教學(xué)中的運(yùn)用

      2016-11-30 12:54:59王金娟彭浩
      計(jì)算機(jī)時(shí)代 2016年10期
      關(guān)鍵詞:設(shè)計(jì)模式面向?qū)ο?/a>語言

      王金娟 彭浩

      摘 要: 針對(duì)C++語言程序設(shè)計(jì)課程教學(xué)出現(xiàn)的問題,提出引入部分設(shè)計(jì)模式的思想講解面向?qū)ο蟮木幊趟枷?,給出在教學(xué)過程中講解抽象類與純虛函數(shù)概念引入狀態(tài)模式的案例。從教學(xué)實(shí)踐效果來看,這種教學(xué)方法提高了學(xué)生的學(xué)習(xí)積極性,提高了學(xué)生的實(shí)際編程能力和計(jì)算機(jī)思維能力。

      關(guān)鍵詞: C++語言; 設(shè)計(jì)模式; 狀態(tài)模式; 面向?qū)ο?/p>

      中圖分類號(hào):G642 文獻(xiàn)標(biāo)志碼:A 文章編號(hào):1006-8228(2016)10-90-03

      Application of state pattern in C++ language teaching

      Wang Jinjuan, Peng Hao

      (Hunan International Economics University, Changsha, Hunan 410205, China)

      Abstract: According to the present problem of the C++ language course teaching, this paper puts forward an argument of introducing some ideas of design pattern to explain the programming thought of object-oriented, and gives an example case that the state pattern is introduced to explain the concepts of abstract class and pure virtual function in the teaching process. From the practical teaching effect, the teaching method has increased the students' learning enthusiasm, and improved the students' practical programming ability and computer thinking.

      Key words: C++ language; design pattern; state pattern; object-oriented

      0 引言

      C++語言程序設(shè)計(jì)是大部分計(jì)算機(jī)學(xué)科的專業(yè)基礎(chǔ)課,它同時(shí)也是學(xué)習(xí)面向?qū)ο缶幊趟枷氲闹匾n程。它的先導(dǎo)課程C語言是一種純粹面向過程的語言,側(cè)重算法的設(shè)計(jì)、功能的實(shí)現(xiàn),強(qiáng)調(diào)函數(shù)之間調(diào)用。由于C++語言完全兼容C語言面向過程特性,所以它涵蓋了面向過程與面向?qū)ο髢刹糠謨?nèi)容[1],相較于純粹的面向?qū)ο笳Z言,比如Java語言注重分析抽取類、建立模型設(shè)計(jì)類之間的關(guān)系,設(shè)計(jì)各個(gè)類的成員變量、成員函數(shù),通過類與類之間的相互協(xié)調(diào)完成任務(wù),這與面向過程的思想大為不同。

      在教學(xué)中發(fā)現(xiàn),大多數(shù)學(xué)生更習(xí)慣于用面向過程的設(shè)計(jì)思路,首先設(shè)計(jì)函數(shù)功能及相關(guān)算法,再把所有的函數(shù)放在一個(gè)類中,這些函數(shù)都是靜態(tài)的,雖然有一個(gè)類,但并沒有類的設(shè)計(jì),也沒有體現(xiàn)面向?qū)ο蟮脑O(shè)計(jì)思想[2]。仔細(xì)分析發(fā)現(xiàn),由面向過程的編程轉(zhuǎn)為面向?qū)ο蟮木幊?,存在?jì)算思維上的轉(zhuǎn)換和跳躍,這種跳躍無論對(duì)于學(xué)生還是教師都需要認(rèn)真思索。面向?qū)ο缶幊趟枷敫映橄?,理解起來更困難,而面向?qū)ο缶幊趟枷胫杏职嗣嫦蜻^程的基本編程模式,如成員函數(shù)的定義、成員屬性的定義,這會(huì)使學(xué)生感覺面向?qū)ο缶幊叹褪前炎兞糠旁陬惱锩?,就是多了一個(gè)類的框架而已。在介紹封裝、繼承、多態(tài)這三個(gè)面向?qū)ο缶幊套钪匾娜笾R(shí)點(diǎn)時(shí),教材上的實(shí)例顯得簡(jiǎn)單,無法加深對(duì)于類和對(duì)象概念的深入理解,最終導(dǎo)致學(xué)生在糊里糊涂的狀態(tài)下采用C語言的代碼風(fēng)格寫出了C++的類。

      針對(duì)這樣的教學(xué)困境,我們嘗試將設(shè)計(jì)模式的部分思想如狀態(tài)模式,引入C++面向?qū)ο蟪绦蛟O(shè)計(jì)的教學(xué)中,設(shè)計(jì)模式是培養(yǎng)面向?qū)ο笥?jì)算思維的一個(gè)良好途徑,是一套被反復(fù)使用、經(jīng)過分類編目的代碼設(shè)計(jì)經(jīng)驗(yàn)的總結(jié)[3]。經(jīng)過幾學(xué)期的教學(xué)實(shí)踐表明,在C++面向?qū)ο蟪绦蛟O(shè)計(jì)的教學(xué)過程中引入部分設(shè)計(jì)模式相關(guān)內(nèi)容,能提高他們舉一反三的學(xué)習(xí)能力[4],非常有助于加深學(xué)生對(duì)面向?qū)ο蟪绦蛟O(shè)計(jì)思想的理解。

      1 教學(xué)方案設(shè)計(jì)

      軟件設(shè)計(jì)模式,經(jīng)過分類編目歸納為創(chuàng)建型、結(jié)構(gòu)型和行為型共三大類23種模式,且還在不斷發(fā)展。它反應(yīng)了面向?qū)ο笤O(shè)計(jì)思想在軟件設(shè)計(jì)過程中如何重復(fù)使用,并能以此構(gòu)造出程序的良好結(jié)構(gòu),每個(gè)設(shè)計(jì)模式的說明有名稱、意圖、實(shí)用性、結(jié)構(gòu)、效果、實(shí)現(xiàn)方法、代碼示例等[5],這些設(shè)計(jì)方法可以讓開發(fā)者深入了解面向?qū)ο笏枷氲木A。

      學(xué)習(xí)設(shè)計(jì)模式在C++教學(xué)過程中并不是教學(xué)核心,學(xué)生不需要學(xué)習(xí)和掌握全部設(shè)計(jì)模式,而是選擇適當(dāng)?shù)哪J皆谶m當(dāng)?shù)臅r(shí)候引入課堂教學(xué),這需要遵循一定的教學(xué)方法。首先,將原先注重講解語法的教學(xué)模式,改變?yōu)榘咐?qū)動(dòng)型教學(xué)模式。案例驅(qū)動(dòng)模式,不再單一地講解一個(gè)知識(shí)點(diǎn),而是改成提出一個(gè)主題,設(shè)計(jì)相關(guān)的類和功能,可以運(yùn)用一些方法如設(shè)計(jì)模式中的一些適合這個(gè)主題的某一種模式,然后圍繞著這個(gè)模式討論可行的解決方法,此時(shí)可以介紹這種模式的基本思想,但是不用深入討論概念的描述,這對(duì)于初學(xué)者不太適合。其次,介紹區(qū)別于流程圖的UML類圖,畫圖是大多數(shù)學(xué)生比較感興趣的一項(xiàng)任務(wù),引導(dǎo)學(xué)生把討論的方案用圖表達(dá)出來,在畫圖的過程中穿插講解類于類之間的關(guān)系,不理解的類或者關(guān)系應(yīng)該多次討論再要求學(xué)生畫出來,盡量做到生動(dòng)有趣,以幫助理解類和對(duì)象是動(dòng)態(tài)的而非靜態(tài)的思想。最后,引導(dǎo)學(xué)生將前兩步的工作建立一個(gè)工程完成相應(yīng)的代碼編寫,并讓學(xué)生自己做總結(jié)。教師對(duì)本次討論的主題進(jìn)行講評(píng)。

      2 狀態(tài)模式在教學(xué)中的案例運(yùn)用

      案例驅(qū)動(dòng)型教學(xué)模式是這次教學(xué)改革的主要任務(wù),教師在課堂上提出一個(gè)討論主題案例,講解基礎(chǔ)知識(shí),學(xué)生回答問題并討論,在結(jié)合某種經(jīng)典設(shè)計(jì)模式講解,這樣不僅加深了學(xué)生對(duì)與繼承、多態(tài)、封裝、虛函數(shù)等概念的理解,也大大提高了學(xué)生自由思考,舉一反三的能力,對(duì)于編程的能力也上了一個(gè)新的臺(tái)階。

      這里以講解面向?qū)ο笾休^難理解的抽象類和純虛函數(shù)的教學(xué)過程為例,本節(jié)教學(xué)目標(biāo)是通過引入設(shè)計(jì)模式中的狀態(tài)模式讓學(xué)生了解抽象類的概念、純虛函數(shù)的用途。

      ⑴ 案例引入:某公司力排萬難終于獲得某個(gè)酒店的系統(tǒng)開發(fā)項(xiàng)目,最終交由你負(fù)責(zé)。圖1是系統(tǒng)的主要工作,每個(gè)框都代表了酒店房間當(dāng)前狀態(tài),箭頭表示房間狀態(tài)的轉(zhuǎn)換。分析如下:房間有三個(gè)狀態(tài),即空閑、已預(yù)訂、已入?。粻顟B(tài)與狀態(tài)之間可以根據(jù)客戶的動(dòng)作來進(jìn)行轉(zhuǎn)換。

      ⑵ 提出問題:定義一個(gè)房間Room類,如何將房間的每個(gè)狀態(tài)整合起來?許多同學(xué)迅速反應(yīng),這個(gè)“最簡(jiǎn)單”就是if…else if…else,先設(shè)置房間三個(gè)狀態(tài)的靜態(tài)變量:空閑狀態(tài)FREEMTIME_STATE=0、已預(yù)訂狀態(tài)BOOKED_STATE=1、已入住狀態(tài)CHECKIN_STATE=2,并給出四個(gè)動(dòng)作對(duì)應(yīng)的函數(shù):預(yù)訂、入住、退訂、退房。以下列出預(yù)訂函數(shù)的偽代碼,并如法炮制出了類似的其他三個(gè)功能函數(shù):

      void Room::bookRoom() { /*預(yù)定*/

      if(state==FREEMTIME_STATE) { //空閑可預(yù)訂

      if(count>0) {

      cout<<"房間空閑,完成預(yù)訂"<

      state=BOOKED_STATE; //改變房間狀態(tài):已預(yù)訂

      count --;

      if(count==0) {

      cout<<"不好意思,房間已訂完,歡迎您的下次光臨!"<

      }

      }

      else {

      cout<<"不好意思,房間已訂完,歡迎您的下次光臨!"<

      }

      }

      else if(state==BOOKED_STATE) {

      cout<<"該房間已經(jīng)被預(yù)定了"<

      }

      else if(state==CHECKIN_STATE) {

      cout<<"該房間已經(jīng)有人住了"<

      }

      }

      ⑶ 狀態(tài)模式的引入:這個(gè)復(fù)雜的if…else if…else你是否滿意?這個(gè)不是C語言的代碼嗎?哪里體現(xiàn)了面向?qū)ο??如果客戶要求將某些房間保留下來以作為備用怎么辦?于是,悲劇就發(fā)生了,這就必須要在所有的操作里都要判斷該房間是否為備用房間,這對(duì)于代碼的改變量太大了,也體現(xiàn)出一開始的設(shè)計(jì)出現(xiàn)了嚴(yán)重了問題。這個(gè)時(shí)候需要換一個(gè)角度思考,以狀態(tài)為原子來改變它的行為,而不是通過行為來改變狀態(tài),這就是設(shè)計(jì)模式里的狀態(tài)模式。

      狀態(tài)模式是允許對(duì)象在內(nèi)部狀態(tài)發(fā)生改變時(shí)改變它的行為,對(duì)象看起來好像修改了它的類。一個(gè)對(duì)象的行為取決于它的一個(gè)或多個(gè)變化的屬性,這些屬性我們稱之為狀態(tài),這個(gè)對(duì)象稱之為狀態(tài)對(duì)象。對(duì)于狀態(tài)對(duì)象,它的行為依賴于它的狀態(tài),比如現(xiàn)在這個(gè)案例中的預(yù)訂房間,只有當(dāng)該房間為空閑時(shí)才能預(yù)訂,入住該房間的條件也只有預(yù)訂了該房間或者該房間為空閑時(shí)。對(duì)于這樣的一個(gè)對(duì)象,當(dāng)它在與外部事件產(chǎn)生互動(dòng)的時(shí)候,其內(nèi)部狀態(tài)就會(huì)發(fā)生改變,從而使得其行為也隨之發(fā)生改變,和學(xué)生一起設(shè)計(jì)類的UML如圖2。

      ⑷ 抽象類和純虛函數(shù):如何完成這個(gè)工程,可以設(shè)計(jì)一個(gè)專門描述狀態(tài)的抽象類State,它包含了預(yù)訂房間bookRoom()、入住checkInRoom()、退房checkOutRoom()及取消預(yù)訂cancel()四個(gè)虛函數(shù);Room類里包含State類的三個(gè)對(duì)象空閑狀態(tài)State freeTimeState、入住狀態(tài)State checkInState、預(yù)訂狀態(tài)State bookedState;再具體實(shí)現(xiàn)三個(gè)空閑、預(yù)訂、入住狀態(tài)類,下面給出預(yù)訂狀態(tài)的部分偽代碼:

      class FreeTimeState:public State {

      Room hotelManagement;

      FreeTimeState(Room hotelManagement)

      { this.hotelManagement=hotelManagement; }

      void bookRoom() {

      cout<<"您已經(jīng)成功預(yù)定了!"<

      hotelManagement.setState(hotelManagement.getBookedState()); //狀態(tài)改為已預(yù)訂

      }

      void checkInRoom() {

      cout<<"您已經(jīng)成功入住了!"<

      hotelManagement.setState(hotelManagement.getCheckInState()); //狀態(tài)改為已入住

      }

      public void checkOutRoom() { } //為空,不需要實(shí)現(xiàn)

      }

      ⑸ 總結(jié):明確抽象類和純虛函數(shù)的實(shí)際意義,與普通類于函數(shù)的區(qū)別在哪里。狀態(tài)模式可以讓多個(gè)環(huán)境對(duì)象共享一個(gè)狀態(tài)對(duì)象,從而減少系統(tǒng)中對(duì)象的個(gè)數(shù),特別適合代碼中包含大量與對(duì)象狀態(tài)有關(guān)的條件語句。這種方法讓多個(gè)環(huán)境對(duì)象共享一個(gè)狀態(tài)對(duì)象,從而減少系統(tǒng)中對(duì)象的個(gè)數(shù),極大提高了代碼編寫的質(zhì)量。

      3 結(jié)束語

      在每一次的課程講授過程中,都努力引導(dǎo)學(xué)生結(jié)合已經(jīng)掌握的語法知識(shí)從多個(gè)角度進(jìn)行面向?qū)ο蟮木幊趟季S訓(xùn)練。反復(fù)通過這樣的案例教學(xué)研究發(fā)現(xiàn),在C++語言程序設(shè)計(jì)課程中適當(dāng)引人設(shè)計(jì)模式知識(shí)的教學(xué)模式,對(duì)于講解抽象的面向?qū)ο缶幊趟枷胗趾艽髱椭鼘⒃O(shè)計(jì)模式知識(shí)與面向?qū)ο笳Z法相結(jié)合,鍛煉了學(xué)生整合新舊知識(shí)的能力,鍛煉了他們的計(jì)算思維能力,逐步養(yǎng)成良好的編程規(guī)范。通過實(shí)踐證明,這種教學(xué)方式取得初步成功,也得到學(xué)生良好的評(píng)價(jià),但是對(duì)于基礎(chǔ)薄弱,不能很好的連接新舊知識(shí)的學(xué)生,如何更好地設(shè)計(jì)案例,啟發(fā)他們的計(jì)算機(jī)思維能力,仍然需要繼續(xù)研究探索。

      參考文獻(xiàn)(References):

      [1] 章品正,於文雪.設(shè)計(jì)模式在C++課程教學(xué)中的運(yùn)用[J].計(jì)算

      機(jī)教育,2014.14:41-45

      [2] 楊瑞龍,朱征宇,朱慶生.引入軟件設(shè)計(jì)模式的面向?qū)ο蟪绦?/p>

      設(shè)計(jì)教學(xué)方法[J].計(jì)算機(jī)教育,2012.10:97-100

      [3] Erich G,Richard H,Ralph 1,et al著.李英軍,馬曉星,蔡敏等

      譯.設(shè)計(jì)模式:可復(fù)用面向?qū)ο筌浖幕A(chǔ)[M].機(jī)械工業(yè)出版社,2004.

      [4] 向華.如何在C++教學(xué)中引入初步的設(shè)計(jì)模式思想閉[J].長(zhǎng)

      江大學(xué)學(xué)報(bào)(自然科學(xué)版),2009.6(2):388-389

      [5] 劉海巖,鎖志海,呂青等.設(shè)計(jì)模式及其在軟件設(shè)計(jì)中的應(yīng)用

      研究[J].西安交通大學(xué)學(xué)報(bào),2005.39(10)1043-1047

      猜你喜歡
      設(shè)計(jì)模式面向?qū)ο?/a>語言
      仿生設(shè)計(jì)模式的創(chuàng)新應(yīng)用探索
      玩具世界(2023年6期)2024-01-29 12:14:36
      “1+1”作業(yè)設(shè)計(jì)模式的實(shí)踐探索
      語言是刀
      文苑(2020年4期)2020-05-30 12:35:30
      交通機(jī)電工程設(shè)計(jì)模式創(chuàng)新探討
      面向?qū)ο蟮挠?jì)算機(jī)網(wǎng)絡(luò)設(shè)計(jì)軟件系統(tǒng)的開發(fā)
      讓語言描寫搖曳多姿
      面向?qū)ο蟮臄?shù)據(jù)交換協(xié)議研究與應(yīng)用
      累積動(dòng)態(tài)分析下的同聲傳譯語言壓縮
      面向?qū)ο骔eb開發(fā)編程語言的的評(píng)估方法
      我有我語言
      盱眙县| 清河县| 和顺县| 鄂伦春自治旗| 纳雍县| 财经| 修文县| 永靖县| 新绛县| 砀山县| 读书| 申扎县| 清苑县| 霍林郭勒市| 本溪| 五华县| 多伦县| 华容县| 交口县| 湘乡市| 巴楚县| 嘉峪关市| 贵州省| 鸡泽县| 大安市| 榆林市| 禄丰县| 无为县| 黄陵县| 桑植县| 会东县| 万载县| 馆陶县| 蓝山县| 阿克| 田阳县| 贵州省| 扎赉特旗| 邛崃市| 疏勒县| 千阳县|