2008年9月24日 星期三

微軟 Tech Ed 2008 第一日 日記

從今天起到禮拜四要去參加一連三天的微軟 Tech Ed 活動,先解釋給沒有聽過這個活動的朋友們聽,其實簡單來講這個活動就是一個很大的研討會而已,微軟針對開發人員以及 IT 人員規劃了各式各樣的課程,讓參與者自由參加。這個活動是要付費進入的,不過會有很多贈品,包括一個多功能背包 (我的一拿到拉鍊就掉了... Orz)。可惜相機被人家借走無法 PO 一些照片給大家看。也有到了一些攤位參觀,藍色小舖,點部落之類的,不過其實只是為了 A 贈品...

早上那個開場致詞以及一些 Demo,其實我大部分時間都是在睡的哈,還好會堂很大可以容納一兩千人,混在人群中可以睡的比較安心。睡到中午之後跟也有註冊參加的同事一起到 101 吃飯,順便參觀一下台灣 Google (他女朋友在那工作) 的辦公室。果然名不虛傳,是個很奢侈(不,是注重員工福利!) 的地方。茶水間一整架的零食當然不用說, 冰箱裡隨意取用的飲料跟哈根大,員工娛樂室,按摩室等等不在話下,台北 101 73樓的視野當然也不用特別說了。果然股價美金 400 元的公司就是不一樣,名不虛傳。

下午參加了幾場關於開發人員的課程,其中有兩堂也是聽到一半就撐不住了 (還好都是在大會堂哈),也不是講師講得的不好,實際上講得內容豐富而且實用性很大,偶爾也穿插幾個冷笑話讓人會心一笑。只不過除了關於 Security 那堂我有完整聽完以外,剩下的兩堂都講一些我比較熟或比較沒興趣的內容。曹祖聖老師真的是很強 (雖然也不是第一次聽他上課啦),稍微懂一點的人一聽就知道他真的是有練過的,其實每個講師都有自己厲害的地方啦不過他比較讓我佩服。

老師上課時有提到一個物件導向設計的概念,我覺得挺有趣的可以讓大家思考一下:

假設我們在寫一個類似世紀帝國的即時戰略遊戲,現在有一個士兵,射了一箭射到一匹馬,那匹馬就減血,這樣的邏輯要怎麼對應到物件的關係上? 好,士兵是一個類別,那隻箭也是,那匹馬也是,應該不難,現在問題來了,攻擊的邏輯 (就是要減多少血那個部份) 是要放在士兵,箭,還是馬?乍看之下好像沒什麼差別,但其實這個決定會影響程式的維護性。如果放在箭上的話,那箭的攻擊邏輯就必須要知道他要攻擊的對象,比方說如果攻擊對象的話換成是坦克車的話,弓箭造成的損傷就要改變。所以無形中弓箭的類別就會跟其他所有單位的類別形成了相依性,這是不好的因為類別間的相依性越高,一般來講程式碼就越難維護或擴充。曹老師後來是說應該是要放在馬上面,讓馬的類別處理,我想這樣的話馬自己負責自己被攻擊的邏輯,感覺上類別之間的關係比較鬆散 (通常是件好事)。不過我後來想想其實這樣還是沒有解決相依性的問題啊,這樣的話馬本身還不是需要知道它是被什麼攻擊....雖然說我沒有寫過即時戰略遊戲的經驗,但我想我會這麼作吧,會有一個固定的公式 (會將 "可被攻擊的物件" 幾個屬性,比如說防禦力之類的算在裡面) 來算出損傷,這樣的話所有 "會攻擊的物件" 的攻擊方法其實都是一致的,只會因 "可被攻擊的物件" 不同而改變。

還有老師最後還有出一題給大家回家思考,請問以下這兩組東西,如果要你畫出類別關係圖,要怎麼畫?

樹、紙、海報

烏龜,石頭,筆

