開發網頁設計的過程-複製和貼上
在侃侃而談網頁設計,侃侃而談設計模式,侃侃而談面向物件的諸多原則之前,我們首先應該掌握一點:編譯。掌握好編譯的原則和技巧之後,就算使用的不是網頁設計語言,也能構造出框架優美的程式。將這些原則用在程式之外,也能得到出奇的效果。《設計規則-模組化的力量》將編譯與模組化放在神壇的高位,它們配得上這個位置。這是我們解決複雜性問題的最基本的方法(沒有之一)。
程式是一種複雜性系統。“道生一,一生二,二生三,三生(四,四生…)萬物”。若將複雜性的根源當作“道”的化,那麼這個“一”必然是編譯。不同的程式語言以及由這些程式語言衍生的方法,則處於“二”的地位,比如 網頁設計 設計範式、FP(函數編程)範式、分層的原則等等。網頁設計設計準則,什麼裡氏替換原則,什麼組合優先于繼承,這些處於“三”的地位,具體的設計模式什麼之類的處於“三”之後“四”的地位。
本人愚笨,至今尚記不清那些原則,如裡氏替換原則是什麼,那些這個模式那個模式怎麼實現。設計模式中,俺只對策略模式感興趣,對其他模式興趣索然。實質上這些模式也好、準則也好,只是給我們提供了一種方法、一種工具去更好的實現編譯。
複製和貼上是編譯的大敵,是醜陋程式碼的最大的壞味道。複製一份,就相當於增加了至少一個可變點,複製兩份就相當於增加了至少兩個可變點。為什麼說“至少”呢,因為模組之間存在關聯關係,導致一個地方的變化會導致其他的多個地方也必須隨之變化。如果假定S為系統本身,M為對系統本身的一個測量,C為系統S中模組的平均複製份數(C>1),則這個M與C的關係應該是一個指數的關係: M正比於C的N次方(N>1)。
指數關係已經很可怕了,更可怕的是,當系統中的模組出現變化時,如果該模組在系統中有多個模組,我們可能偷懶,只改變了其中的一個模組,而不是全部模組都進行修改,這樣就導致模組的分裂,由一個模組分裂成幾個類似而又不同的模組,大大的增加系統的複雜度,最終導致系統的腐爛。直覺上,一個設計很爛的系統,它的複雜度大致是模組數量的階乘關係甚至是冪指關係,這是比指數關係更恐怖的關係。
所以,複製和貼上是一種非常邪惡的編碼方式。在編碼時,需要千方百計的去想辦法減少複製和貼上。這是在編碼時就應該注意的問題,而不是放在重構階段去做的事情。至於使用什麼方法,使用什麼手段,使用什麼模式則是細節問題。
堅持不複製和貼上,堅持下來,收益會非常大,寫出來的程式碼品質高、含金量高。看見別人的系統,能馬上分辨出這個系統的優點是什麼,缺點是什麼。什麼設計模式也好,介面的正交性也好,設計原則也好,也許你從沒刻意的去學過,卻最終發現殊途同歸,冥冥之中與國外大牛有一種心意相通的感覺。會自發的去組合、去改良這些大牛們的思想和方法,甚至去創造新方法新手段。直接由一入手,一生二,二生三生四,而非教條的、頂禮膜拜的去學這個三,學這個四。或許那個時候,你已經忘記什麼是物件了。
之所以發這些牢騷,是因為昨天至今天,正在重構一個模組。這個模組M1的核心部件是一個包裝自RTF的layout規則編輯器。設計這個核心部件的哥們以RichTextBox為中心設計了一個控制項A,然後將這個控制項的部分規則邏輯抽出來放在類B和類C的靜態方法之中,更神奇的是這個類B是在另一個模組M2之中,類C倒是在模組M1之中。這個控制項在M1中被三個地方給用到:D、E、F,這D、E、F每個地方都要為這個空間A註冊七八個事件,然後在事件的回調函數中調用模組M2中的類B的靜態方法及模組M1中的類C的靜態方法去實現一些邏輯。現在呢,我要寫一個控制項G,這個G也要用到控制項A,在這種情況下,我必需為G註冊一堆A的事件及回調函數,然後在回調函數中弄一堆邏輯,至少得200行程式碼。為了寫這些回調函數,我必須得搞清這個A控制項及類B,類C的內部運行機制。也就是說,為了吃豬肉必須得親自去殺豬。當然,也可以從D、E或F 中Copy程式碼過來改吧改吧來節省時間。
問題嚴重的地方在於,這個控制項A本身存在邏輯錯誤,存在功能不完善的地方,需要對它動手術。因為到處複製,牽一髮而動全身,給A動手術必須也要給B、C、D、E、F五個類動手術。在給A動手術時,為了編譯通過,我將B、C、D、E、F中與A相關的程式碼全給注釋掉了,前後注釋了1500行程式碼左右。實質上這1500行程式碼真正有價值的程式碼也就在200行左右,其他的程式碼全是複製、貼上,然後改改變數名完成的。
為什麼會出現這樣的問題呢?因為複製和貼上。複製和貼上省事啊,Copy過去改幾個詞就能用了,不用花費心思的去想編譯。而實際情況是,要引用那個控制項A,得寫200-300行程式碼,多引用幾處,就得寫1000多行程式碼,複製和貼上的話倒不費事,但如果發現這個A存在錯誤,或者需要擴展,在改A的同時,同時也要動這1000多行程式碼,這1000多行程式碼中可能會牽扯到更多的程式碼,最終導致必須修改更多的程式碼,這便是程式碼的腐爛。
其實這個A是很好編譯的,它不需要其他的類對它輸入任何輸入資料,其他的類只需要從A控制項中獲得一個最終的規則結果,一個List。編譯的好的話,調用A,獲得結果,兩三句程式碼就可以實現。
之所以不編譯是因為習慣了複製和貼上,或者懶于去編譯,或者頭腦中根本沒編譯這根弦。
很多新程式師或者不新的程式師,尤其是Web開發程式師老抱怨工作的技術含量低,老是想學更多的東西。實質上,他們所作的工作是非常有技術含量的東西,就看怎麼看待。
如果只將自己的工作看作簡單的複製、貼上、抄襲、改程式碼的話,自然技術含量低了。如果將自己的工作看作如何消除複製和貼上、如何提高品質、進度,消除工作中的不必要事情,消除各種浪費,那麼這個工作的技術含量是極其高的。不要膜拜大師,當你這麼做的時候,你做的正是大師的工作。不要膜拜新技術,當你這麼做的時候,你的工作可能正是新新一代技術的萌芽。一點一滴、一色一香,全在心中。青青翠竹、儘是法身,鬱鬱黃花、無非般若。
轉貼來源:網頁設計知識部落格
參考文獻:
1.李果益,2001,JAVA 技術手冊,台北:美商歐萊禮股份有限公司台灣分公司。
2.易芙瑛,2002,影響企業導入可延伸性企業報告語言(XBRL)之因素探討,私立中原大學會計系碩士班未出版論文。
3.吳政隆,2002,以XML 為資料擷取介面之審計系統實作,私立中原大學會計系碩士班未出版論文。
相關文章
登錄從網頁設計開始您優化網頁設計的系統目的是什麼?如何Review網頁設計的Code的問題網頁設計開發有這麼簡單嗎?九種最常見網頁設計SEO外連的方式
最新文章
HVACKer:入侵隔離網絡的新型攻擊技術還有什麼不會被入侵?路由器 LED 燈已成為攻擊入口美 5 家獨角獸同天申請 IPO 掛牌,最狂的是一家估值 124 億美的數據分析新創!【台灣「智慧產業」開始佈局】緯創集團領投跨國 AI 新創 iKala,下一步拓展東南亞市場快可以用手機遠端遙控你的所有家電了