錢 能
一、 用標(biāo)準(zhǔn)C++教學(xué)與編程
計算機科學(xué)與應(yīng)用的迅猛發(fā)展,直接推動了《C++程序設(shè)計教程》一書的再版。由于C++語言作為有效的開發(fā)工具在計算機界起著重要的作用,因而在國內(nèi)得到了越來越多的應(yīng)用,許多大型的計算機和軟件開發(fā)公司要求程序員必須能夠進行C++編程,這一趨勢導(dǎo)致了越來越多的學(xué)校開設(shè)C++程序設(shè)計課程。1998年ISO/IEEE所制定的C++標(biāo)準(zhǔn)如今已經(jīng)被各大C++編譯器制造商全盤采用,2002年又修訂了C++新的國際標(biāo)準(zhǔn),國內(nèi)的C++教學(xué)也逐步意識到用標(biāo)準(zhǔn)C++進行教學(xué)的重要意義,這也意味著C++正以一日千里之勢在向前發(fā)展。
這些年中,發(fā)現(xiàn)用非標(biāo)準(zhǔn)C++進行編程,總是磕磕碰碰,遇到編譯器的嚴(yán)重挑戰(zhàn),而用標(biāo)準(zhǔn)C++進行編程卻能順利進行。這倒不是說非標(biāo)準(zhǔn)C++不能進行實戰(zhàn)。例如,在VC6下書寫的程序,只打算在Windows環(huán)境下運行,也沒有什么不妥,因為Windows在我國的使用和開發(fā)群體那么大,使得VC6也似乎成了一種Windows的“標(biāo)準(zhǔn)”了。但是,在C++中使用類進行編程,以及使用STL便不那么順暢了,編寫的代碼移植到其他系統(tǒng)變得困難了。由于人為地制造此編譯器和彼編譯器的差別,也就使得代碼彼此之間比較和研究產(chǎn)生了障礙。
所以一開始學(xué)習(xí),采用標(biāo)準(zhǔn)C++學(xué)習(xí),是一種良好的習(xí)慣,它能夠幫助讀者發(fā)現(xiàn)最本質(zhì)的問題。例如,字符串處理,用char*直接描述和用string類描述有本質(zhì)的區(qū)別,當(dāng)讀者看清兩者的差異后,到了使用Windows資源或者MFC時,就會自然理解CString與char*的區(qū)別來。
標(biāo)準(zhǔn)C++有更多的使用群體、更好的移植性和對以后的新標(biāo)準(zhǔn)更好的適應(yīng)能力,這也促使了第二版從前C++過渡到標(biāo)準(zhǔn)C++。
二、 結(jié)構(gòu)調(diào)整,強化體系
采用原先第一版做教材時,發(fā)現(xiàn)速成教學(xué)很奏效,也就是在實驗室現(xiàn)學(xué)現(xiàn)編,而且可以無需任何預(yù)備知識。相反,循序漸進地進行課堂教學(xué),因為沒有接觸到計算機,沒有直接進行編程實踐,關(guān)于數(shù)據(jù)類型定義、說明、命名以及語法格式等概念的理解反而有一些障礙。這不得不讓引人思考,是否應(yīng)該以編程的感性認識讓學(xué)生自己去分辨編程中語言要素以及操作順序。幾次下來,確認了首先上機實驗這樣的教學(xué)方式很有效。于是在第二版中,將基本編程這一章的內(nèi)容放到前面第二章,而數(shù)據(jù)類型和具體的計算表達統(tǒng)統(tǒng)屬于初學(xué)編程時的問題來加以解決,放到了第三章和第四章。
同時,因為第二版的實例教學(xué)色彩更濃厚,一些概念靠實例的學(xué)習(xí)可以掌握,所以把原來單獨成章的數(shù)組以及指針都拆到第三章中,作為其中的一節(jié)內(nèi)容了。
第一、二部分講述基本編程和過程化編程方法,考慮到一些內(nèi)容的份量比重,過程化編程中的數(shù)組、指針、引用和結(jié)構(gòu),都不再單獨成章。這實際上是對全書作大幅度的內(nèi)容結(jié)構(gòu)重組的開始。
由于實例中輸入輸出的數(shù)據(jù)設(shè)計特別重要,所以全書貫穿了文件流的基本操作。
以基本編程語句,數(shù)據(jù)類型和計算表達的章節(jié)順序展開敘述,同時還歸類了過程化編程的諸種方法,是作者多年教學(xué)經(jīng)驗的總結(jié)。學(xué)了簡單的編程語句,隨之展開過程控制結(jié)構(gòu)的實驗,以感性認識牽動理性認識,在C++學(xué)習(xí)上更能奏效,也順應(yīng)了教學(xué)規(guī)律。
抽象編程是指采用抽象分層的手法,進行各個模塊的具體編程。抽象編程并不是動動腦,動動嘴,比劃比劃的形式,而是更有效地進行的具體編程。要實質(zhì)性地提高編程能力,必須學(xué)習(xí)C++的內(nèi)部實現(xiàn)技術(shù)和抽象表達手段,兩者并重。面向?qū)ο缶幊痰闹饕侄误w現(xiàn)在抽象編程,書中強化了C++的抽象表達技術(shù),特地將多態(tài)和抽象類拎出來單獨成章,而第一版在抽象表達手段上明顯不足。
除此之外,還加強了基于對象編程,完善了面向?qū)ο缶幊蹋a充了高級編程。
第一版在面向?qū)ο蠛透呒壘幊谭矫姹容^薄弱,在教學(xué)中,明顯感到一是體系性不強,二是內(nèi)容相對不足。因而,第二版必須針對這一缺陷,在結(jié)構(gòu)上作一大的調(diào)整。結(jié)果,對象化編程中的堆與拷貝構(gòu)造函數(shù)、靜態(tài)成員和友元、多重繼承、操作符重載和IO流都不再單獨成章,而以面向?qū)ο缶幊痰淖钪匾獛讉€內(nèi)容來編排:類,對象生滅、繼承、基于對象編程、多態(tài)以及抽象類。而且也大大擴充了原先的內(nèi)容,特別是抽象類,模板和異常這三章內(nèi)容,增幅比較大。
模板這一章除了介紹基本用法,還介紹了STL的模板技術(shù)以及程序組織方法,模板的全局定做和局部定做,用模板實現(xiàn)的多態(tài)技術(shù)與虛函數(shù)的多態(tài)技術(shù)的區(qū)別與相互補充性,最后介紹了泛型編程,這些內(nèi)容屬于高級編程的基礎(chǔ),它對于理解開發(fā)中的樣本代碼會帶來很大的好處。異常這一章除了介紹基本用法和增強編程的可靠性與容錯性的作用外,還介紹了標(biāo)準(zhǔn)異常、異常申述、異常關(guān)鍵實現(xiàn)技術(shù)和非錯誤異常的處理方法,它對于讀者理解異常的本質(zhì)會起到很好的作用。
三、 為新教學(xué)模式開道
打破舊式教學(xué)的刻板模式,致力于消除計算機專業(yè)的學(xué)生在大學(xué)畢業(yè)后卻不會編程的普遍現(xiàn)狀。本書將程序設(shè)計課程的教學(xué)要求和目標(biāo)牢牢鎖在編程能力而不是應(yīng)付機械式考試上,強調(diào)程序設(shè)計課程應(yīng)充實更多的編程實踐,讓更多有編程經(jīng)驗的教師來講解和指導(dǎo)實驗,并要求以實際的編程活動來確認是否掌握了所學(xué)內(nèi)容和方法。
因此第二版無論是代碼實例,還是習(xí)題都采用編程實驗形式,而且,事實上,作者已經(jīng)完成了兩年的課程考試以編程為主的形式的過渡。
第二版的出版,也意味著作者將以編程實時提交作為實驗形式,也以編程實時提交作為考試的形式,以此作為C++程序設(shè)計課程的新教學(xué)模式。
雖然第一版已經(jīng)開始脫離應(yīng)付書面考試的學(xué)習(xí)形式,但某些地方還留戀著計算機等級考試的內(nèi)容細節(jié)描述,而第二版的寫作已經(jīng)將一些細節(jié)下放到《詳解》1中去了?!督坛蹋ǖ诙妫纷鳛橹鹘滩?,其手段是編程方法和編程訓(xùn)練并施,其內(nèi)容是內(nèi)部特性與抽象編程并重。當(dāng)然,學(xué)好了C++編程技能,書面考試亦會得心應(yīng)手。
本書在內(nèi)容上是跨編程基礎(chǔ),過程化編程,對象化編程和高級編程的四合一??梢赃x擇進行其中的第一、二部分,或第三、四部分的教學(xué)。第一、二部分和第三、四部分分別可以作為一學(xué)期約64個理論實踐課時的教學(xué),其中上機實驗可占到總學(xué)時的1/2左右。
四、 引領(lǐng)進一步編程提高
目前市面上,C++的書籍很多,真是眼花繚亂,有很多是國外名家寫的經(jīng)典之作,但初學(xué)者看了很難有大的收獲,而有過一些開發(fā)背景的讀者看了會覺得很精彩,感到真是一種享受。到了“享受”這個層次,學(xué)習(xí)C++就無障礙可言了。本書旨在引導(dǎo)初學(xué)者,學(xué)會欣賞C++學(xué)習(xí)的初級精彩;然后根據(jù)作者的指引,直接去享受C++經(jīng)典著作的內(nèi)在精彩。
書中經(jīng)常出現(xiàn)對參考文獻的閱讀指引,其中大部分都是指引到國外的C++經(jīng)典著作中去,從而幫助讀者學(xué)習(xí)更深刻的C++編程內(nèi)涵。
書中也經(jīng)常出現(xiàn)程序設(shè)計方法的多樣性探討、語言特征上的優(yōu)缺點描述及編譯工具評價等,甚至對C++中的一些名詞和術(shù)語進行了更確切的中文命名。作者不隱晦自己的觀點,更歡迎專家來信探討。對于計算機教師和高級程序員來說,應(yīng)是一種有益的參考。
五、 通俗、詼諧和深長意味
本書描述的淺顯易懂來自于不懈的實踐經(jīng)歷和長期的教學(xué)經(jīng)驗。然而,僅僅淺顯,往往使著述的篇幅顯得臃腫,所以,必須已經(jīng)對某一領(lǐng)域的科學(xué)現(xiàn)象有所透徹的理解,才能真正通俗易懂甚至詼諧幽默得起來。
通俗和詼諧也是作者撰寫本書的一大特點,因為作者已經(jīng)不相信一本刻板描述高水平體系化的書,能夠為讀者所接受。人來自生活,對于堆積著公理、定理、規(guī)定,公式推導(dǎo),規(guī)范的書,看似堂堂正正,而少有對體系作深刻揭示而又實例不足的書,已經(jīng)證明是不受現(xiàn)代讀者歡迎的。而且C++編程語言作為技能性課程更需要最后以能力來證明自己的學(xué)習(xí)成就而不是考試成績。
通俗和詼諧不是無原則的,它必須圍繞一個體系,緊扣主題,重點突出。在難點的敘述上,更能見通俗和詼諧的魅力。
例如,作為性能這一章的開場白,有一段對效率的獨特描述,來警示效率在編程中的重要:“程序員談?wù)撟疃嗟氖切蕟栴},C++面向?qū)ο蟪绦蛟O(shè)計方法就是在效率的爭辯中發(fā)展起來的。面對所要解決的龐大問題,人們害怕徒勞無功,所以對種種影響效率的方法橫加指責(zé)。軟件業(yè)的發(fā)展,是因為生產(chǎn)的軟件一個個實用起來了。而要實用,效率便是其生命!”
六、 抽象編程與內(nèi)部特性并重
高級編程都是抽象編程,抽象編程總是接口獨立,層次分明。抽象編程最大的好處是程序的模塊之間職責(zé)分明,容易維護和擴展。面向?qū)ο缶幊痰囊粋€重要優(yōu)勢就是能夠在對象化編程中把抽象性的效果淋漓盡致地體現(xiàn)出來,抽象編程是程序員追求的重要目標(biāo),把握了抽象編程也就是本質(zhì)上把握了編程的方法。因此,本書抓住抽象編程,對面向?qū)ο蟮雀呒壘幊谭椒ㄕ归_重點描述。
C++編程本質(zhì)上是數(shù)據(jù)類型和算法的堆積,很多算法的性能是需要程序員通過語句使用的效率推敲來把握的,也就是說,C++的內(nèi)部特性對其程序的性能起著重要的作用,這種作用不是哪種編程方法可以左右的。此外,STL的性能也涉及到所用語句的內(nèi)在效率,它必須從實踐中慢慢把握。
要提高編程能力,便要以抽象編程觀來進行編程思考,擴大編程的視野,同時必須重視C++內(nèi)部特性,提高C++性能,讓程序真正實用起來。對C++來說,這是兩種相輔相成的本質(zhì),一個強調(diào)低層特性,一個強調(diào)從頂層縱覽全局。堅持兩者并重,才能使C++體現(xiàn)出超乎其他編程語言的簡捷和高效。體現(xiàn)了C++強大的生命力也就體現(xiàn)了一個人的編程能力。這就是學(xué)習(xí)C++編程語言的著眼點。
七、 代碼風(fēng)格
編程重代碼形式,優(yōu)秀程序員總是具有自己獨特的代碼風(fēng)格。代碼風(fēng)格的好壞直接影響其可讀性,影響其與其他程序員的溝通。這也就決定了該代碼的生命力。要想盡可能快地成為一個程序員,應(yīng)該有意識地訓(xùn)練自己的代碼書寫風(fēng)格。這就首先需要見識一些優(yōu)秀代碼,然后從實踐經(jīng)歷中慢慢形成自己的代碼風(fēng)格。
本書正是意識到了代碼風(fēng)格的重要,從根本上著手來培養(yǎng)程序員,本書特地對第一版所有的源代碼的風(fēng)格進行了改良,使之更優(yōu)雅、精簡和可讀。同時還補充了許多高效和精巧的代碼。難怪書的封底點出“風(fēng)格獨特,極具模仿價值”。
這里要避免強調(diào)風(fēng)格所導(dǎo)致的誤區(qū):性能是程序運行的生命,但有時性能和代碼并不調(diào)和。也就是說,實現(xiàn)了高雅的風(fēng)格,而操作并不一定高效;實現(xiàn)了高效,代碼不一定可讀性好。書中一般會采取一種簡捷的偏向于袒護性能的代碼形式。發(fā)生這種情況時,代碼可能會顯得很奇異,甚至有點晦澀難懂。好在這是一部教材,把這些懸念留給親愛的老師,會使課堂教學(xué)更精彩,而且也將會有《C++程序設(shè)計教程詳解》來細述。