<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冒號和他的學(xué)生們(連載22)——抽象思維

    冒號和他的學(xué)生們

    ——程序員提高班紀事

    22.抽象思維

    是謂無狀之狀,無物之象,是謂惚恍                                                     ——《老子·道經(jīng)》


    冒號健步走進教室,學(xué)員們立刻正襟危坐,進入戰(zhàn)備狀態(tài)。

    “如果說咱們是在合演一場戲,那么前面五節(jié)課只是一個過門。”冒號儼然一副自導(dǎo)自演的架勢。

    眾人暗暗吃驚:這過門也忒長了點吧。

    冒號隨即探問:“還記得在范式總結(jié)中提到的迭代學(xué)習(xí)法吧?”

    引號迅速應(yīng)答:“就是在具體知識與抽象理論之間做折返跑。”

    “記性不錯。”冒號贊道,“在上本班之前,你們已經(jīng)具備了一定的編程語言的基礎(chǔ),因此我們先從抽象的編程范式談起,此后又回歸到編程語言的討論。”

    句號推測:“照此邏輯,下面我們將再次返回編程范式?”

     “我們的確要來個For Loop,但相信這是一個增量式的循環(huán)。”冒號用編程語言來強調(diào)他的學(xué)習(xí)理論。

    逗號有些失望:“按計劃不是該對Java語言作專題討論嗎?”

    “你放心,Java它跑不了。”冒號看出他的心事,“語言是形,范式是神,這次我們將二者融合,爭取做到形神兼?zhèn)洹>唧w地說,范式以OOP為主,語言以Java為主,同時可能涉及CC++C#等語言。另外,示例代碼也會明顯增多。”

    逗號臉上的一抹烏云頓時消散開來。

    冒號接著提醒道:“不過,秉承開班發(fā)言中的理念,我們的重心不在知識的枝節(jié),而在知識的本源。因此無論討論Java還是OOP,我們不追求系統(tǒng)和全面,但力求從不同的選點、角度和深度來展示知識的活性。”

    講到此處,冒號冷不丁提問:“程序員最重要的能力是什么?”

    眾人的答案五花八門:學(xué)習(xí)能力、邏輯思維能力、解決問題能力、專注力、溝通能力等等。

    “毫無疑問,你們所說的都很重要。這本是個見仁見智的問題,我只是借此展開今后的話題。在我看來,抽象思維能力是最重要的。當然,不獨計算機領(lǐng)域,其他科學(xué)同樣需要這種能力。更廣泛地說,抽象是人類認識和描繪世界最首要的工具。”不知不覺冒號又走上了形而上的路線。

    嘆號這時想起:“前面談切面范式時,似乎專門提到過抽象與分解的重要性。”

    “我們也曾提到,不同的范式正是對軟件進行了不同角度的抽象和分解。”冒號加以補充,“那么什么是抽象呢?不妨概括為:去粗取精化繁為簡;由表及里異中求同。再精煉些,抽象就是作減法和除法。”

    問號半信半疑:“減法好理解,通過甄選減去非本質(zhì)和不重要的部分,即去粗取精。可除法呢?”

    句號忽然悟道:“透過現(xiàn)象看本質(zhì),發(fā)現(xiàn)不同事物之間的相同之處,即異中求同。同類歸并,那就是除法了。”

    冒號進一步解釋:“用離散數(shù)學(xué)或抽象代數(shù)的語言來說,通過抽象而產(chǎn)生等價關(guān)系以及相應(yīng)的等價類,便是集合的商運算。”

    逗號嘀咕:“本來快明白了,經(jīng)這么一描述,重新糊涂了。”

    冒號笑道:“如果嫌數(shù)學(xué)語言高深,就用算術(shù)語言吧。乘法可看作同類復(fù)制,作為逆運算的除法自然是同類歸并了。”

    逗號眼中的迷惘漸漸散去,若有所悟:“嗯,經(jīng)過減法和除法,大數(shù)變小數(shù),復(fù)雜變簡單。”

    “能否把抽象說得再具體些?”問號話一出口便自感悖論之嫌:抽象的能具體嗎?

    冒號自明其意:“首先,抽象有角度之分。相同的實體entity)經(jīng)過不同角度的抽象,得到的模型model)也會不同。就拿人這個實體來說,在拓撲學(xué)家眼里是三維連通集合,在理論力學(xué)家眼里是質(zhì)點,在化學(xué)家眼里是碳水化合物——”

    嘆號接嘴:“在情人眼里是西施。”

    “過濾缺點,抽取優(yōu)點,西施就是這樣煉成的。”冒號故意拉長了尾音。

    眾人不禁一樂。

    冒號繼續(xù)講解:“其次,抽象還有程度之別。抽象程度越高,細節(jié)越少,普適性越強。典型的例子如:從矩形到多邊形、從多邊形到一般形狀。”

    引號問道:“抽象對于軟件設(shè)計有何現(xiàn)實意義?”

    冒號回答:“軟件設(shè)計者的任務(wù)是將復(fù)雜混沌的現(xiàn)實世界映射到精確嚴格的虛擬世界,要完成這種多對一的映射,抽象無疑是必由之路。在軟件需求分析階段,多通過屬性導(dǎo)向式抽象property-oriented abstraction)用邏輯語言來描述系統(tǒng);在軟件設(shè)計階段,多通過模型導(dǎo)向式抽象model-oriented abstraction)用模型語言來設(shè)計系統(tǒng);在編碼階段,常用兩種抽象機制:一種是參數(shù)抽象abstraction by parameterization),一種是規(guī)范抽象abstraction by specification)。”

    句號望文生義:“參數(shù)抽象是不是指將函數(shù)代碼中的一些特殊值作為參數(shù)來傳遞?”

    “不錯,這是最普通最常用的一種抽象方式。函數(shù)的每一個參數(shù)都是一種泛化,是對它所代表的所有可能值的一種抽象。我們看一個簡單的例子。”冒號說完在黑板上寫下一段代碼——

    int gcd(int a, int b)

    {

        while (a != b)

            (a > b) ? (a -= b) : (b -= a);

        return a;

    }

    冒號考問:“請問這個函數(shù)是干什么的?”

    眾人看了好一陣,有人猶豫地說,好像是求最大公約數(shù)吧?

    冒號肯定道:“它確實是求最大公約數(shù)的,由兩個正整數(shù)輾轉(zhuǎn)相減而得。該函數(shù)通過參數(shù)抽象ab分別代表任意正整數(shù),使之具有更強的普適性和重用性。問題是除了該代碼的作者,其他人如何重用此函數(shù)?你不能假設(shè)用戶知道gcdGreatest Common Divisior的縮寫,也不能假設(shè)他的數(shù)學(xué)程度,甚至不能確定他是否能看到源代碼。短短兩行代碼的函數(shù)尚且如此,何況更加復(fù)雜的函數(shù)?”

    引號答道:“那只能靠文檔注釋了。”

    “非常正確!”冒號頷首,“這是注釋文檔最重要的作用。沒有文檔的API如同沒有說明書的產(chǎn)品,用戶是不敢輕易使用的。合格的文檔注釋中至少應(yīng)包括先驗條件precondition)和后驗條件(postcondition),分別指代碼執(zhí)行前后必須滿足的條件。對于函數(shù)gcd而言,先驗條件是:ab均為正整數(shù),后驗條件是:返回輸入二數(shù)的最大公約數(shù)。有了文檔注釋或規(guī)范說明specification)的函數(shù)成為使用者與實現(xiàn)者之間的一種契約——使用者只能依賴規(guī)范,實現(xiàn)者必須滿足規(guī)范。這種通過規(guī)范使代碼的功能與實現(xiàn)相分離的方法便稱為規(guī)范抽象。其好處是顯而易見的:一方面,使用者不必閱讀代碼即可了解并使用它們;另一方面,實現(xiàn)者不必閱讀或改寫其他代碼,只需在遵循規(guī)范的基礎(chǔ)上修改本地代碼,并且不用擔(dān)心影響客戶代碼。比如我們可以用輾轉(zhuǎn)相除法重新實現(xiàn)gcd。”

    冒號隨手又寫了幾行代碼——

    int gcd(int a, int b)

    {

        return (b != 0) ? gcd(b, a % b) : a;

    }

    逗號未見其妙:“這兩種抽象機制在實際編程中經(jīng)常用到,只是以前不知道它們的學(xué)名罷了。”

    冒號正色道:“它們看起來雖然很基本,但平淡之中見真功。如果一個程序員能合理設(shè)計參數(shù)、嚴格遵循規(guī)范、有效制定規(guī)范,便已是難得之才了。”

    眾人捫心自問,離此要求確有相當距離。

    冒號續(xù)道:“借助參數(shù)抽象和規(guī)范抽象,我們可以實現(xiàn)過程抽象procedural abstraction)和數(shù)據(jù)抽象data abstraction)。其中過程抽象容易理解,任何一個函數(shù)都是過程抽象的結(jié)果,它賦予程序員定義新運算或子程序的能力,是結(jié)構(gòu)化編程Structured programming)和命令式編程Imperative programming)的關(guān)鍵。下面我們重點談?wù)剶?shù)據(jù)抽象,它是對象式編程OOP)的起源。”

    posted on 2008-07-11 05:03 鄭暉 閱讀(2382) 評論(3)  編輯  收藏 所屬分類: 冒號和他的學(xué)生們

    評論

    # re: 冒號和他的學(xué)生們(連載22)——抽象思維 2008-07-11 13:58 ChenWeili

    這個沙發(fā)真舒服呀,趕上直播了。
    每篇文章都能引人深思,不容易。頂!!  回復(fù)  更多評論   

    # re: 冒號和他的學(xué)生們(連載22)——抽象思維 2008-08-05 17:53 leweslove

    兩個很牛的代碼段  回復(fù)  更多評論   

    # re: 冒號和他的學(xué)生們(連載22)——抽象思維 2009-01-19 13:35 duxu

    獲益非淺

      回復(fù)  更多評論   

    導(dǎo)航

    統(tǒng)計

    公告

    博客搬家:http://blog.zhenghui.org
    《冒號課堂》一書于2009年10月上市,詳情請見
    冒號課堂

    留言簿(17)

    隨筆分類(61)

    隨筆檔案(61)

    文章分類(1)

    文章檔案(1)

    最新隨筆

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 本免费AV无码专区一区| 亚洲电影在线免费观看| 亚洲综合日韩中文字幕v在线| 在线看免费观看AV深夜影院 | 午夜亚洲国产理论片二级港台二级 | 成年女人永久免费观看片| 黄色短视频免费看| 亚洲中字慕日产2021| 久久久久国产亚洲AV麻豆| 1区2区3区产品乱码免费| 美女的胸又黄又www网站免费| 日本免费一区二区三区| 你懂的在线免费观看| 亚洲中文字幕无码爆乳app| 亚洲成人福利在线| 国产麻豆视频免费观看| 亚洲国产精品狼友中文久久久| 91高清免费国产自产| 特黄aa级毛片免费视频播放| 亚洲熟妇丰满xxxxx| 最新国产成人亚洲精品影院| 色拍自拍亚洲综合图区| 亚洲丁香色婷婷综合欲色啪| 亚洲精品成人无码中文毛片不卡| 亚洲麻豆精品国偷自产在线91| 国产免费人成视频在线观看| 日本免费网站观看| 日日夜夜精品免费视频| 国产精品国产免费无码专区不卡| 野花高清在线观看免费3中文| 成人在线免费看片| 国产成在线观看免费视频| 18国产精品白浆在线观看免费| 6080午夜一级毛片免费看6080夜福利 | 香港特级三A毛片免费观看| 精品亚洲av无码一区二区柚蜜| 久久精品亚洲日本波多野结衣 | 搡女人真爽免费视频大全| 无码中文在线二区免费| 成人免费视频试看120秒| 大陆一级毛片免费视频观看i|