• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    C++的沉迷與愛戀

    發布: 2008-4-23 15:31 | 作者: 不詳 | 來源: VCHelp | 查看: 99次 | 進入軟件測試論壇討論

    領測軟件測試網



    ●困難度之一

    「C++ 是個難學易用的語言」,這句話相信很多人心有戚戚。C++ 的學習難度,一在於語言本身太多的「幕」,一在於 "paradigm shift" (思考模式的移轉)。

    傳統循序語言如 C, Pascal, Basic, Fortran...,除了模樣看起來稍有不同,基本上都是函式 call 來 call 去,大同小異,很容易掌握。你想做的動作,在 code 中都看得一清二楚。你所看不到的,犖犖大者也不過就是編譯器為你的函式加上用以處理堆疊的一小段碼(prologue 和 epilogue),這一小段碼基本上做的是 housekeeping 工作,你沒看到也沒有關系(更好),并不影響你對程式邏輯的思考。

    C++ 不一樣,C++ 有太多和程式邏輯息息相關的動作是編譯器為我們加上去的。換句話說 C++ 編譯器為我們「加碼」。如果不識清這一節,學習C++ 有如霧里看花,霧非霧,花非花。

    編譯器為我們的 C++ 程式加了什麼碼呢?很多!物件誕生時 ctor 會被喚起,物件死亡時 dtor 會被喚起,這都是加碼的結果。ctor 中設定vtpr 和 vtbl,這也是加碼的結果。new 單一物件時會產生 memory block cookie,new 物件陣列時會產生一個內部結構記錄著 object size 和 class ctor...,這也都是布幕後的工作?梢哉f,程式碼中看不到而卻必須完成的所有與程式邏輯有關的動作,統統都是 C++ 編譯器加碼後的結果。

    當「繼承」發生,整個情況變得稍微復雜起來!付嘀乩^承」又更復雜一些,「虛擬繼承」再更復雜一些。

    這些布幕後的主題,統可歸類為所謂的 C++ object model(物件模型)。如果不知道這些底層機制,你就只能夠把 "make destructors virtual in base classes"(<Effective C++>, item14)或 "never treat arrays polymorphically" (<More Effective C++>, item 3)這類規則硬背下來,卻不明白它的道理。

    用一樣東西,卻不明白它的道理,林語堂如是說:『不高明』。只知道 how,不知道 why,侯捷如是說:『不高明』。

    ●困難度之二

    C++ 的第二個學習難度在於 "paradigm shift"(思考模式的移轉)。別說自己設計 classes 了,光使用別人的 classes,就都是一種思考模式和行為模式的移轉。MFC(或 OWL 或 VCL)programmer 必然甚能夠領略并體會我的意思。

    使用所謂的 application framework(一種大型的、凝聚性強的、有著物件導向公共基礎建設的 class library),你的碼和 framework 之間究竟是怎樣的關系呢?framework 提供的一大堆可改寫的虛擬函式的意義與價值究竟在哪里呢?為什麼 framework 所設計的種種美好性質以及各式各樣的演算法竟然可以施行於我們自己設計的 class types 身上呢?framework 被設計時,并不知道我們的存在呀!

    這正是物件導向中的多型(polymorphism)的威力。

    稍早所說的 C++ 物件模型,偏屬程式設計的低層面;這里所說的思考模式移轉,則是程式設計的高層面。能夠把新思維模式的威力發揮得最淋漓盡致的,當推物件導向的polymorphism(多型)和 generalization(泛型)。如果你沒有使用這兩項特性,等於入 C++ 寶山而空手返。

    ●反覆煉,循環震蕩

    想像 C++ 是一把用來解決程式問題的刀,要它堅軔,要它鋒利,就必須經過多次的回火,在高熱和驟冷之間煉。

    初學 C++ 語法(syntax)之後,你應該盡快嘗試體驗 polymorphism (大致而言也就是虛擬函式的運用)。等到對 OOP 的精神有了大局掌控的能力,但對 C++ 的許多小細節不甚清楚,就是回到C++ 物件模型煉的時機。

    成長,是在高階(polymorphism)和低階(object model)之間反覆震蕩,才能夠震蕩到更高的位階,而不是平平庸庸於中階(C++ syntax)的一灘死水。

    ●不要沉淪於 C++ syntax

    100 個人跟我說他懂 C++/OOP,只有 10% 不到可以讓我認為他沒有胡吹大氣。太多的人,上嘛上不到 polymorphism,下嘛又下不到object model。就這樣不上不下地卡在 C++ 語法層面。大一學了C++,到大四快畢業了,連 virtual functions 是怎麼回事都期期艾艾支支吾吾說不出個道理。

    有時候我覺得,太苛責同學也於心不忍,因為同學們事實上處於一種無知的狀態,既不知道 C++/OOP 該怎麼學,也不知道哪些書可以教他們那麼學。所以,苛責同學,不如責怪老師。

    眾所周知,大學教授泰半是動口不動手,普遍的心態是「論文第一,升等為要;程式語言?哎,末流!」!改┝鳌拐n程通常由教授們輪流教,誰倒楣誰來教;於是就常常有「下學期要教 C++ 語言了,這學期寒(暑)假趕快去要本書來惡補」的情況發生。偏偏程式語言這東西,只動口不管用,一定要動手,而且要常動手。老師自己沒有摸到C++/OOP 的精神,學生又能學到什麼?

    有些學校資訊系并不教特定的程式語言,老師們的態度是「語言是一種自己學就好了的東西嘛,拿到大學殿堂來,哎,不入流」!於是應該好好為學生打下實際基礎的課程,卻天馬行空地騰云駕霧起來,大談抽象意念。飽讀經書的老師們可能忽略了,一個完全沒有技術基礎的學子,要的不是形而上的道,而是形而下的器。

    我們是先能夠欣賞具象畫,還是先能夠欣賞抽象畫?我們不都是先對畢卡索的畫大罵「這是什麼東西」,直到自己的藝術涵養夠豐富了、人生閱練更飽滿了、能夠舉一隅以三隅反了、能夠接觸類旁通左右逢源了,才轉而能夠欣賞甚至進入畢卡索的抽象意境嗎?

    老師們各有專長,要老師們來教非彼專長的大班課、基礎課,我又覺得似乎也太為難老師了。那麼,苛責老師,不如責怪學校當局。如果學校當局能夠聘請經驗老道又有教學熱誠的工程師來教這類實務學科,不是三方皆大歡喜嗎?不要說什麼制度僵化啦,難以突破啦,大學是高度自治區,禮聘幾位兼任老師,不全都是系上的權責范圍內嗎?

    當學子們在課程上學不到他要的東西,就只好閉門自修。但是,循序性(sequential)語言尚有自修學會的可能,物件導向語言嘛,以大學生的程度來講,我認為自修實在困難,只會修出個四不像、半瓶水。

    管不到學校!管不到教授!自求多福的情況下,希望看到這篇文章的你,知道 C++/OOP 該怎麼學。

    延伸閱讀

    文章來源于領測軟件測試網 http://www.kjueaiud.com/

    42/4<1234>

    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>