程序設計是困難的,其核心是管理的復雜性。計算機程序是人類做出的最復雜的東西。質量是不可靠的且隱蔽的。
好的體系架構是必需給程序足夠的結構使其健壯而不會陷入混亂的泥淖,但我們表達一個程序細節的方式是同等重要的。一個程序的本質會被不良的編碼所隱藏。只有當一個程序的表達清晰時,我們才能有希望正確的推理出它的效率、安全和正確性。
William Strunk的《風格要素》(The Elements of Style)是關於文學風格的經典著作,它是一本關於英文寫作的薄手冊,在用法、組織和形式上提出忠告。風格的理念應用於編程,在1972年Kreitzberg和Shneiderman的《FORTRAN風格要素》(The Elements of FORTRAN Style)中是不成功的,但在1978年的Kernighan和Plauger的《編程風格要素》(The Elements of Programming Style)中是非常成功的:
好的編程不能通過籠統的說教。學習編程的好方法是一次又一次的思考:真正的編程是如何通過一些良好實踐的原則和一點常識來進行改進的。
他們從他們批評和改進的其他的編程教科書中篩選程序。
當我們在這裡談論風格時,我們談論的不是潮流或者時尚,也不是CSS、布局慣例或排版。我們正在談論的是能真正提高代碼價值的表達式的永恆品質。對於公司來說,他們的評估和他們的代碼是息息相關的,風格應該是一個至關重要的受關注內容。
我們使用許多編程語言,但在某一方面,Javascript是最重要的,它是浏覽器的語言。當人們訪問我們的站點時,他們將邀請我們的Javascript程序在他們的機器中執行。我們有義務使那些程序執行好。
沒有好的關於Javascript編程的課本。在網頁使用Javascript的大多數人學習它是通過從糟糕的書、糟糕的站點和糟糕的工具中復制相當糟糕的例子。我們這裡有極好的Javascript程序員社區,但我們依舊能從較好的風格實踐中獲益。
為了證明這個問題,我將從公共網站中抽取一些程序,展示它們如何能被改進。這並不是我有意為難任何人。我的意圖僅是通過例子展示風格的價值。我不會保留任何秘密:我展示給你的是我們已經傳送給世界上的每一個人。
淘汰過時結構
下面的例子是2005-09-19摘自www.yahoo.com:
<script language=javascript><!--
lck='',
sss=1127143538,
ylp='p.gif?t=1127143538&_ylp=A0Je5ipy2C5D54AAwVX1cSkA',
_lcs='';
--></script>
這個腳本塊用了language屬性。這個特性是微軟為了支持VBScript引入的。然而Netscape采用它是為了支持非標准偏差。W3C不采取這個language屬性,傾向使用MIME類型的type屬性取代。不幸的是,MIME類型未得到標准化,所以它有時是”text/javascript”、”application/ecmascript”或其他。幸運的是所有的浏覽器都選擇Javascript作為默認的編程語言,所以簡單的寫<script>是最好的。它最小,且工作在最多的浏覽器。在腳本中使用HTML的注釋的時間要回溯到Netscape Navigator和Netscape Navigator 2的兼容問題上來。後者引入了<script>標簽。然而,前者的用戶能像文本一樣看到腳本,因為在HTML慣例中不能識別的標簽被忽略。<!–注釋hack在Netscape Navigator 3出現的時候是需要的,現在它不被需要了。它是丑陋的且浪費空間的。
逗號運算符像Javascript語法的大多數一樣從C語言中借用。逗號運算符獲得兩個值,且返回第二個。在語言的定義中它的存在易於掩蓋一定的編碼錯誤,編譯器也易於對一些錯誤視而不見。最好避免逗號運算符,並以分號運算符代替。
在這個案例裡,我們定義了一些全局變量。當指定一個未知(匿名)的變量時,Javascript會創建一個新的全局變量來替代產生的錯誤。事後看來,這是一個錯誤。即使當他們是一個標准錯誤,這是避免錯誤的最好辦法。我們應該明確的聲明變量。它花費我們四個字符,但是它正是要做的正確的事。
<script>
var lck = '3ek6b0i2he2a5eh3/o',
sss = 1126894256,
ylp = 'p.gif?t=1126894256&_ylp=A0Je5iOwCitDw2YBX331cSkA',
_lcs = '94040';
</script>
從上面我們能得出這樣的原則:淘汰過時結構
結構化語句要始終使用區塊
下面這個例子是一個cookie類構造器。它創建了一個有get和set方法的對象。
function yg_cookie() {
this.get = function (n) {
var s,
e,
v = '',
c = ' ' + document.cookie + ';';
if ((s = c.indexOf((' ' + n + '='))) >= 0) {