今年八月出社會將滿四年,一直都是寫程式為業的我來說,不該是程式寫完、寫好就足夠,該是思索並追求重構,具備擴充性、可測試性,以及設計模式運用等等的時候了。
出社會後的第一份工作,就是寫C#,且因為在校時使用VB的關係,上班第一二個禮拜都在看C#書籍中渡過;說到這,根本就被Bill叔說中,當時看的書就是那種教你怎麼用VS介面拉出Button,寫事件等等快速開發,但卻沒講到背後的真正操作意義。而上這堂課完全就是被課程簡介吸引過去的:
不要再迷信「設計模式」的課程,應該先從基礎的「物件導向」學起,融會貫通以後你會發現,設計模式不再困難!因為觀念通了,一切就通了。
想想前幾個月買的「大話設計模式」才翻到第三章就沒在動了,於是乎,決定要報名SkillTree的物件導向實作課程第四梯的課程了。
Bill叔講得很熱血,也講得淺顯易懂,配合實例的介紹,印象頗為深刻。上個月「TDD課程」的課後劃心智圖筆記後,整個上癮了,決定這次在課堂上同步劃心智圖的目標,但徹底宣告失敗,在思考觀念後要動鍵盤時,講師已經往下個議題了,下禮拜還是備紙跟筆,以防萬一。
課程一開始從物件導向的三大特性:繼承、封裝、多型講起,此時提到「設計模式」是組合運用這三大特性,我心想我來對地方了。當然你要組合運用前,勢必得從最基礎知識建立起,接著介紹型別及變數的單元,之後是包含超多東西的類別Class的介紹。
下課後一個晚上整理了一下,不免俗地來一下心智圖吧,心智圖如下。

Bill叔在課堂中,用白板筆畫圖解釋,就是Call by value及Call by reference單元。一個是傳值,意思就是複製一份變數給該方法;另一個是傳址,表示只是傳給該方法的是變數的指標(變數所在地址)。簡單分別就是在該方法中若有任何對該變數任何更動情況下;Call by value是不會有任何影響的,因為已經是複製一個新的變數給該方法,任何更動與原本的變數無關。反則Call by Reference來說,會更動到原本變數的值。所以Bill叔一直在強調不要管「實質型別」或「參考型別」,而是變數本身。參考一下MSDN的範例就知道了,實質型別傳遞,參考型別傳遞。Bill叔建議不懂或無法理解的就用紙筆,劃出圖出來,我怕我在紙上劃的,會傷到大家的眼睛,因此使用Visio重新劃了一下。實質型別傳遞如下:

參考型別傳遞如下:

再來寫一下範例程式會更有感覺,我稍稍更動了一下Bill叔的範例,如下:
1: public class TestClass
2: {
3: public int x = 0;
4: }
5: static void Main(string[] args)
6: {
7: TestClass y = new TestClass();
8: y.x = 1;
9: TestClass r1 = ChangeByVal(y);
10: Console.WriteLine("y原本的值 : " + y.x + "; y更動後的值: " + r1.x );
11: TestClass r2 = ChangeByRef(ref y);
12: Console.WriteLine("y原本的值 : " + y.x + "; y更動後的值: " + r1.x);
13: Console.ReadLine();
14: }
15:
16: private static TestClass ChangeByVal(TestClass y)
17: {
18: y = new TestClass();
19: y.x = 2;
20: return y;
21: }
22:
23: private static TestClass ChangeByRef(ref TestClass y)
24: {
25: y = new TestClass();
26: y.x = 2;
27: return y;
28: }
執行後的結果:

就是使用Call by reference(第二種),連原本的值也會被更動到,因為指向同一個物件。
這堂課,對我印象深刻的是,委派部分,說真的因為之前工作的關係,會用到多執行緒的部份,然而常常有一些結果需要回饋到UI介面上,若直接在多執行緒的程式中直接更動UI時一定會報Error出來的。於是你會查網路,都會查到使用委派的方式解決,所以網路上的解釋就是因為更動UI不是該執行緒的工作,而是主執行緒的工作,因此需要委託主執行緒來執行。Bill叔的簡單解釋,委派就是方法外部實作,聽到這,讓我想到Interface,它不是也在Interface Class中只是宣告方法的殼,繼承的Class去實作它,不是也跟委派一樣是方法外部實作。因此查了一下發現網路是很多文章討論這兩個的差異,連MSDN上也可找到,參考:Interfaces Vs Delegates,When to use delegates instead of interfaces,再來找時間好好研究Bill叔的委派一系列文章。講到這,大致是可以了解其中的分別,或許實作時會更有感覺吧,先寫到這吧,寫了好久,若有甚麼新的資訊或實作範例再更新上來。
註:Evernote筆記上有附件,若要觀看請下載xmind。