青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

第二桶 基于對象的編程 第二碗 老C初談統一建模 小P開練建模語言(之二)

pastpast     “呵呵,國慶過得如何啊?”小P笑著問老C,顯得很輕松。
     “哦,還行。四處拜訪了一番,找到以前的同學聊了聊……你呢?”老C問。
     “行程比較豐富,逛了朱雀森林公園……在城里用腳丈量了東西南北四條大街……給百盛和開元進行了慈善捐款,換回若干不等價女性物品……”小P扳著手指頭唾 沫橫飛,“在battle net上和朋友PK了幾次魔獸……到朋友家聽了聽他最近練習的新曲子——他以前可是某非著名band的吉他手轉行鼓手——順便和他操練了幾盤實況足球…… 哈哈,最重要的是翻看了一些UML的資料,順便自己總結了一下……”
     “喔!那還真實做了不少事情啊……”不想看著小正太唾沫橫飛,老C插嘴道。
     “呵呵,還行還行。”小P忍不住要展示一下自己的學習成果,順便讓老C評論一番,“我依照約定補全了那個sequence diagram,順便自己總結了一些目前學到的東西,我給你看看……”說著他打開了自己的電腦。

     “喔,還是不錯的。”老C評價道,“其實模型并不能完全代表編程的細節,只要可以說明問題就OK了,我們在編程的時候還是要對模型進行某些修改以避免掉某些羅嗦的地方……嗯,不錯。”老C點點頭。
     “來看看這幅圖,”小P說道,“這是我總結的需要學習的UML圖,著重黑色的部分是我已經接觸到的。”
     “是么?我來看看。”老C道。

     “呵呵,你總結的很不錯啊。”老C稱贊道,“這樣你就知道自己的road map了,學習起來就會更有一些提綱挈領的感覺。”
     “那是那是,我的學習那個還是不錯的……”小P審慎的謙虛道。
     “嗯……通過這幅圖你應當可以明白UML中動態模型和靜態模型的概念上的區分啦。”老C補充道,“嗯……你的領悟能力出乎我的意料啊……”
     “……”小P囧,不知道這是表揚還是批評,“呵呵,我還總結了我接觸過的UML概念,分為形而上和形而下的對偶。”說著小P又打開了一個文檔。

形而上
形而下
Class
Object
Association
Link
Operation
Method


     “哦……”老C有些驚訝了,“你總結的有些道理。雖然現在你可能無法分辨Operation 和 Method 的具體區別,但是在腦海中保持這種概念上的區別還是很重要的。”他稱贊道,“照這樣的速度發展下去,過不了一兩年,你就可以教我了……”
     “呵呵呵呵,你太謙虛了……”小P有些得意,“我還有很多東西需要你多和我聊聊呢。”
     “哈哈,那你可要有所表示哩……”老C打趣。
     “……好!為了迎接新的學習生活,我決定……在南門請你再吃一回刀削面……大碗也可以噢。”小P痛下決心。
     “……寥勝于無……”老C郁悶道,“也行……不過還要再加一瓶冰峰……”
     “呵呵,好的好的。”小P很痛快的答應。
     “嗯……請5天,時間我定。”老C得寸進尺,“包括中午和晚上。”
     “……”小P扳著指頭算了算,“可以!不過不能在一個星期內連續吃5次……”
     “……誰會連續5天全部吃刀削面啊!”老C囧。
     “呵呵,呵呵,我只是提醒……提醒一下而已。”小P笑道。
     “嗯,趁著我心情大好,再給你講講線性鏈表的一些習慣用法和常用的設計吧。”老C道,“反正離吃飯還有一段時間。”
     “噢!好啊。”小P道,然后很自覺的從角落中拉出白板。
     “嗯……”老C覺得這個孩子還是很有前途的,“一個基本問題,就你所知,什么是線性表?”
     “哦,叫我想想。”小P眨眨眼睛,“好像和遍歷這些數據結構花費的時間有關系,如果我遍歷一遍這些數據結構的所有元素所花費的時間是元素個數的線性函數, 那么這個數據結構就是線性表,哦……時間復雜度就是n啦。”小P又想想,“好像就是這樣,我所接觸的線性表包括array, linked list, stack, queues,而queues可能有各種奇怪的queue,比如循環的,優先級的什么的……”
     “你的記憶力不錯啊。”老C稱贊道,“嗯,基本上線性表就是這么回事啦。”他點點頭,“我再來問一個貌似題外話的問題,你知道在C語言中,有哪4類指針嗎?”
     “槑……”小P搖頭,飛快。
     “在C語言中,有4種指針,分別是一般的指針,空指針、0指針和past the last one指針。”老C道。
     “槑……”小P道,“一般的指針就是指向數據和函數的指針吧,空指針應當就是void*,0指針應當就是無法dereference的那種指針,那么什么是past the last one指針?”他不解的問。
     “很簡單,我們舉例說明吧。”老C說著在白板上寫下幾行代碼。

