25/01/2007
如何成為令人倚重的程式設計師之另類思考
昨晚與好久不見的朋友餐敘,提及當年某公司有一個 "優秀" 的 RD 部門主管及另一個 "重要" 的程式設計師。那位 "優秀" 的 RD 部門主管總會用正規的方式設計,有良好的軟體架構,並且開發過程中及完成後,都會提供其設計文件、使用手冊或範例程式。
另外有一個公司所 "倚重" 的程式設計師--並不是說他不優秀,只是他對公司的重要性,大於他的優秀性。
公司裡面複雜的系統,只有他能維護。而前人所留下的程式,並沒有相關的文件說明該系統的整體架構設計跟思維。
這就產生了一個有趣的現象:對於一個程式設計師而言,把事情做到最好 (除了寫程式外,還寫了讓人看得懂的文件等等),對他本身而言並不一定是好事。當別人越了解你的系統,你的可替代性就越高,那麼你的價值不就越低?
反之,若有人能寫出他自己才看得懂的程式碼,就算上級要求寫文件,也是寫一些高深莫測、形而上學的東西(諸如,用90%的篇幅介紹物件導向的基本觀念,然後說明只要了解物件導向或設計模式的觀念,再自行 trace 程式,就能理解系統運作)。
這樣一來,後人無法維護該套系統,完全是後人資質不佳或能力不足。這樣,他就成為令人倚重的程式設計師了。
以上所言,並不代表本人立場!
PS: 即使是某公司那一位令人倚重的程式設計師,也沒有達成我上述的要求,因為他沒有寫出需要睿智才看得懂的文件。何況,那些不可維護的程式碼,他也曾經力圖改良,想讓人看懂過!
11:25 發表於 Developing, Diary, Lifehacks, Thinking | 永久網址 | 留言 (3) | Email this | Tags: greatest, programmer, how-to, thought
16/12/2004
Java 訊息多國語言化 How-To
關念篇
我們先就觀念上來說明,之後再說明實務應用。
兩個步驟完成多國語言訊息顯示
Java 多國語言的作法,說穿了只需兩個步驟:
一、資源外部化
要達到多國語言支援的功能,必須把原本寫在程式裡面的訊息抽離出來,放在資源檔中。而程式裡面原本直接存取訊息字串的地方,則必需修正,改由資源檔中抓取。如此一來,我們就可以在產品 release 後,自由變更欲顯示的訊息。
二、決定採用何種語系的資源
光是上面一步還不夠,因為我們必須「見人說人話,見鬼說鬼話」。要讓系統能針對不同語系的使用者顯示不同的訊息,我們必須為不同的語系提供不同的資源檔。 例如,假設我們的產品要支援英文、簡體中文與正體中文,那我們必須建立三個 properties 檔案。將它們各分別命名為:
- message.properties - 預設訊息,裡面放置英文訊息
- message_zh_CN.properties - 簡體中文版訊息
- message_zh_TW.properties - 繁體中文版訊息
如此,這三個訊息檔同屬一個 resource bundle,其 bundle 名稱為 message。
有了上面三個訊息檔後,我們如何在執行期決定要從哪一個訊息檔裡面,抓取訊息顯示給使用者看呢? 其實 Java 提供了一個 java.util.ResourceBundle 類別,幫助我們在執行期取得最合適的 resource bundle。原來這個 ResourceBundle類別會在執行期偵測目前應用程式執行環境所使用的語系及區域 (以台灣為例,語系是zh中文,區域是TW),並以此資訊對應程式給定的 bundle 名稱,動態組合出使用者語系所在的資源檔。
訊息檔的格式
Java resource bundle 的訊息檔格式,與一般的 properties 檔案格式相同。也就是由許多組的 name/value pair 組成。名稱與值中間以等號隔開。例如,假若應用程式中有 OK 及 Cancel 兩個按鈕,在英文的訊息檔中,可以設定成:
OKKey=Ok CancelKey=Cancel若是中文訊息檔,就比較麻煩一點,你必須先將它們編輯成
OKKey=完成 CancelKey=取消然後存檔,再執行 native2ascii.exe,將檔案轉成以 ascii 格式表示的 Unicode,如此 ResourceBundle 才能買單。
轉換過的訊息文字難以閱讀,例如:
世界真奇妙!!!會被編譯成:
u4E16u754Cu771Fu5947u5999!!!你看得懂嗎?
其實現在有許多工具,可幫助我們去編輯 resource bundle,而不用自行處理 properties 檔案。這個等一下我再以範例介紹。
resource bundle API 簡介
取得 resource bundle
如果要取得應用程式預設的 resource bundle,可用
ResourceBundle myResources = ResourceBundle.getBundle("MyResources"); 若是想要自己設定特別的使用者語系,則可用 ResourceBundle myResources = ResourceBundle.getBundle("MyResources", currentLocale); 其中的 currentLocale 是你(或使用者)所選用的 locale。這種方式常用在 web 環境中,試想,假如 servlet container 預設的 locale 為 zh_TW,然而網站瀏覽者可能是來自海外的老美,他想看到的 locale 是 en_US。上面的 currentLocale 參數,正可以解決這個問題。 讀取一個訊息值
以上面所舉的 Ok 鈕及 Cancel 鈕為例,要取出這兩個訊息,可用下面方法:
button1 = new Button(myResources.getString("OkKey")); button2 = new Button(myResources.getString("CancelKey")); 實務篇
我們採用 Eclipse 來幫助我們建立 resource bundle。假設我們有一個原始檔如下:
public class ExternalizeString { public static void main(String[] argv){ System.out.println("Hello World!"); } } 這裡說明如何使用 Eclipse 將它多國語言化!
文字訊息外部化
首先說明 Eclipse 內建的文字訊息外部化支援。透過這項功能,不用你動手改一行程式碼,Eclipse 就能幫你把所有訊息文字放到外部的檔案中。
執行 Externalize String
如下圖,在原始碼編輯器中,以右鍵選單選擇「source/Externalize String」,將文字訊息外部化。儲存變更檔案
如果你剛編輯過原始碼,但尚未儲存,便會出現以下畫面提示你儲存原始碼。這裡當然要按「Ok」繼續進行囉!訊息外部化設定
系統此時出現一個精靈讓你做訊息外部化設定。你可以在此頁設定要將訊息存入哪個 resource bundle 中、此原始檔中訊息外部化時所欲採用的前置詞、各個訊息的 key、以及存取外部訊息所用的類別名稱。完成之後按「next」外部化結果確認
這時候出現的頁 面,可讓你瀏覽 Eclipse 為你做了多少事。包括它所變更的原始碼,以及新建的 properties 檔案等等。你可以在畫面上點選不同的元素瀏覽。如果你覺得 Ok,那就按「Finish」確認,Eclipse會將結果寫入專案中。若是你不滿意 (有什麼好不滿意?),那就按「Cancel」,一切就當作沒發生過。以下是經過 Eclipse 更改過後的程式碼:
public class ExternalizeString { public static void main(String[] argv){ System.out.println(Messages.getString("ExternalizeString.hello")); } } 建立多語系的 resource bundle
當然你可以用我前面的方式,自己動手撰寫各語系的 properties 檔,然後再下指令把訊息檔轉成 UTF8 編碼。只是這樣做不但麻煩,而且也沒有生產力。更討厭的是,一旦你想修改已存在的中文訊息檔,卻得面對一堆編過碼的文字,實在難以下手。
這裡提供一個 Eclipse plug-in - JInto - 它主要的功能,包括:
- 讓你同時編輯多個語系的訊息檔
- 產生新的 locale properties 檔案
- 搜尋重複的訊息...
我不打算說明它的每個功能。因為其實在下載並安裝後,其 Help 中已包含了完整的功能介紹。這裡僅作一個快速的應用示範。
開啟 resource bundle 檔
假設我目前系統中有兩個 resource bundle 的訊息檔,其檔名分別別 message.properties 及 message_zh_TW.properties。則當我以 JInto 的「Java ResourceBundle Editor」開啟其中任一檔案時,該 Editor 會把所有語系訊息全部顯示在同一個畫面上,如下圖所示:
你可以按畫面上的 + 號新增、- 號刪除一行訊息。雙按任何 cell 則可修改文字。
新增某語系的訊息檔
在上圖中指標指示處有個「Add New Language to ResourceBundle」按鈕,可以讓你新增其他語系訊息:
畫面上我所選擇的是簡體中文的語系。確認後按「Finish」鈕。
編輯新增語系
上 一動作完成後,從「Package Explorer」中你可以看到系統新增了一個 message_zh_CN.properties 檔案,其中放置簡體中文的資料。而「Java ResourceBundle Editor」中則新增一行「Chinese (China)」,讓你輸入訊息。
當你輸入完簡體訊息後,只要像正常操作一樣,按「儲存」鈕,資料就會寫回檔案中了。
06:55 發表於 Developing | 永久網址 | 留言 (0) | Email this | Tags: Programming, java, i18n, l10n, how-to









