2008年7月30日 星期三

VB 9.0 - 很屌的新功能 XML Literals

到底要學 VB.NET 還是 C#? 這個問題常常被拿出來討論,而討論的結果也常常沒有結論。因為大部分人要不直接推薦他們自己擅用的語言,就是叫你選自己覺得喜歡的。其實大家心理都知道,所有 .NET 語言 compile 出來都是變成 IL,硬要說 C# 比 VB.NET 強大其實有點牽強,兩個語言的相容性絕對是 95% 以上。所以所有的 .NET 語言其實都是平等的,.NET 平台強大的地方在於它的 CLR 跟 Class Library。最近看到了一篇很有意思的文章,裡面形容 VB.NET 為「醜小鴨」,其實一點也不為過。該文章提到說「C# 使用者總有一種模糊的感覺覺得自己在寫的程式碼是既優雅又帶有性格,一定是大括弧產生的錯覺。」,非常有意思。實際上 Visual Basic Expression 版的下載次數遠大於其他版本。還是覺得 VB.NET 是個「玩具語言」嗎?微軟的 Silverlight 裡面的 Javascript Parser 就是用 VB.NET 寫的,這證明了 VB.NET 的能耐絕對足以寫出非常專業的產品。總歸一句話,軟體寫的好不好主要還是看寫的人,使用個工具或語言其次。

好了廢話不多說,今天想來介紹一個 VB 9.0 有,但 C# 3.0 (就是 Visual Studio 2008 的 VB 跟 C# 版本) 沒有的功能 - XML Literals。簡單來講就是可以直接把 XML 打在程式碼裡面處理。表面上聽起來沒什麼了不起,但若你常需要處理 XML 檔案的話,用一次你就知道它的方便性,還有它的優雅。C# 看來不太可能會有這個功能,因為或多或少 C# 都是遵循 ANSI C 的規格,像在程式碼裡面添加 XML 這種怪招,C# 我想不大好去 Implement。廢話不多說先來看一個簡易範例,用 XML Literals 建立一個 XML 文件:

Dim xml = <books>

<book>

<title>Head First Java</title>

<price>800</price>

</book>

<book>

<title>Head First HTML</title>

<price>1000</price>

</book>

</books>

同樣的 XML 用 XmlDocument:

Dim xml As New XmlDocument

Dim booksNode As XmlNode = xml.AppendChild(xml.CreateElement("books"))

Dim bookNode As XmlNode = booksNode.AppendChild(xml.CreateElement("book"))

Dim titleNode As XmlNode = bookNode.AppendChild(xml.CreateElement("title"))

Dim priceNode As XmlNode = bookNode.AppendChild(xml.CreateElement("price"))

titleNode.InnerText = "Head First Java"

priceNode.InnerText = "800"

titleNode = bookNode.AppendChild(xml.CreateElement("title"))

priceNode = bookNode.AppendChild(xml.CreateElement("price"))

titleNode.InnerText = "Head First HTML"

priceNode.InnerText = "1000"

如何,用 XML Literals 的確優雅很多吧?它讓你在處理 XML 的時候,用一種非常視覺化的方式來處理,你的 XML 文件就在你眼前,不用去想像,甚至可以透過匯入 Schema 的動作來讓你的 XML Literal 支援 Intellisense

好建立一個 XML 文件其實只是牛刀小試,XML Literals 還支援 Embedded Expressions,用 <%= %> 來表示非常類似 ASP.NET 的,讓你可以非常快速的,而且視覺化的來動態產生/轉換 XML。下面是一個非常簡易的將上面的 XML Tranform 成 HTML 的範例:

Dim output = <html>

<head><title>Books</title></head>

<body>

<p>

<table>

<tr><td>書名</td><td>價錢</td></tr>

<%= From book In xml...<book> Select <tr><td><%= book.<title>.Value %></td><td><%= book.<price>.Value %></td></tr> %>

</table>

</p>

</body>

</html>

出來的結果就是:

image

非常神奇,不需要去玩 XSLT,也不用甚麼程式碼,直接在 XML Literal 裡面定義就好了。

XML Literal 的功能也還有一種另類的玩法 - 就是拿來當字串,尤其是多行的字串如 SQL 指令,還有用來取代 String.Format(),請看下面的範例:

舊寫法,用 & _

Dim str As String = "這是一段" & vbCrLf & _

"超過三行" & vbCrLf & _