const int MAX_SIZE = 10;

int main()
{
    int array[MAX_SIZE];

    for (int* p = &array[0]; p != &array[MAX_SIZE]; ++p)
    {
        *p = 0;
    }
   
    return 0;
}

     “看,”老C指著代碼,“在這里我們將數組中所有的元素初始化為0,但是在這里我們使用了一種看似更間接的方法,我們沒有使用類似array[i]這種下 標的形式,而是使用了指針。”他用筆在代碼下面標出著重符號,“請注意這句, p != &array[MAX_SIZE],在這里就表示那個past the last one的指針。”看到小P還是沒有反應,老C接著解釋,“其實&array[MAX_SIZE]指針是我們之前沒有定義的,因為其實 array[MAX_SIZE]已經越過了array數組的界限。對于一個越過界限的元素,取它的地址,按道理來說應當是沒有意義的,但是為了我們可以方 便的表示一個數組的結束,C語言特地為我們提供了一定的方便——C語言規定這個對越過數組界限一個元素取地址是合法的,而且它就是數組最后一個元素地址的 下一個地址。當然,對這個指針dereference和對其指向的內容賦值,都是沒有意義的行為——它是且僅僅是被用來作為一個結束的標識符而已。”他擦 了擦頭上的汗,“總之你就認為past the last one指針就是表示一個數組結束用的,對其賦值和解引用是沒有意義的。這個指針的出現完全是為了人們使用的方便而已。”
     “唔,就是說C語言幫我們一個忙,就是了?”小P問,“那么和使用下標的方法比,這樣有什么好處啊?”
     “嗯,使得我們減少一些記憶力上的負擔,如果你按照某種格式書寫代碼,那么就不用擔心 ‘過一’ 問題。”老C說道。“比如在幼兒園,一個老師問,孩子們,我們現在有幾個小板凳啊?一個孩子數道,0,1,2,3,4,他回答,我們有5個小板凳!那么他 就是天才并且使用了C編程界在線性表中采用的習慣用法——使用past the last one指針來表示線性表的結束!”
     “哈哈,”小P笑道,“我還沒有見過哪個孩子這樣數的。”
     “總之就是一種很好的方法幫我們解決過一問題的。”老C說道,“因為C語言的數組采用以0開始的計數方式,這樣我們在進行指針運算的時候會產生某種便利 性,比如讓你有某兩個指向array元素的指針,比如p1和p2,且p1 <= p2,那么計算p1和p2之間的元素個數,很簡單的p2-p1就可以了。這只是一個例子,還有很多其它類似的指針運算,也會顯得很方便。但是這樣又會造成 過一問題,因為一般人在計數的時候很難適應從0開始計數——在簡化了指針運算的同時,又引入了過一問題——反正世界上沒有完美的東東。”
     “哦?那么引入這兒past the last one指針會給我們帶來什么便利呢?”小P問。
     “呵呵,這樣我們可以以統一的方式來表示數組的結束。”老C說,“這樣大家在編碼時在計算數組是否應當已經遍歷結束的時候,智力負擔會小很多。”他想想,在白板上寫下一個數學表達式。

[first, last)


     ‘“看,這樣我們就可以用一個左閉右開的區間表示我們的數組啦。”老C說道,“對于這個區間,你可以很容易的用last - first來計算出區間中元素的個數;如果你知道了區間中元素的個數——比如說SIZE——那么可以很簡單的用 first + SIZE = last 的公式來計算last數據的地址,從而知道了如果在遍歷這個數組的時候,應當在那里結束。”他想了想,又說道,“這樣我們遍歷數據結構的代碼可以統一成為 如下的形式。”說罷又在白板上寫下如下代碼。

for (iter = first; iter != last; ++iter)
{
}

     “如果我們在代碼中堅持使用這種遍歷方式和左閉右開的區間表示方法,那么數組的過一問題就會遠遠的離開我們,而且不會再回來……”老C說道,“而且一般我 們在聲明的時候總是知道數組的大小的,比如MAX_SIZE,這樣我就很方便的知道了array[MAX_SIZE]就是我定義的數組區間的結束標識。”
     “嗯……”小P道,“好像真的有些用處……但是為什么for()循環中要用 != 來表示數組沒有結束而不用 < 來表示呢?”他問道。
     “因為統一……”老C解釋,“線性表的表示方法不只有使用數組一種,我們還可以使用linked list,雖然在linked list中,每個節點表示的邏輯意義是線性的,但是它們的地址并不是線性的,不能說前面的節點的地址恰好比后一個節點的小。我們無法比較兩個指針的大小, 只能比較它們是否相等。”說罷他又在白板上寫下另一行代碼。

