18.3 好的編程風(fēng)格
盡管你將進(jìn)行先進(jìn)的面向?qū)ο蟮能浖_發(fā)了,但一些在面向過程的年代就已經(jīng)總結(jié)出的好的編程風(fēng)格在任何時候(至少在可預(yù)見的未來)都不會過時。本節(jié)將教給你這些放之四海皆準(zhǔn)的規(guī)則,這些規(guī)則不是強(qiáng)制性的,但遵守它們毫無疑問會使得你的生活變得容易。 好的風(fēng)格意味著以一種易維護(hù)的方式進(jìn)行編程。你的代碼應(yīng)該容易到足以使任何人都能夠理解它。這倒不是說其他人需要查看你已經(jīng)編寫的這些代碼(當(dāng)然這種情況可能會發(fā)生),而是說當(dāng)你需要進(jìn)行調(diào)試或修改錯誤時,你能夠快速的理解你已經(jīng)開發(fā)出的到底是些什么東西。人們總是很容易失去自制力的試圖去建立某些東西而忽視了有益的整理工作。草率的行事將引起無限的煩惱,因此你應(yīng)該總是盡力遵循好的編程風(fēng)格。 當(dāng)然,“好”不能輕易得到,“好”通常就意味著大量的工作。在這里,好就意味著:好的名字、減少重復(fù)、總是注釋,以及分離代碼和數(shù)據(jù)。
18.3.1 好的名字
什么是好的名字?在編程世界中的好名字的概念和我們?nèi)粘I钪泻妹值母拍钣泻艽蟮牟煌。在我們的日常生活中,一個好名字往往意味著非常值得推敲:或者是表達(dá)父母的良好愿望,或者是字典中絕妙的解釋。但一個日常生活中的好名字用在程序中卻是很糟糕的,一個這樣的名字無法提供除名字之外的其他信息。
在編程世界中,判斷一個好名字的標(biāo)準(zhǔn)是是否能夠以最少的字符提供更多的信息。在Flash中,我們可以且需要命名的東西是非常多的,每一個按鈕或電影剪輯的實例,每一個文本實例,都有可能需要命名;每一個變量,每一個函數(shù),每一個類,都必須命名。 在Flash中,當(dāng)你命名一個事物的時候,你應(yīng)該盡量讓這個名字反映出這個事物的所有重要的信息。例如:fishCounterMC作為一個統(tǒng)計魚缸中魚的數(shù)量的電影剪輯的實例名就很不錯。很多天后,當(dāng)你再次見到這個名字時,你能夠在瞬間獲得許多重要的信息。首先,一打眼,我們就能知道這個名字指代的是一個電影剪輯(MC表示MovieClip),因此,這個名字是一個電影剪輯實例的名字,其次,我們能夠看出這是一個用來計數(shù)的電影剪輯(根據(jù)Counter),最后,我們可以推斷這個計數(shù)器應(yīng)該是來統(tǒng)計魚的(根據(jù)fish)。 當(dāng)為變量命名時,能夠在變量名中體現(xiàn)出這個變量的數(shù)據(jù)類型將是很有益的。childAge_Num作為一個用來保存孩子年齡的變量的名字會是不錯的,從Num這個后綴我們可以意識到這個變量應(yīng)該保存的是數(shù)字?jǐn)?shù)據(jù)類型。
有的時候,為了給事物賦予一個更有意義的名字,傳遞更多的信息,你會發(fā)現(xiàn)名字正在變得越來越長,這不是好事情,太長的名字同樣會造成閱讀的困難。因為太多長名字堆積在一起會使得你看不清程序的邏輯,因此,對待任何事情,你都應(yīng)該保持適可而止的態(tài)度,很多時候,你需要在傳遞更多的信息和防止太長的名字之間進(jìn)行妥協(xié)。
18.3.2 減少重復(fù)
要使事情變得簡單,每一個編程工作應(yīng)該在你的電影中只出現(xiàn)一次。如果你的同一段代碼出現(xiàn)在兩處,那么你的更新和修改Bug的工作也將加倍。你將學(xué)到一些方法來實現(xiàn)這點,譬如說將腳本保存在庫中、保存在函數(shù)中或從外部引入電影。任何時候,每當(dāng)你打算拷貝和粘貼代碼時,一個不大的聲音應(yīng)該在你的頭腦中響起—“住手!”?倳幸粋更簡練的方法在等待著你。
減少重復(fù)還意味著精煉代碼,盡量用更少的代碼來完成同樣的工作。細(xì)想一下,當(dāng)你為調(diào)試Bug而回頭檢查你的程序時,你所檢查的每一行代碼都必須在你的頭腦中進(jìn)行翻譯,更少的行你必定讀起來會感覺更好。通常,任何時候你都可以以較少的步驟或更少的代碼來做某些事情。比較在代碼1和代碼2中的兩個代碼段,它們實現(xiàn)的是同樣的效果,但代碼2中的代碼要精煉的多。
代碼一: on (release){ setProperty ("highlight", _x, getProperty ("highlight", _x)+10); tellTarget ("highlight"){ gotoAndStop(getProperty("",_currentframe)+1); } }
代碼二: on (release){ highlight._x+=10; highlight.nextFrame(); }
那些在代碼一中的腳本實現(xiàn)的是與代碼二中的腳本同樣的效果,只是添了沒有必要的復(fù)雜性而已。這除了能引起比你水平低很多的選手的崇拜外,沒有更多的意義。
誠然,沒有什么方法是法定的最好的方法,但減少重復(fù)和精煉代碼毫無疑問是有益的。當(dāng)然,你也沒有必要把減少重復(fù),精煉代碼這點貫徹得太徹頭徹底。精簡代碼的要求不應(yīng)重于易讀性。徹底失去自制力并最終終結(jié)于一堆連你自己都無法閱讀的代碼是很容易的事情。我永遠(yuǎn)都不會在一個能夠工作的已完成的代碼段中挑刺兒—因為,說真的,這才是最優(yōu)先要考慮的。其次,你的代碼通常都是由你來維護(hù)的,因此,編寫出你能夠閱讀和理解的代碼是最重要的。盡一切可能使用你能夠理解的代碼。如果這有時意味著你的代碼羅嗦一點的話,那也只能由它去了。隨著時間的推移,慢慢地你將看到你的代碼正在逐漸縮短。
有時,當(dāng)我審視那些僅僅是幾個月前才編好的程序時,我也會質(zhì)疑我當(dāng)時所采用的方法—但這僅僅是因為我總是在進(jìn)步。如果你打算等到你的技術(shù)變得完美時再做的話,你將等待太長的時間。因此就這樣投入進(jìn)去吧,時間自會證明你能夠進(jìn)步。
18.3.3 總是注釋
在Flash中,注釋是以//開始的文本。注釋在Flash中是被忽略的代碼行。注釋絕不是Flash的特點,翻開任何一本涉及編程的計算機(jī)書,你都會發(fā)現(xiàn)里面有有關(guān)注釋的重要性的論述。的確,注釋是非常重要的,怎么強(qiáng)調(diào)都不會為過。注釋能使你在數(shù)月甚至數(shù)年后仍能知道每段代碼的作用,仍能夠繼續(xù)對程序進(jìn)行后續(xù)開發(fā)和維護(hù);能夠在必要時候,讓別人看懂你的代碼,他(她)會一邊看一邊體味你的仁慈,并心懷感激,發(fā)誓也要做像你這樣的好男孩(或好女孩)。
我認(rèn)為我是一個壞男孩,因為我經(jīng)常做不到對我的代碼進(jìn)行充分的注釋,直到我讓它運(yùn)行起來為止。但不管怎么說,沒有將這一步繼續(xù)拖延下去對我來說很重要,因為在我寫出它的幾天之后,我會將有關(guān)這段代碼的一切忘的一干二凈。沒有注釋,代碼的理解將變得困難的多。因此,花上一些時間去注釋你的代碼吧,即使你已經(jīng)完成了你的代碼且熱情也日漸下降。比較一下代碼三中沒有注釋的代碼和代碼四中同樣的一些但做了注釋的代碼。盡管你目前可能不明白這些代碼的細(xì)節(jié),但如果這里存在問題的話,你將能夠輕松的識別出包含問題的部分。
代碼三: OnClipEvent (keyUp) { if (Key.getAscii()==13 | Key.getAscii()==0){ return; } if (Key.getAscii()==8){ if (cur.charAt(cur.length-2)==" "){ _root.wordThisTime--; } cur=cur.slice(0, cur.length-2)+mbchr(8); if (_root.wrongPlace[_root.place-1]=="x"){ _root.wrongPlace.pop(); _root.wrongs--; } _root.place>0 && _root.place--; return; } }
代碼四: OnClipEvent (keyUp) { //忽略這些字符 if (Key.getAscii()==13 | Key.getAscii()==0){ return; } //假如他們點擊退格鍵 if (Key.getAscii()==8){ //刪除一個空格? if (cur.charAt(cur.length-2)==" "){ _root.wordThisTime--; } //刪除最后的字符 cur=cur.slice(0, cur.length-2)+mbchr(8); //他們修改了一個錯誤嗎? if (_root.wrongPlace[_root.place-1]=="x"){ _root.wrongPlace.pop(); _root.wrongs--; } //后退一格 _root.place>0 && _root.place--; //離開 return; } }
代碼三在被注釋前,其中的代碼理解起來很困難。代碼四說明了不多的一點注釋就使得事情變得明朗,即使你還不明白這些代碼的潛在含義。
18.3.4 分離代碼和數(shù)據(jù)
所有的程序設(shè)計師都應(yīng)該力爭使代碼(簡單的說就是編程腳本)和數(shù)據(jù)(或說特定工程的內(nèi)容,例如:文本和圖形)保持分離。通過保持代碼和數(shù)據(jù)的分離,你能夠使你的編程成果輕松的移植到其他的工程。同樣的,當(dāng)你想要對內(nèi)容作重大的改變時—比如說,以不同的語言重做整個工程—你只需要替換數(shù)據(jù)而不必去碰(或破壞)那些代碼。這是偉大的思想但有時難以實現(xiàn)。
假定你的Flash站點中有一些圖形按鈕,當(dāng)用戶將他的鼠標(biāo)指針放置到按鈕之上時這些圖形按鈕將顯示出一個浮動的工具提示。如果你保持代碼(使工具提示出現(xiàn)的腳本)和數(shù)據(jù)(實際將出現(xiàn)在工具提示中的文本)分離。你能夠輕松的將這個功能移植到另一種語言,而你所做的只是用另一種語言的文本來替換工具提示。理想的情況是,你將所有工具提示的所有文本保存在同一個位置,這將使得移植工作變得更加的輕松。這一思想的主旨是你應(yīng)該盡量做到對代碼或數(shù)據(jù)中任何一個所做的重大改變都不會對另一個產(chǎn)生影響。
你可以將代碼數(shù)據(jù)分離視為一種模塊化形式。還有一些其他的模塊化形式—包括Flash的loadMovie(),它使你能夠在一個更大的電影的內(nèi)部播放獨(dú)立的.swf文件。除了所提及的代碼數(shù)據(jù)分離之外,模塊化還有許多其他的優(yōu)點。首先,通過模塊化你的Flash電影,用戶們不需要等待整個電影的下載。他們可以有選擇的下載那些那他們感興趣的部分。此外,模塊化也使得一個工程可以被干凈的剝離成幾個獨(dú)立的部分,從而使得這些部分可以同時進(jìn)行開發(fā)。思考這樣一種情況,如果你的整個電影僅由一個基本文件構(gòu)成,則同時只能有一個人可以工作。因此,可以看出,代碼數(shù)據(jù)分離及其它的一些模塊化形式有著許多的優(yōu)勢,你應(yīng)該盡量保持以模塊化的思想來考慮問題。
出處:藍(lán)色理想
責(zé)任編輯:qhwa
上一頁 面向?qū)ο蟮能浖_發(fā)中的重要概念 下一頁 ActionScript術(shù)語
◎進(jìn)入論壇Flash專欄版塊參加討論
|