摘要本文以提高計算機專業(yè)的程序設(shè)計水平為目的,主要探討面向?qū)ο蟪绦蛟O(shè)計的教學模式、教學內(nèi)容和教學方法,提出了如何充分認識面向?qū)ο蟪绦蛟O(shè)計的特點和怎樣選擇屬于主流方向的程序設(shè)計語言,并以C++語言教學為實例,提出了如何提高面向?qū)ο蟮某绦蛟O(shè)計水平。最后,根據(jù)計算機技術(shù)的發(fā)展,提出了實施可視化程序設(shè)計方法的必要性,并總結(jié)了在講授Visual C++.NET的過程中應(yīng)該突出的重點內(nèi)容。
關(guān)鍵詞程序設(shè)計教學C語言C++Visual C++.NET
1 引言
筆者多年來一直在高校從事計算機科學技術(shù)的教學和研究工作,在長期的實踐中深刻認識到,計算機程序設(shè)計是計算機專業(yè)的基礎(chǔ)課,熟練掌握計算機程序設(shè)計也是學生將來從事計算機技術(shù)應(yīng)用研究所應(yīng)具備的基本素質(zhì)。然而,程序設(shè)計技術(shù)水平的提高,僅僅靠一兩門程序設(shè)計課程是不夠的。只有經(jīng)歷了計算模型與算法理論、若干語言(含微程序設(shè)計和匯編語言程序設(shè)計)的程序設(shè)計、程序設(shè)計方法學、程序理論與軟件開發(fā)方法學、軟件工程以及其他相關(guān)課程的學習以后,并經(jīng)過大量實踐,才能真正大幅度、整體性地提高程序設(shè)計水平。我們在這里所討論的面向?qū)ο蟪绦蛟O(shè)計,是在學習了某種高級語言(如:C語言或Pascal語言)之后所要學習的一門課程。為了提高面向?qū)ο蟪绦蛟O(shè)計的教學水平和培養(yǎng)學生的程序設(shè)計能力,既要考慮計算機軟件設(shè)計發(fā)展的方向和需要,又要重視采用科學、合理和先進的教學模式,并實施相應(yīng)的教學內(nèi)容和教學方法。下面針對這些問題談?wù)劰P者的看法。
2 充分認識面向?qū)ο蟪绦蛟O(shè)計的特點
隨著程序設(shè)計學科的發(fā)展,程序設(shè)計思想經(jīng)歷了從簡單的順序計算到結(jié)構(gòu)化的程序設(shè)計,再到面向?qū)ο蟮某绦蛟O(shè)計的發(fā)展過程,形成了一整套的思想理論和設(shè)計方法。目前看來,面向?qū)ο蟪绦蛟O(shè)計方法比較接近人們表達事物和解決問題的思維方法,其特點如下。
(1)具有靜態(tài)屬性和動態(tài)行為的對象與客觀世界的實體比較相象,面向?qū)ο蟮某绦蚰軌虮容^自然地模擬客觀世界,從而使得解空間與問題空間在結(jié)構(gòu)上盡可能一致。
(2)應(yīng)用面向?qū)ο蠹夹g(shù)來分析、設(shè)計和實現(xiàn)軟件系統(tǒng)的過程與人們認識客觀世界、解決實際問題的過程比較一致。
(3)對象的封裝性,降低了程序的復雜性;對象的繼承性,增加了程序設(shè)計的可重復使用性;對象的多樣性,增強了程序設(shè)計的靈活性。由此可以明顯提高軟件開發(fā)與維護的效率,降低軟件的總成本。
應(yīng)用這些特點,人們在程序設(shè)計時首先要考慮系統(tǒng)有哪些需要處理的“數(shù)據(jù)”或者“對象”,進一步分析這些對象包含了哪些信息,以及處理這些信息所需要的方法。也就是說,找出對象、正確地描述對象、分析對象與對象之間的關(guān)系以及采用計算機語言來構(gòu)建系統(tǒng)等工作,這是面向?qū)ο蟪绦虻姆治雠c設(shè)計的方法。
近年來,面向?qū)ο蟮募夹g(shù)越來越受到人們的重視,對它的應(yīng)用和研究遍及計算機軟件和硬件的各個領(lǐng)域,國內(nèi)高校普遍開設(shè)了面向?qū)ο蟪绦蛟O(shè)計之類的課程。
3 明確選擇屬于主流方向的程序設(shè)計語言
面向?qū)ο蟪绦蛟O(shè)計語言很多,在IT行業(yè)中最為流行的如:C++、Java和Delphi等語言,而我們的教學中選擇了C++,其理由如下。
(1)C語言成為程序設(shè)計入門的主導語言。由于C語言在當今系統(tǒng)軟件和部分應(yīng)用軟件的開發(fā)中具有實用性強的特點,又與硬件和程序設(shè)計環(huán)境底層的聯(lián)系緊密,所以當學生具備了一定的數(shù)學基礎(chǔ)和計算機操作實驗基礎(chǔ)后,首先認可在某種計算模型(如隨機存儲計算模型)和軟件技術(shù)(如編譯技術(shù))的支持下,通過C語言的各種基本成分及其功能的了解,學習如何組合各種語言成分來編制完成某項計算的程序,然后完成對某些計算方法和算法的具體實現(xiàn),從中體會計算機在處理大量計算問題時如何從過程的角度完成具體計算,從而為學習其他計算機基礎(chǔ)課程打好基礎(chǔ)。
(2)C++與C語言有不可分割的親情關(guān)系。C++是在C語言的基礎(chǔ)上演變而來的一種程序設(shè)計語言,它不是簡單地對C語言作了某些改進,而是在C語言成功的基礎(chǔ)上進行了一場革命。C++語言的創(chuàng)建初衷是“a better C”,但是這并不意味著C++中類似C語言的全局變量和函數(shù)所采用的編譯及連接方式與C語言完全相同。作為一種欲與C兼容的語言,C++保留了一部分過程式語言的特點,因而它可以定義為不屬于任何類的全局變量和函數(shù)。但是,C++畢竟是一種面向?qū)ο蟮某绦蛟O(shè)計語言,為了支持函數(shù)的重載,C++對全局函數(shù)的處理方式與C有明顯的不同。在C++教學中,重點介紹有關(guān)面向?qū)ο蟮幕靖拍睢⒒痉椒ê突炯夹g(shù),重點介紹兩種語言之間的不同之處,從而實現(xiàn)了程序設(shè)計思想、方法和技術(shù)從面向過程平穩(wěn)過渡到變?yōu)槊嫦驅(qū)ο螅瑴p小了C++的學習難度。
(3)C++可以很容易延伸到其他語言。與C++接近的有Java語言和C#(C Sharp)語言,它們的基本語句大致相同,其功能主要是開發(fā)B/S結(jié)構(gòu)的分布式系統(tǒng)。學習這些語言的時候,在C++語言的基礎(chǔ)上,從語言理論(只引用結(jié)論而不展開論述)和語言比較學的角度出發(fā),放棄語言的共性,重點學習對應(yīng)語言的個性,這樣達到事半功倍的效果。同時引出由于程序設(shè)計方法和技術(shù)的發(fā)展以及高級語言進一步發(fā)展帶來的需要在程序設(shè)計語言中解決的問題,如組件、網(wǎng)頁以及通信等應(yīng)用方面的設(shè)計,向?qū)W生適當展示高級語言與程序設(shè)計廣闊的天地,為后續(xù)相關(guān)課程埋下伏筆。
4 注重提高面向?qū)ο蟮某绦蛟O(shè)計水平
在引導學生從面向過程程序設(shè)計到面向?qū)ο蟪绦蛟O(shè)計的轉(zhuǎn)變過程中,對于面向?qū)ο蟮囊恍┗靖拍睿ㄈ珙悺ο蟆⒎庋b、繼承和多態(tài)),通過同現(xiàn)實生活的事物相對比,學生還是很容易理解的。但是,如何將這些概念應(yīng)用到面向?qū)ο蟪绦蛟O(shè)計中,剛開始對于學生來說還是有一定的難度。為了克服這個難題,我們在C++語言的教學中注重了以下幾方面內(nèi)容。
(1)從程序設(shè)計的角度理解面向?qū)ο蟮幕靖拍睢@鐚ο蟮姆庋b性,我們可以認為是一種把代碼和代碼所操作的數(shù)據(jù)捆綁在一起,使這兩者不受外界干擾和誤用的機制。.封裝可被理解為是一種用做保護的包裝器,以防止代碼和數(shù)據(jù)被包裝器外部所定義的其他代碼任意訪問。對包裝器內(nèi)部代碼與數(shù)據(jù)的訪問通過一個明確定義的接口來控制。封裝代碼的好處是每個人都知道怎樣訪問代碼,而無需考慮實現(xiàn)細節(jié)就能直接使用它,同時不用擔心不可預(yù)料的副作用。在面向?qū)ο蟮某绦蛟O(shè)計中,最基本的封裝單元是類,一個類定義了由一組對象所共享的行為(數(shù)據(jù)和代碼)。一個類的每個對象均包含它所定義的結(jié)構(gòu)與行為,這些對象就好像是一個模子鑄造出來的一樣,所以對象也叫做類的實例。對于類的封裝程度,也是有選擇的。類提供關(guān)鍵字public、protected 和private,用于聲明哪些數(shù)據(jù)和函數(shù)是公有的、受保護的或者是私有的,用以控制類的封裝程度,公有的數(shù)據(jù)和函數(shù)公開必須要讓外界知道的內(nèi)容,而隱藏的是私有的一切內(nèi)容。對于對象的繼承性,是指一個對象從另一個對象中獲得屬性的過程,它支持按層次分類的概念。如果不使用層次的概念,每個對象需要明確定義各自的全部特征。通過層次分類方式,一個對象只需要在它的類中定義屬于它的個性,然后從父類中繼承它的共性。因此,正是由于繼承機制,才使得一個對象可以成為一個通用類的一個特定實例。當然,類的繼承方式,C++提供了公有和私有的兩種選擇。
(2)培養(yǎng)面向?qū)ο蠹夹g(shù)分析的抽象思維。抽象是程序設(shè)計的基本要素,程序設(shè)計者通過抽象描述來實現(xiàn)軟件系統(tǒng)。抽象描述的有效方法是使用層次式的分類特性,這種方法允許用戶根據(jù)物理含義分解一個復雜的系統(tǒng),把它劃分成更容易實現(xiàn)的塊。例如,一個計算機系統(tǒng)是一個獨立的對象,而在計算機系統(tǒng)內(nèi)部由幾個子系統(tǒng)組成:顯示器、鍵盤、硬盤驅(qū)動器、DVD-ROM、軟盤、音響等,這些子系統(tǒng)每個又由專門的部件組成。在程序設(shè)計中,其中抽象是自頂向下地逐步求精和模塊化。自頂向下地逐步求精是指首先要對所設(shè)計的系統(tǒng)有一個全面的理解,其次從頂層開始連續(xù)地逐層向下分解,直到系統(tǒng)的所有模塊都被分解為一條條的詳細指令時為止。模塊化是指把一個大的程序按照一定的原則劃分為若干個相對獨立但又相互關(guān)聯(lián)的實體,這些實體就是我們所面向的對象,它們用類來描述定義。
(3)訓練面向?qū)ο笤O(shè)計的邏輯思維。程序設(shè)計的過程也就是對學生的思維進行訓練的過程。在許多常規(guī)學科的日常教學中我們不難發(fā)現(xiàn)這樣一個現(xiàn)象,不少學生的思維常常處于混亂的狀態(tài)。寫起文章來前言不搭后語,令人不知所云;解起數(shù)學題來步驟混亂,搞不清因果關(guān)系。這些都是缺乏邏輯思維訓練的結(jié)果。程序設(shè)計的訓練不僅可以讓學生養(yǎng)成良好的程序設(shè)計習慣,而且可以有效地培養(yǎng)學生思維的條理性和邏輯性。
(4)幫助學生樹立系統(tǒng)工程觀點。在計算機行業(yè)中,軟件的設(shè)計已經(jīng)用工程的觀念來進行管理。軟件設(shè)計不再被認為是手工作坊里的個體勞動,而是被當作一項系統(tǒng)工程。軟件工程的復雜程度不低于甚至高于諸如建筑工程等其他行業(yè)的工程。隨著社會信息化進程的不斷加速,計算機應(yīng)用走進各行各業(yè)是大勢所趨,社會需要大量的計算機高等人才,從而對我們的計算機教育提出了更高要求。我們知道,程序設(shè)計是計算機專業(yè)的基礎(chǔ),應(yīng)該從一開始使學生養(yǎng)成一個好習慣,樹立正確的軟件工程觀點。這樣做不僅可以為學生將來從事計算機應(yīng)用打下良好的基礎(chǔ),而且有利于提高學生統(tǒng)籌全局、協(xié)調(diào)關(guān)系的基本能力。
5 大力強化面向?qū)ο蟮目梢暬绦蛟O(shè)計方法
目前,程序設(shè)計的觀念發(fā)生了顯著變化,可視化(Visual)技術(shù)廣泛用于各種程序設(shè)計過程,就拿C++來說,就有C++ Builder和Visual C++不同的可視化程序設(shè)計語言。這些可視化語言,它們以其圖形化的編程方式將面向?qū)ο蠹夹g(shù)的特性完美地體現(xiàn)出來,使得開發(fā)軟件這一原本枯燥、難以理解的工作變得輕松快捷。作為專業(yè)人員不懂得可視化編程技術(shù)將無法在競爭激烈的計算機行業(yè)中立足,作為計算機學科的教師不傳授可視化編程技術(shù)將難以滿足學生強烈的求知欲望。
從整個IT產(chǎn)業(yè)的軟件市場來講,如果要開發(fā)高性能的Windows或萬維網(wǎng)(WWW)應(yīng)用程序,Visual C++是一種效率較高的開發(fā)工具,幾乎所有世界級的軟件都是使用Visual C++開發(fā)系統(tǒng)完成的。在2002年初,微軟公司又推出了Visual C++的最新版本——Visual C++.NET,它繼承了以往Visual C++各版本的優(yōu)點,增加了許多新的特性,使得開發(fā)的能力更強、開發(fā)的效率更高,深受業(yè)內(nèi)人士青睞,所以我們選擇了Visual C++.NET作為可視化程序設(shè)計語言。
在學習掌握C++語言的基礎(chǔ)上,講授Visual C++.NET需要重點突出以下內(nèi)容。
(1)MFC(Microsoft Foundation Class,微軟基本類庫)。MFC是微軟公司為Windows程序員提供的一個面向?qū)ο蟮腤indows編程接口,使用它進行Windows應(yīng)用程序開發(fā)具有很大的優(yōu)越性。首先,MFC提供了一個標準化的結(jié)構(gòu),開發(fā)人員不必從頭設(shè)計創(chuàng)建和管理一個標準Windows應(yīng)用程序所需的程序,而是“站在巨人肩膀上”,充分利用Microsoft開發(fā)人員多年開發(fā)Windows程序的經(jīng)驗,并可以將這些經(jīng)驗融入到用戶自己開發(fā)的應(yīng)用程序中去。我們知道,雖然程序設(shè)計者要編寫的程序在功能上是千差萬別的,但從本質(zhì)上來講,都可以歸納為用戶交互界面的設(shè)計、輸入輸出文件的操作、多媒體技術(shù)的應(yīng)用以及數(shù)據(jù)庫的訪問等一些最常用的技術(shù)。這一點正是微軟提供MFC類庫的最重要原因,在這個類庫中包含了一百多個程序開發(fā)過程中最常用到的類。在進行程序設(shè)計的時候,如果類庫中的某個類具有我們所需要的功能,這時我們只要簡單地引用該類產(chǎn)生對應(yīng)對象,然后通過對象調(diào)用有關(guān)方法就可以了。我們還可以利用面向?qū)ο蠹夹g(shù)中很重要的“繼承”方法從類庫中的已有類派生出我們自己的類,該類繼承了父類的特性和功能,實現(xiàn)了代碼重用,并在此基礎(chǔ)上還可以根據(jù)自己需要加上所需的特性和方法,從而可以快速設(shè)計出一個更專業(yè)的、功能更強大的類。
(2)消息處理機制。Windows操作系統(tǒng)環(huán)境下運行的交互式應(yīng)用程序,不論采用那一種開發(fā)工具,它都具有以消息為基礎(chǔ)、由事件驅(qū)動的運行機制。事件是外部強加于應(yīng)用程序的操作動作,它們有可能來自系統(tǒng),也有可能來自用戶。操作系統(tǒng)將捕捉到的事件,按事件的類型和來源采用相應(yīng)的數(shù)據(jù)結(jié)構(gòu)描述事件,這種形式稱為消息。操作系統(tǒng)將事件翻譯成消息之后,接著將消息分發(fā)到消息隊列中,等待應(yīng)用程序索取并處理。在Visual C++.NET中,消息可分為窗口消息、命令消息、控件消息和交互對象更新消息,這些不同類型的消息各自都有對應(yīng)的處理方式。熟悉消息的處理方式和靈活應(yīng)用消息,對于學生設(shè)計交互式應(yīng)用程序至關(guān)重要,因為設(shè)計的大多數(shù)時間是充分利用各種消息,編寫它們對應(yīng)的處理函數(shù)。如果忽視了消息處理機制內(nèi)容,學生編程序或者無從下手,或者功能簡單。
(3)主要應(yīng)用程序類型的程序結(jié)構(gòu)。Visual C++.NET提供了良好的開發(fā)應(yīng)用程序向?qū)В谙驅(qū)У闹敢拢梢宰詣由蓡挝臋n、多文檔、對話框和多頂級文檔等四種標準類型的應(yīng)用程序結(jié)構(gòu),對應(yīng)結(jié)構(gòu)都是由MFC中的基類派生的類組成的。在教學過程中,深入剖析這四種應(yīng)用程序結(jié)構(gòu),有助于提高學生的軟件開發(fā)能力。例如多文檔應(yīng)用程序結(jié)構(gòu)目前使用越來越普遍,人們熟悉的Microsoft公司的Office系列產(chǎn)品以及Visual系列產(chǎn)品都是典型的多文檔應(yīng)用程序。這種多文檔界面具有多窗口的特點,因而人們可以在一個程序中使用多個子窗口來實現(xiàn)不同數(shù)據(jù)的瀏覽查看。一般情況下,這四種結(jié)構(gòu)可以滿足絕大多數(shù)用戶的要求,但有時用戶也可以通過重載一些函數(shù)來修改其缺省的風格,從而在此結(jié)構(gòu)基礎(chǔ)上設(shè)計加工具有自己個性的應(yīng)用程序。
(4)對話框的數(shù)據(jù)交換機制。對話框是應(yīng)用程序的主要交互方式,它作為一種容器,包含了用于輸入輸出信息和控制操作的控件,并且大多數(shù)控件都有對應(yīng)的內(nèi)存變量。Visual C++.NET對于實現(xiàn)控件和變量之間的數(shù)據(jù)交換有自己的一套獨特機制,熟悉這種機制有助于學生深刻理解輸入輸出數(shù)據(jù)的來龍去脈。
以上內(nèi)容如果讓學生自學是有一定的難度,所以希望老師重點講解這些內(nèi)容,以便學生自學繪圖、數(shù)據(jù)庫操作和網(wǎng)絡(luò)編程等有關(guān)專題技術(shù)。
6 結(jié)束語
目前,計算機程序設(shè)計方法在不斷地更新,當我們講授面向?qū)ο蟮某绦蛟O(shè)計方法時,面向組件和面向服務(wù)的新方法就已經(jīng)產(chǎn)生了。在這種情況下,是不是說面向?qū)ο蟮某绦蛟O(shè)計方法過時?我認為并不見得過時。就像我們應(yīng)用面向?qū)ο蟮脑O(shè)計方法時還得應(yīng)用面向過程的設(shè)計方法(如設(shè)計消息處理函數(shù))一樣,面向組件和面向服務(wù)的新方法是在面向?qū)ο蟮幕A(chǔ)上發(fā)展產(chǎn)生的,服務(wù)是組件的容器,組件是對象的容器,最基本的內(nèi)核還是對象,只不過從軟件體系結(jié)構(gòu)的角度來講,服務(wù)和組件相對于對象來說,是形成體系結(jié)構(gòu)的更大力度的結(jié)構(gòu)元素。所以說,講授好面向?qū)ο蟪绦蛟O(shè)計方法,是為將來學習面向組件和面向服務(wù)的程序設(shè)計方法打基礎(chǔ)。
參考文獻
[1] 譚浩強.C程序設(shè)計(第二版)[M].清華大學出版社,2001,8.
[2] 鄭莉,董淵.C++語言程序設(shè)計(第二版)[M].清華大學出版社,2002,1.
[3] 張海藩,牟永敏.面向?qū)ο蟪绦蛟O(shè)計實用教程[M].清華大學出版社,2002,6
[4] 王恩德.Visual C++.NET程序設(shè)計教程 [M].清華大學出版社,2004,7.