for (Node* iter = firstNodeAddr; iter != lastNodeAddr; iter = iter->next)
{
}

     “看,這樣在如何表示線性表遍歷結束方面,兩者保持了適度的統一。”老C說道,“而統一是我們編程人員最喜歡的,這樣即有利于減少編碼者的智力負擔,又有利于維護者對代碼的閱讀。”他又補充,“總之是一種行話,約定俗成的習慣。”
     “哦,我突然想起來了,我們在實現linked list的時候,也是采用[first, last)的方法的。”小P道,“這樣說的話我倒是馬上明白為什么要將list的head作為表示這個雙向循環鏈表的結束了。”
     “沒錯!”老C說道,“你可以再回頭看看我們對linked list的實現,體會一下[first, last)區間表示線性表的好處。”老C接著說道,“因為我們有了基本統一的表示方法,通過運算符重載這一利器,可以將對節點的操作從數據結構中提取出來 ——你不是在寫linked list的時候嫌index這個東東比較煩人嗎——那么我們就可以將這種index操作從線性表中提取出來,從而簡化我們對數據結構的操作。”
     “哦?怎么運用運算符的重載來簡化這種操作呢?”小P問道。
     “一個簡單的例子,如果我們認為iter是一個類的,那么我們可以重載iter類的++運算符,從而使得對數組的遍歷與對linked list的遍歷統一起來。”老C說道,然后在白板上寫下一個示例代碼。

for (Iterator iter = first; iter != last; ++iter)
{
    ...
}

++iter其實實現 iter = iter->next的動作

     “看,這樣我們就可以保持代碼形式上的統一。”老C說道,“如果代碼在形式上統一了,那么我們就很容易會想到用一個基類來表示統一的操作,而用子類和虛函 數對不同的操作進行區分。”他揉揉手,“這就是有名的iterator模式,我想我們可以從一個最簡單的對數組遍歷的例子引申開……”
     “是么是么?”小P好奇的問,“那么應當怎么做呢?”
     “嗯……那要看今天的面香不香……”老C打岔。
     “囧……那我們去看看吧,如果你覺得勉強還可以,那就回來接著說吧。”小P道。
     “是啊是啊,吃飯不積極,思想有問題。我們的思想可沒有什么問題,走啦走啊啦。”老C到隔壁叫了其它人,大家一起浩浩蕩蕩殺出門外。

(老C會怎么樣解釋iterator模式呢)

posted on 2009-03-09 17:41 Anderson 閱讀(1370) 評論(0)  編輯 收藏 引用

<2009年3月>
22232425262728
1234567
891011121314
15161718192021
22232425262728
2930311234

導航

統計

常用鏈接

留言簿(6)

隨筆檔案(21)

文章檔案(1)

搜索

最新評論

閱讀排行榜

