“……所以,我們希望使得軟件也可以像硬件一樣——將實(shí)現(xiàn)同一功能的電路放在一起,做成集成電路并封裝,只留下定義清晰的引腳作為接口——這樣在需求相似
的地方,只要使用這個(gè)已經(jīng)制造好的芯片就可以了,而無需再次設(shè)計(jì)電路。這就是復(fù)用的思想,這樣可以極大的提高生產(chǎn)效率和技術(shù)的積累。正因?yàn)橛辛薎C,硬件
發(fā)展的水平已經(jīng)遠(yuǎn)遠(yuǎn)的將軟件發(fā)展的水平甩在了身后,目前軟件發(fā)展還只是進(jìn)行到模塊化而已,而就我所知系統(tǒng)級(jí)規(guī)模的復(fù)用也還是在發(fā)展階段……還遠(yuǎn)沒有到達(dá)軟
件IC的地步……總之你要了解自己所處于的技術(shù)浪潮中,這樣才可以更好的把握自己……”不知道兩個(gè)人在聊什么,不知不覺就又聊到了編程這個(gè)話題。“同時(shí)軟
件業(yè)可以像其它行業(yè)學(xué)習(xí)的東西很多,比如像硬件學(xué)習(xí)封裝和復(fù)用,像建筑業(yè)學(xué)習(xí)模式,像心理學(xué)和工業(yè)設(shè)計(jì)學(xué)學(xué)習(xí)UI設(shè)計(jì)……等等等等,總之要心態(tài)開放,兼容
并包,虛心學(xué)習(xí),不要以為自己有多么了不起——就各行各業(yè)的發(fā)展時(shí)間來看,軟件業(yè)吃的飯還沒有一些傳統(tǒng)行業(yè)吃的鹽多……”老C開始給小P狂噴。兩個(gè)人下午
上完課也沒有什么事情,干脆把椅子拉在一起狂諞起來。
“嗯,我覺得你說的有些道理,那么我們的編程語言是如何對(duì)模塊化進(jìn)行支持的呢?”小P覺得自己的捧場很重要,如果沒有自己說“然后呢……其他呢……”等
等,老C不會(huì)狂噴這么多有意思的話題,所以他很是恰當(dāng)?shù)脑谂赃吷匡L(fēng)。“一開始的時(shí)候沒有直接的模塊化的支持,”老C道,“后來人們根據(jù)實(shí)際需求總結(jié)出來一
些使用語言的方法,形成一定的業(yè)內(nèi)規(guī)范,將語言形成的代碼組織得更容易形成模塊。比如我們?cè)谑褂肅語言時(shí),將模塊的接口聲明到.h文件,內(nèi)部實(shí)現(xiàn)放在.c
文件并且用static聲明,這樣就提供了某些封裝的方法——但不是強(qiáng)制的,如果你違反了這些規(guī)定,語言本身是拿你沒有辦法的——這個(gè)時(shí)候就需要從行政上
動(dòng)腦筋……比如扣除一部分你的勞動(dòng)所得等等,哈哈。”老C笑道,“但是這種約定只是在坊間流傳,基本上不會(huì)在介紹語言的書籍或者課本上出現(xiàn)——因?yàn)檫@些是
工程經(jīng)驗(yàn),而理論雖然在理論上講與實(shí)踐沒有什么區(qū)別,但是從實(shí)踐的觀點(diǎn)看,結(jié)論正好相反——因此企業(yè)不得不花費(fèi)一些時(shí)間教會(huì)新手和菜鳥遵守某些坊間流傳的
規(guī)矩和約定。”
“哦?也就是說如果我們畢業(yè)就算找到工作,也還是不能馬上就給企業(yè)帶來效益的?”小P問。
“嗯,是的。所以雖然企業(yè)內(nèi)部急需要人才,但是應(yīng)屆畢業(yè)生工作還是挺難找的,因?yàn)楹芏嗥髽I(yè)不想花費(fèi)一些培訓(xùn)和引導(dǎo)的成本,所以就在社會(huì)上尋找有經(jīng)驗(yàn)的人。
但是有經(jīng)驗(yàn)的人哪里這么好找啊……于是就出現(xiàn)了矛盾——一方面好多人找不到工作,另一方面企業(yè)又需要人……”老C道。
“哦?那么沒有什么好的解決方法嗎?”小P問。
“我覺得也有辦法,學(xué)校尤其是一類院校可以從企業(yè)吸收一些高級(jí)人才,充當(dāng)一線教師和導(dǎo)師……但是這里面牽扯了方方面面的利益,實(shí)現(xiàn)起來比較困難。同時(shí)由于
學(xué)校的學(xué)術(shù)界有固步自封的傾向,一味追求理論上的高新,基本上不會(huì)考慮實(shí)現(xiàn)上的問題,導(dǎo)致大量水文的出現(xiàn),造成一定程度上畢業(yè)生質(zhì)量的下降。我覺得如果一
個(gè)人可以很好的將某種理論以實(shí)際的方法實(shí)現(xiàn),應(yīng)當(dāng)也頒發(fā)學(xué)歷和學(xué)位的——因?yàn)檫@樣學(xué)術(shù)研究才會(huì)真正變?yōu)樯a(chǎn)力——要知道數(shù)字信號(hào)處理在FFT變換出來之前
也只是理論上的玩具而已,但是隨著FFT的被發(fā)現(xiàn),信息技術(shù)才有了突飛猛進(jìn)的發(fā)展啊……”老C感概道,“呵呵,一下子說的遠(yuǎn)了,跑題,跑題……”他咋咋
嘴,嘆了一口氣,“題外話就不多說了,我們?cè)賮砜纯措S著科技的發(fā)展,語言又對(duì)我們的模塊化編程提供了哪些支持吧。”
“哦,然后呢?”小P問。
“然后隨著人們經(jīng)驗(yàn)的增加和積累,發(fā)現(xiàn)在語言層面對(duì)模塊這個(gè)概念提供支持是很好很強(qiáng)大的想法,至于怎么實(shí)現(xiàn)模塊化,見仁見智,相互PK,總之我們看到的結(jié)
論是經(jīng)過在市場上的殘酷廝殺,面向?qū)ο罄碚摪l(fā)展了起來。”老C道,“其實(shí)我們用非面向?qū)ο蟮恼Z言也可以實(shí)現(xiàn)面向?qū)ο蟮哪承┧枷?,比如可以在C中用結(jié)構(gòu)體+
對(duì)結(jié)構(gòu)體操作的函數(shù)的方式構(gòu)造我們的模塊,但——你也看到了——到底沒有語言上直接支持來的方便和輕松。”老C撓撓頭,“因?yàn)槿藗冮_始接受面向?qū)ο蟮恼Z
言,如何對(duì)設(shè)計(jì)過程和設(shè)計(jì)所使用的模型進(jìn)行描述又有了新的爭議……”
“哦?什么是設(shè)計(jì)模型?”小P問。
“……簡單的說,我們?cè)谏w房子的時(shí)候一般都會(huì)先簡單的畫出一個(gè)草圖吧,也叫藍(lán)圖,blue
print的東東,然后再進(jìn)行詳細(xì)的計(jì)算和設(shè)計(jì)……沒有見過沒有圖紙就直接上的,這樣既不安全,出了問題也比較難以修改,這個(gè)就是草圖和藍(lán)圖的作用,而草
圖和藍(lán)圖描述的就是房子的模型——因?yàn)榉孔又怀霈F(xiàn)在概念中,還沒有被實(shí)際蓋出來。”老C覺的要向這個(gè)無知青年解釋清楚還是比較累人的,“又比如我們要進(jìn)行
一個(gè)飛機(jī)場空中管制和航班管理的軟件,你會(huì)怎么做?”
“呵呵,依我現(xiàn)在的水平——不要想,就是我的做法……”小P答道。
“……也是……哈哈,我覺得你應(yīng)當(dāng)先去買一套飛機(jī)場的玩具,然后模擬幾次飛機(jī)的起降過程,并人為的制造一些障礙,比如飛機(jī)晚點(diǎn),天氣不好等等,來熟悉你即將碰到的問題并想辦法解決之。這就是建模的過程,體現(xiàn)了一些模型的重要性。”老C笑道。
“哦,我明白了,”小P高興的說道,“就是說在實(shí)際實(shí)現(xiàn)前,概念上和理論上的對(duì)問題進(jìn)行仿真和建模,并用某種方式表達(dá)出來,這樣對(duì)開發(fā)過程很有益處……”
“沒錯(cuò)沒錯(cuò)。”老C同意,“就像流程圖這個(gè)我們?cè)诮Y(jié)構(gòu)化編程時(shí)經(jīng)常使用的建模工具,在面向?qū)ο髸r(shí)代也有類似的,但是更強(qiáng)大的工具來支持我們建模。同時(shí)這種
工具不但可以在外部對(duì)問題進(jìn)行描述,對(duì)問題域進(jìn)行記錄,而且還可以記錄解決問題的方案,程序的結(jié)構(gòu)等解決域的內(nèi)容。”他想了想,又說道,“在歷史上有多種
這樣的符號(hào)和圖形系統(tǒng)——畢竟一圖頂千言,哦,不,是正確的清晰的一圖才可以頂千言——最后經(jīng)過努力這些圖形和符號(hào)都統(tǒng)一為一種符號(hào)和表述方式……就像電
路符號(hào)是實(shí)際電路的建模一樣,如果同時(shí)存在7、8種電阻符號(hào),那樣引起的混亂有可能比沒有建模還嚴(yán)重呢。”
“喔?這么說其實(shí)建模的工具就是一些用來描述問題和軟件結(jié)構(gòu)的圖形和符號(hào)?就像我在電路課程中學(xué)習(xí)的電阻、電感和電容符號(hào)那樣?”小P問。
“沒錯(cuò)!這種被統(tǒng)一后的符號(hào)集和圖形集被稱為UML,近來還在里面加入了一些在符號(hào)間找來找去的腳本語言……”老C接著道,“所謂UML,就是Unified Modeling Language的簡稱,從Unified這個(gè)詞,你就可以看出它發(fā)展的歷史。”
“哦,原來名字的來歷是這樣啊。”小P道。
“是啊,無論怎么樣,統(tǒng)一和標(biāo)準(zhǔn)是我們的需求,只有用統(tǒng)一的標(biāo)準(zhǔn)的符號(hào)我們才可以更好的交流。一個(gè)反面的例子是我們上數(shù)字電路里面的與門、非門、與非門和
或門等等的邏輯符號(hào),國家標(biāo)準(zhǔn)與業(yè)界流行的標(biāo)準(zhǔn)就不一樣,導(dǎo)致學(xué)生在畢業(yè)的時(shí)候可能看不懂行業(yè)內(nèi)的電路圖——就事實(shí)而論,我們大部分的電路模塊產(chǎn)品和芯片
的說明手冊(cè)還是歐美的居多——這樣即加重了企業(yè)負(fù)擔(dān),可能需要再花一部分精力來培訓(xùn)新人,也增加了學(xué)生的負(fù)擔(dān)——為了在畢業(yè)的時(shí)候增加些許競爭力,不得不
學(xué)習(xí)兩套符號(hào)系統(tǒng)。總之我覺得這個(gè)事情還是比較腦殘的,讓我想到窄軌鐵路……”老C借機(jī)發(fā)泄了一下從畢業(yè)就開始累積的郁悶。
“呵呵……”小P嘴上打著哈哈,心想,不就是多記幾個(gè)框框嘛,對(duì)自己影響不是很大啊,“消消氣,我們還是來說說UML本身吧。”小P道。
“嗯……我覺得首先我們得先明確幾個(gè)概念——要知道概念是比技巧更重要的東西——為了明確這些概念,我們最好先來談?wù)撘恍┱軐W(xué)問題。”老C道,“首先來UML的陰與陽。”
“陰與陽?”小P槑。
“對(duì),呵呵,無極生太極,太極生兩儀,兩儀生八卦……”老C開始轉(zhuǎn)文。
“八卦?我覺得隔壁的行司就比較八卦……”小P小聲說道。
“哈哈,這里說的陰與陽,是指UML模型中class與object概念的對(duì)偶,靜態(tài)模型與動(dòng)態(tài)模型的區(qū)分。”老C道,“這些都是不同的概念,我們現(xiàn)在來仔細(xì)說說。”
“哦?是嗎?那太好了。”小P道。
“首先我們來區(qū)分class與object的概念,什么是class?什么是object?我們先在概念上討論一下,然后再看看在C語言里是怎么一回事。
首先講概念,我們來打個(gè)簡單的比方。”因?yàn)橐_始長篇大論,老C把自己的茶杯端到手里,“比如你在一村閑逛,看到一只小狗在樹下面小便,你會(huì)說‘狗撒尿
’……”
“哦,這個(gè)例子顯得……每下愈況……”小P道。
“呵呵,你總結(jié)的很好很強(qiáng)大……”老C突然有了伯牙遇子期的感慨,“話說高山……哦,不,狗撒尿,在這里,狗就是類的概念。”老C道,“因?yàn)樗械墓?,無
論什么品種,都會(huì)撒尿,因此你會(huì)建立一個(gè)‘狗’的概念,這個(gè)‘狗’只是存在于理性世界當(dāng)中,并不是真實(shí)存在的,只是一種模型而已,這就是對(duì)類這個(gè)概念的簡
單理解。如果你知道這條狗叫旺財(cái),你會(huì)說‘旺財(cái)撒尿’,那么這里‘旺財(cái)’就是‘狗’這個(gè)類的一個(gè)對(duì)象,因?yàn)?#8216;旺財(cái)’是‘狗’這個(gè)概念的實(shí)體。”
“喔?這樣說來就是概念與實(shí)體的區(qū)別了?”小P問。
“嗯,可以先簡單的這樣理解。”老C說,“而‘撒尿’就是‘狗’這個(gè)類所具有的‘操作’,就是說只要是‘狗’,一定會(huì)‘撒尿’。”
“哦,有點(diǎn)需要理解力了。”小P道。
“呵呵,可以這樣理解,‘狗’與‘撒尿’這兩個(gè)都是概念,生活在理性的世界,而‘旺財(cái)’和‘旺財(cái)?shù)娜瞿騽?dòng)作’是實(shí)體,生活在現(xiàn)實(shí)世界。”老C解釋道,“但是理性世界的概念在實(shí)例化之前不會(huì)有任何作用……因?yàn)樗鼈儽旧矶际歉拍疃选?#8221;
“太抽象了,來點(diǎn)具體的吧。”小P埋怨。
“呵呵,形而上者謂之道,形而下者謂之器,先道而后器者,幾??!”老C又轉(zhuǎn)文,“可以可以,我們?cè)贑++中舉個(gè)簡單的例子。”他又指揮小P拉過來白板并擦干凈,寫下如下代碼。
class Dog
{
public:
Dog(const string& name) : name_(name) {}
piss() {}
private:
string name_;
};
int main()
{
Dog wangCai("Wang Cai");
wangCai.piss();
return 0;
}
“看,我們的Dog類,在還沒有生成wangCai對(duì)象前,并沒有什么實(shí)際的作用,它只是記錄了一些類型和函數(shù)的信息而已。然而一旦生成了wangCai
對(duì)象,那么在實(shí)際內(nèi)存中——無所謂是在棧還是堆——都占有了一席之地,而這個(gè)對(duì)象的行為都會(huì)依照我們class內(nèi)部的設(shè)定而進(jìn)行。”老C道。
“唔,這么一說,我倒是理解了很多。”小P道。
“呵呵,還是要在實(shí)際編程中多體會(huì)和領(lǐng)悟。”老C說道。“現(xiàn)在我們來說說class和object如何在UML中表示,沒有什么難的,就像電阻、電感或者
電容一樣,只是一種記號(hào)。”老C道,并在白板上畫了兩個(gè)框框,“不同的訪問等級(jí)分別用+,#,和-表示,你可以google一下class
diagram,查找一些具體的信息。”他接著說道,“有了class和object的表示方法,我們需要了解一下如何表示它們之間的關(guān)系。”
“哦?”小P一副疑惑的樣子。
“因?yàn)槲覀兊膶?duì)象都不可能是孤島,對(duì)象之間需要相互協(xié)作才可以完成一些功能。形而下的對(duì)象之間如何發(fā)生了相互的聯(lián)系,那么在形而上的類之間就會(huì)塑模出各種
關(guān)系。”老C說道,“我們先來說說最簡單的也是最寬泛的一種關(guān)系——對(duì)于類來說叫association,對(duì)于對(duì)象來說叫l(wèi)ink……你要習(xí)慣這種概念體
系,因?yàn)樵赨ML中,形而上和形而下被區(qū)分的很明顯,你要理解這種概念上的對(duì)偶。”
“那么什么叫做association呢?”小P問道。
“嗯,只要有物理上或者概念上的關(guān)聯(lián),都可以建模為類之間的association,或者對(duì)象之間的link。”老C回答,“同樣我們可以舉例說明一下。
比如我們選課,你選擇了《數(shù)字信號(hào)處理》、《數(shù)理統(tǒng)計(jì)》和《現(xiàn)代控制理論》,那么你就和這些課程之間發(fā)生一些link,因?yàn)槟闶菍?duì)象,而這些課程也是對(duì)
象;我選擇了《計(jì)算機(jī)通信原理》,《數(shù)理統(tǒng)計(jì)》和《現(xiàn)代測(cè)控原理》那么我這個(gè)對(duì)象和這些課程對(duì)象之間就發(fā)生了一些link——上升到理性世界,就是形而上
的世界,那就是Person這個(gè)類與Course這個(gè)類之間發(fā)生了association。”
“哦?是這樣啊……”小P想了想,“那么怎么樣用association表示link的數(shù)量呢?因?yàn)橐呀?jīng)抽象到另一個(gè)層次中……”
“呵呵,沒有關(guān)系,我們可以用multiplicity來表示,比如這個(gè)學(xué)期我們每個(gè)人可以最多選5門,最少選3門課,可以在class
diagram中用multiplicity來這樣表示……”老C說著畫了一個(gè)圖,“你先理解到這里就夠了,因?yàn)閁ML是一個(gè)理論性很強(qiáng)的東東,沒有必要
一下子就深入進(jìn)去,這樣反而無法學(xué)好。我們先一個(gè)一個(gè)慢慢來,由淺入深,由此及彼。”
“嗯,你說的有些道理。”小P道。
“先在我們只要知道class之間有association就可以了,至于這種association具體到什么地步,那是下一步的事情。所謂建模是見仁
見智的事情,除非重大錯(cuò)誤,否則你總可以認(rèn)為你這樣建模是對(duì)的,因?yàn)槟阌^察問題的角度就是這樣……”老C道,“我們現(xiàn)階段就只要先搞清楚有幾個(gè)class
存在關(guān)系就行了。”
“呵呵,好的。”小P心想還沒有人教他這樣不求甚解的學(xué)習(xí)。
Link
“下來我們需要掌握sequence diagram,”老C道,“關(guān)于UML,有3中模型,分別是class model,state
model和interaction model,前一個(gè)class
model是靜態(tài)模型,后兩個(gè)是動(dòng)態(tài)模型,這是UML中除形而上和形而下外又一對(duì)陰陽。”他喝了一口茶,“我們先把state
model放一邊,先學(xué)習(xí)一下interaction modle中的sequence
diagram。而且同樣也不要太深入,只要先了解一些夠我們用的部分就行了。”說罷他在白板上先寫下可見性三個(gè)大字。
可見性
“不是要說sequence diagram嗎?”小P不解的問。
“哦,sequence diagram主要是描述對(duì)象間是如何交換信息的,在此之前我們需要簡單的說說對(duì)象間交換信息的方式。”老C回答,“否則可能你對(duì)message這個(gè)概念的理解會(huì)困難一些。”他接著說,“你能告訴我兩個(gè)對(duì)象之間怎么傳遞信息嗎?”
“哦,我想想……”小P想了一回,“如果對(duì)象a需要對(duì)象b的信息,那么對(duì)象a可以調(diào)用對(duì)象b的提取信息的成員函數(shù)……”
“沒錯(cuò),這是一個(gè)辦法,”老C點(diǎn)頭,“如果我們把對(duì)象想象為一個(gè)一個(gè)的小島,它們之間需要通過交換信息來共同解決問題,那么你可以想象message就是
它們之間往來的小船,這些小船攜帶了需要交互的信息。比如a島需要b島的信息,或者它需要將信息發(fā)送到b島,作為活動(dòng)發(fā)起人,它需要b島提供船只,然后將
信息從船上取出,或者將信息放入船上。你先這樣理解,信息的接受和發(fā)送都是被動(dòng)的,如果a是發(fā)起者,那么它就需要b提供交通工具——因?yàn)槟悻F(xiàn)在碰到的都是
被動(dòng)類,等我們遇到了主動(dòng)類,再來升級(jí)我們的認(rèn)識(shí)。這樣在C++中,如果對(duì)象a需要向?qū)ο骲發(fā)送一個(gè)消息,那么對(duì)象b需要提供一個(gè)接口;具體來說就是a調(diào)
用了b的成員函數(shù)。”
“哦,那我就先這樣理解著。”小P回答。
“是啊,因?yàn)橐徊降轿坏暮苷_和深刻的認(rèn)識(shí)這個(gè)問題也不現(xiàn)實(shí),我們需要在不斷的實(shí)踐中迭代的修正我們的觀念。”老C道,“現(xiàn)在我們來看看,如果對(duì)象a需要調(diào)用對(duì)象b的函數(shù),那么對(duì)象b必須對(duì)對(duì)象a來說是可見的,你說說在C++中怎么樣才具有這種可見性呢?”
“唔……好像對(duì)象b要是對(duì)象a的一個(gè)成員變量?”小P不是很確定。
“嗯,只是一種情況。”老C回答,“如果對(duì)象b對(duì)于對(duì)象a可見,可能存在以下幾種情況。”說著他在白板的可見性幾個(gè)字下面又增加了幾行。
可見性
1. b 在 全局范圍內(nèi)。
2. b 是a的成員變量。
3. a有一個(gè)指向b的指針(或引用),這個(gè)指針(或引用)被正確的初始化。
4. a的成員函數(shù)含有b的指針或引用的參數(shù)。
5. b的定義在a定義的外層。
“看,雖然在模型中都由a發(fā)送message給b代所塑模,但具體實(shí)現(xiàn)上我們可以有至少這么多的方案供選擇。”老C說,“不要狹隘的理解message,
無非就是信息交換而已。”他想了想,“為了保持你的好奇心和進(jìn)取心,我再給你簡單說說當(dāng)兩個(gè)對(duì)象不可見時(shí)它們?cè)趺唇粨Q信息……”
“哦?這樣它們也可以交換信息?”小P追問。
“這時(shí)C++語言沒有提供直接的幫助,我們需要借助外力。如果我們使用類庫,可以用boost的signal/slot機(jī)制,也可以用Qt的signal
/slot機(jī)制;如果我們?cè)趙indows下編程,可以借助windows操作系統(tǒng)的消息并借用MFC的消息映射機(jī)制;如果這些都不可用,我們還可以自己
依照command模式和observe模式設(shè)計(jì)一套機(jī)制來自己使用……這些話題我們以后一定可以討論到,現(xiàn)在就先不要著急啦。”老C吊起了小P的胃口,
但是又不再繼續(xù)下去。
“是嗎?”小P問道,心想自己需要學(xué)習(xí)的地方還挺多的。
“好,現(xiàn)在我們就具體看看sequence diagram。”老C說道。說著他讓小P打開電腦,照著AppleGame的代碼在白板上畫出了如下圖形。
AppleGame
“我來解釋一下。”老C先指著class diagram
AppleGame說道,“在這里我們只要先知道AppleGame類與ChildList類有關(guān)聯(lián)就可以了,至于具體是什么關(guān)聯(lián),我們以后再說。”然后
他解釋道,“由于我已經(jīng)知道這兩個(gè)class的成員函數(shù)了,為了省事就直接寫在里面,其實(shí)更合理的做法是先不要在這里寫需要的成員函數(shù),而是應(yīng)當(dāng)在有了
class diagram后馬上去建模sequence diagram,根據(jù)解決問題的需要再回頭給class
中添加具體的成員函數(shù)。”看到小P看得聚精會(huì)神,他就停了一會(huì)兒,喝了一口水,等小P先消化消化。
“……嗯,然后呢?”幾分鐘后,小P問道。
“sequence
diagram表示了對(duì)象間數(shù)據(jù)交換的順序和過程,你可以在每個(gè)message上看到標(biāo)注的數(shù)字,那表示順序。”老C接著說道,“每個(gè)對(duì)象下面垂直的虛線
叫l(wèi)ife
ine,表示對(duì)象的生存期;虛線上的長條矩形叫做activation,表示對(duì)象是否活躍,你就認(rèn)為是函數(shù)的執(zhí)行期,activation之間可以重疊;
水平的實(shí)線實(shí)心箭頭表示同步消息,關(guān)于同步消息和異步消息我們以后再討論,你現(xiàn)在全部使用同步消息就可以了,指向?qū)ο笞约旱南⒈硎菊{(diào)用自己的函數(shù);虛線
表示返回消息,你可以理解為返回值;中間的方框叫combined fragments,包括alternatives, options 和
loops。你可以根據(jù)我們已經(jīng)有的代碼體會(huì)體會(huì)sequence
diagram的用法。”他想了想,“對(duì)了,關(guān)于圖的名稱也有要求,sequence
diagram要求以sd開頭,后面是所描述場景的概要說明,比如我們這里的sd PlayAppleGame。”
“哦,我學(xué)習(xí)學(xué)習(xí)。有什么線索沒有?”小P追問。
“嗯,關(guān)于UML工具有很多,跨平臺(tái),GPL的也不少,我試用了一些,感覺visual paradigm和magic
draw還不錯(cuò),這兩個(gè)都有community版本的,可以供我們學(xué)習(xí)和進(jìn)行非商業(yè)活動(dòng)用。你還可以登陸到www.umlchina.com,那里也有一
些很不錯(cuò)的資料和書籍介紹。但是根據(jù)我的經(jīng)驗(yàn),UML還是要多用,而且不要一次學(xué)習(xí)的過于深入為好,因?yàn)閁ML的語義很豐富且理論性比較深一些,而且同樣
的事情可能有不同的圖形都可以描述,所以最好根據(jù)需要,一點(diǎn)一點(diǎn)的學(xué)習(xí),邊學(xué)邊用最好。”老C說道。
“哦,是啊。”小P點(diǎn)點(diǎn)頭。
“UML是建模工具,不是編程工具。模型需要對(duì)實(shí)際的事物進(jìn)行合理的剪裁和取舍,注意模型的清晰性比信息的完備性更重要,如果不論青紅皂白的將所有信息一
股腦全部放在模型上,那樣圖形看起來會(huì)很恐怖的。”老C接著解釋,“所以不要要求模型完全反應(yīng)細(xì)節(jié)信息,只要在大方向上對(duì)就可以了。同時(shí)你還要了解模型所
要描述的問題規(guī)模,如果是一個(gè)大型的交易系統(tǒng),按照我繪出的sequence
diagram的詳細(xì)程度,那是根本不可能的。在描述這樣的系統(tǒng)時(shí),可以省略足夠的細(xì)節(jié),可以在框架結(jié)構(gòu)的規(guī)模上表現(xiàn)清楚就可以了。”老C道。
“是么?看來我還需要在實(shí)踐中學(xué)習(xí)啊。”小P說道,“看來以后你還要多給我說說這方面的道理。”
“呵呵,好啊。反正國慶假期也快到了,如果你沒有什么事情的話就繼續(xù)完善我們的sd PlayAppleGame如何?將List類也加入其中。” 老C問道。
“好啊好啊。”小P道,“我可以趁沒有出去玩的時(shí)候自己畫畫試試。”他想了想,“但是如果有什么不會(huì)的我可要打你的電話啊。”
“當(dāng)然可以,”老C說道,“如果沒有人接那是我在外面沒有聽見,你最好晚上打。”
(看看小P如何完成sd PlayAppleGame)
注:
本章中的許多內(nèi)容都穿越啦。Visual Paradigm在2003年還沒有出來這一套UML2.1標(biāo)準(zhǔn)的UML工具,而老C說的在class
model中導(dǎo)航的OCL語言也是在2006年左右才出來的。本章中sequence
diagram中使用的很多符號(hào)都是UML2.0標(biāo)準(zhǔn)的,這在2003年根本沒有……