"以上的" & vbCrLf & _

"文字"

MsgBox(str)


新寫法,乾淨許多

Dim xmlLitString = <string>

這是一段

超過三行

以上的

文字

</string>.Value

透過 Embedded Expression 的支援,就可以達到 String.Format() 的效果,但是直接寫在 XML Literal 碼裡面,不用一直加參數跟 placeholder:

舊方式,用 String.Format(),當你的參數越來越多的時候就會變的複雜,不好更新

Dim msg = String.Format("{0}! 現在是{1}" & vbCrLf & _

"你的登入帳號為 {2}" & vbCrLf & _

"電腦叫做 {3}" & vbCrLf & _

"作業系統為 {4}", If(Now.Hour > 9 Or Now.Hour < 4, "晚安", "你好"), Now.ToString(), My.User.Name, My.Computer.Name, My.Computer.Info.OSFullName)

MsgBox(msg)


新寫法,更改方便,不容易出錯

Dim xmlLitMsg = <string>

<%= If(Now.Hour > 9 Or Now.Hour < 4, "晚安", "你好") %>! 現在是<%= Now.ToString() %>

你的登入帳號為 <%= My.User.Name %>

電腦叫做 <%= My.Computer.Name %>

作業系統為 <%= My.Computer.Info.OSFullName %>

</string>.Value

MsgBox(xmlLitMsg)

講了這麼多主要還是想讓大家知道,VB.NET 是個成熟的 .NET 語言,功能上絕對不比 C# 遜色。感覺上使用 C# 的人好像比較多其實主要還是因為是很多人有 C/C++/Java 背景,這些人看熟 C 的語法了,自然對 C# 容易上手,沒有必要花時間去鑽研 VB.NET (雖然我知道很多高手兩個都很厲害),並不是因為 VB.NET 是個比較拙劣的語言。

其實現在 C# 跟 VB.NET 兩者都有很多很好資源,範例可以學習,在這裡還是奉勸大家兩個都學,才不會碰到找到一個解決你問題的範例但是看不懂的窘境。你可以比較熟一個,但至少另一個的基本語法也要看的懂。如果真的沒辦法,沒時間的話,至少有轉換器可以用 :-)。

2008年7月28日 星期一

今年第一個強度夠的颱風

終於來了!真是個善解人意的颱風!不過還是替中南部那些農民有點擔心...大概又會有一堆菜蟲,今天菜市場東西全部賣光。

不過雨下這麼大想偷偷出去買宵夜吃都不行...

2008年7月24日 星期四

Linux 仇恨者?

非常有趣的部落格,是一個仇恨 Linux 的人寫的(英文):

Linux Hater's Blog

裡面充滿的對 Linux 的不滿以及仇恨。不過他的論點幾乎都很正確,比如說為什麼連改變個解析度都這麼難?為甚麼設定個音效卡會這麼複雜,一層又一層的相依性:OSS, ALSA, Arts, ESD, dmix, jack, pulseaudio 等等。還有這麼多開放原始碼的軟體,表面上看來很美好,實際上大部分開發人員根本不管使用者的需求,只管做自己喜歡做的事。還有社群對一般有問題的使用者的態度:「我的沒問題啊」、「Google 上面有啊你不會找嗎」、丟給你一些 Xorg 設定叫你試試看啊,還有社群多喜歡 Fork (把現有的程式分支出來成為另一個程式) 等等。甚至 Linux 的創造者 Linus 都對開放原始碼社群有很多抱怨啊之類的,非常有趣,Linux 使用者必看。

2008年7月23日 星期三

Windows Vista 小祕技 #1

原來在 Vista 裡面在資料夾上按 Shift + 滑鼠右鍵會出現 "Open Command Window Here" (在此開啟命令提示字元) 跟 "Copy as Path" (複製路徑) 的功能。真是不錯啊! 不用再裝甚麼 PathCopy 之類的軟體就可以做到了。

image

Vista 剛出時還挺嫌棄它的,不過到了 SP1 以後真的是越來越好了,不過還是需要高階電腦(雙核心 CPU, 2G RAM 以上)才跑的順,用舊電腦的朋友還是乖乖繼續用 XP 吧。

2008年7月21日 星期一

本部落格正式開張

上次用 Live Spaces 開的 Blog 由於怠慢的關係都沒在更新,是在太慚愧了,希望這次會好一點。