評論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            伊伊综合在线| 国产日韩三区| 亚洲一区二区三区精品在线观看 | 国产亚洲激情在线| 久久久久久久尹人综合网亚洲| 午夜在线观看欧美| 亚洲国产小视频在线观看| 欧美电影电视剧在线观看| 欧美人交a欧美精品| 亚洲影院在线| 久久久久久国产精品一区| 亚洲激情影院| 亚洲午夜伦理| 亚洲大片免费看| 亚洲欧美日本国产专区一区| 影音先锋亚洲精品| 亚洲日本国产| 国产精品一二三| 你懂的亚洲视频| 国产精品久久久久av免费| 久久综合久久综合久久| 欧美激情一区二区三区在线视频 | 在线一区日本视频| 香蕉久久一区二区不卡无毒影院 | 红桃视频一区| 一区二区激情| 在线观看欧美视频| 99精品福利视频| 国产一区二区三区高清在线观看| 亚洲第一精品在线| 国产日韩欧美在线视频观看| 最新国产成人av网站网址麻豆| 国产欧美日韩一级| 亚洲国产专区| 又紧又大又爽精品一区二区| 99国产精品| 日韩一级黄色大片| 亚洲国产日本| 久久久水蜜桃| 久久福利影视| 国产精品区一区二区三| 亚洲精品一二三区| 亚洲福利视频网| 欧美在线视频全部完| 亚洲欧美在线另类| 欧美精品91| 亚洲国产99| 亚洲第一中文字幕| 久久国产精品黑丝| 久久国产精品黑丝| 欧美视频一区在线观看| 亚洲区中文字幕| 亚洲精品1区2区| 蜜桃av久久久亚洲精品| 久久综合伊人77777尤物| 国产日韩欧美成人| 亚洲欧美视频在线观看| 亚洲欧美在线播放| 国产精品日日摸夜夜摸av| 日韩一二三在线视频播| 夜夜嗨网站十八久久| 欧美成人激情在线| 亚洲国产免费| 在线视频一区观看| 欧美日韩精品综合在线| 亚洲美女91| 先锋影院在线亚洲| 国产精品午夜在线| 欧美在线观看天堂一区二区三区| 久久riav二区三区| 国产一区二区精品| 久久手机免费观看| 亚洲国产精品第一区二区| 一本久道久久综合狠狠爱| 久久久久久久久久看片| 亚洲国产成人精品久久| 亚洲自拍偷拍福利| 国产精品麻豆va在线播放| 亚洲黄色片网站| 一区二区三区波多野结衣在线观看| 欧美视频网址| 先锋资源久久| 亚洲第一在线视频| 亚洲影视在线| 国内精品国产成人| 欧美成人精品h版在线观看| 亚洲黑丝一区二区| 亚洲欧美日韩中文播放| 国产一区二区按摩在线观看| 麻豆成人在线| 亚洲午夜久久久久久久久电影网| 久久精品亚洲| 亚洲精品视频啊美女在线直播| 欧美视频中文一区二区三区在线观看 | 亚洲电影成人| 亚洲欧美999| 亚洲国产另类精品专区| 欧美日韩国产精品一卡| 午夜伦理片一区| 国产欧美69| 免费高清在线一区| 在线一区二区视频| 久久综合久色欧美综合狠狠 | 亚洲永久免费| 亚洲第一色中文字幕| 国产精品ⅴa在线观看h| 美女视频一区免费观看| 午夜影院日韩| 日韩亚洲欧美精品| 欧美成人激情在线| 久久国产免费| 这里只有精品视频| 亚洲福利在线看| 国产日韩欧美综合| 欧美午夜精品理论片a级按摩 | 欧美日韩一区二区三区在线观看免| 欧美主播一区二区三区美女 久久精品人| 亚洲第一黄网| 久热re这里精品视频在线6| 亚洲一区视频| 亚洲最新合集| 亚洲伦理自拍| 亚洲国产精品成人一区二区 | 亚洲免费观看| 亚洲第一毛片| 在线日韩电影| 激情国产一区| 国产一区二区0| 国产一区二区三区不卡在线观看| 国产精品高潮在线| 欧美日韩精品综合| 欧美日韩999| 欧美日韩成人在线观看| 欧美日韩国产999| 欧美精品激情在线| 欧美日韩国产一区二区三区| 免费观看亚洲视频大全| 老牛影视一区二区三区| 久久久久九九九| 麻豆免费精品视频| 亚洲国产三级网| 亚洲青色在线| 99国产精品| 亚洲小说区图片区| 亚洲小视频在线观看| 亚洲欧美精品中文字幕在线| 亚洲一二三四久久| 亚洲免费视频一区二区| 欧美一区观看| 久久久久九九九九| 久久综合九色综合网站 | 日韩手机在线导航| 一区二区三区欧美视频| 亚洲综合色噜噜狠狠| 欧美一区午夜视频在线观看| 欧美一级淫片播放口| 久久久人成影片一区二区三区| 久久亚洲春色中文字幕久久久| 久久综合色婷婷| 亚洲区一区二区三区| 亚洲性视频网站| 久久精彩视频| 欧美电影资源| 国产精品区一区二区三| 一区二区在线免费观看| 日韩一级裸体免费视频| 欧美一级视频一区二区| 免费不卡中文字幕视频| 亚洲精品国产精品久久清纯直播| 日韩亚洲精品在线| 久久都是精品| 欧美久久影院| 红桃视频欧美| 亚洲一区二区在| 狂野欧美性猛交xxxx巴西| 亚洲乱码精品一二三四区日韩在线 | 欧美在线免费看| 亚洲国产成人av| 亚洲欧美日韩视频二区| 欧美大片一区二区三区| 国产精品久久久久久亚洲调教 | 国产精品二区二区三区| 在线国产精品播放| 亚洲一级网站| 欧美高清在线视频| 亚洲欧美日韩天堂一区二区| 欧美国产精品中文字幕| 国产亚洲激情视频在线| 亚洲一区二区三区视频播放| 乱人伦精品视频在线观看| 99视频在线观看一区三区| 美女视频黄免费的久久| 国产欧美日韩在线视频| 一区二区三区偷拍| 欧美激情一区二区三区不卡| 欧美一区二区三区久久精品| 欧美三级乱码| 日韩视频在线一区二区| 欧美国产日产韩国视频| 久久久久久综合网天天|