感覺上有點像腦經急轉彎...海報繼承至紙,紙繼承至樹? 那烏龜,石頭,筆勒?我是還沒深入去想,不過我的認知中物件導向程式設計中,物件其實代表的是行為 (Behaviour) ,所以真正的問題可能是『樹、紙跟海報之間有相同的行為嗎?』。今天太晚就先睡了,明後天再來好好想想看這個問題。

2008年9月14日 星期日

中秋節 - 辛樂客颱風

颱風好像越來越猛了,要不要賞月烤肉已經不是問題了,不過怎麼這麼喜歡禮拜六日來啊,禮拜一二再來有多好了。看新聞說電影院跟卡啦OK 颱風天反而生意更好。其實這種現象很奇怪,颱風天去電影院跟卡啦OK 可以,可是上班上課太危險,其實大家根本不大怕颱風吧,只是想休假而已。

2008年9月10日 星期三

.NET Framework 版本跟 CLR 版本

常看到很多人 (甚至是開發者) 在討論 Framework 版本的時候,對於幾個版本之間的關係還是不大了解。這也不能怪他們因為 MS 在 3.0 的時候把原來的架構破壞了。本來的架構是,一個版本就一個新的 CLR,CLR 可以向下相容 (大致上),也可以共存,開發出來的程式就是針對某個 Framework/CLR 版本,非常明瞭。但到了 Framework 3.0/3.5 之後卻演變成還是使用跟 2.0 同個 CLR 版本,只是在上面新增功能。所以其實這就是為什麼有人說就算你用 2.0,還是可以使用 3.0/3.5 的功能,只要能參考 3.0/3.5 的 DLL 就好了。下圖是 Framework 版本跟 CLR 版本的對照表:

.NET Framework 版本 CLR 版本
1.0 1.0
1.1 1.1
2.0 2.0
3.0 2.0
3.5 2.0

我想 4.0 應該真的會是連 CLR 都一起升級的大改版了吧。

Windows Vista 內建的 3.0,跟原來釋出的 3.0,以及 2.0 跟 3.0/3.5 的 關係在下面這張圖就顯示的很清楚,其中 Green Bits 跟 Red Bits 分別為微軟在開發 3.5 的時候稱 3.5 那塊跟 3.0/2.0 那塊的代號:

fx35 

出處:http://www.danielmoth.com/Blog/2007/06/net-framework-35.html

2008年9月1日 星期一

.NET Framework 原始碼

原來早在去年年底,Microsft 已經將 .NET Framework 一部分的原始碼釋放出來,讓大家在 Debug 的時候更加方便(讓你可以進入 Framework 的程式碼),而且也可以更加了解 Framework 裡面的內部結構。不過目前好像只有這幾個 DLL 有 (已更新到 SP1):

  • Mscorlib.DLL
  • System.DLL
  • System.Data.DLL
  • System.Drawing.DLL
  • System.Web.DLL
  • System.Web.Extensions.DLL
  • System.Windows.Forms.DLL
  • System.XML.DLL
  • WPF (UIAutomation*.dll, System.Windows.DLL, System.Printing.DLL, System.Speech.DLL, WindowsBase.DLL, WindowsFormsIntegration.DLL, Presentation*.dll, 以及一些其他)
  • Microsoft.VisualBasic.DLL
  • *資料來自 http://blogs.msdn.com/sburke/archive/2008/01/16/configuring-visual-studio-to-debug-net-framework-source-code.aspx

    使用方式非常簡單,到 [工具] - [選項] - [偵錯] 設定這兩個選項:

    1. 將 [啟用 Just My Code (僅限 Managed)] 選項停用
    2. 然後將 [啟用來源伺服器支援] 啟用

    image

    這樣就可以了。接下來在程式碼隨便一個地方設中斷點,然後執行程式讓它中斷。在呼叫堆疊的地方選一個想要看原始碼的呼叫,滑鼠按右鍵然後選 [載入符號來源] - [Microsoft 符號伺服器]。等他下載完之後堆疊裡的呼叫就不會是反白,這時在呼叫上按兩下可以就可以看原始碼了,下圖是 System.Windows.Forms.Control 的原始碼:

    image