[心得整理] c# 物件導向程式 - 1.為何要用物件導向寫程式
前言
物件導向這題材,一向是熱門的題目,這次也想用我的理解,來跟大家聊聊我所認知的物件導向
PS.尤其在上過Bill叔的c#物件導向課程之後更是有興趣研究 課程連結
先說故事
1968年秋季一群天才在討論為何那時的程式會跟不上時代的變化,所開始提出軟體工程這概念,其中就包含物件導向技術
駭客任務 - The Matrix
還記得駭客任務那世界觀嗎,人類大腦被電腦所控制用電腦軟體,模擬人類文明的一切
那位白鬍老爺爺應該就是上物件導向技術來開發,才能寫出如此複雜的軟體去模擬人類文明
因為物件導向就是能模擬現實世界的技術 (我覺得就是加入抽象概念)
幸福螺絲起子專案範例
功能 可以有十字頭也可以有一字頭依照情境來選擇
先用平常的寫法 應該會像是這樣 用 swith case 輕鬆完成
private static void 不是OOP幸福螺絲起子(string 大小形狀)
{
string 工具頭 = string.Empty;
switch (大小形狀)
{
case "大十字":
工具頭 = "大十字";
break;
case "大一字":
工具頭 = "大一字";
break;
default:
throw new SystemException(@"沒有此規格");
}
Console.WriteLine("工具頭是" + 工具頭);
Console.WriteLine("幸福螺絲起子啟動 完畢 ");
Console.ReadLine();
}
那用物件導向來寫會樣這樣
private static void OOP幸福螺絲起子(string 大小形狀)
{
幸福螺絲起子換頭介面 工具頭 = 工具頭袋子.取出工具頭(大小形狀);
Console.WriteLine("工具頭是" + 工具頭.組合工具頭());
Console.WriteLine("幸福螺絲起子啟動 完畢 ");
Console.ReadLine();
}
兩相比較之下,會覺得物件導向的程式碼會像是人在說話,對吧 (這說法是看91文章 連結)
用現實世界的螺絲起子來看
大家應該都想做出可換頭的左邊螺絲起子,但是常常因為時程壓力做出焊死的右邊螺絲起子( swith case 就像是那圓圓的主體)
需求變動
客戶說要加上一個小一字頭時(或是梅花頭,5角頭)該如何呢?
swith case 就要在多一個case 也就是要改程式 ,現實世界的螺絲起子就是改那圓圓的主體
已經可以想到當有很多頭要替換的時候 swith case 會長的非常大,真實的螺絲起子應該會大到一手無法拿吧
物件導向版的程式 是不需要改程式的 只需要新增程式就好
說明物件導向版程式碼
先看一下目前檔案結構
程式碼如下
先建立一個介面
public interface 幸福螺絲起子換頭介面
{
string 工具頭 { get; set; }
string 組合工具頭();
}
產生大一字頭
public class 大一字 : 幸福螺絲起子換頭介面
{
public string 工具頭 { get; set; }
public 大一字()
{
工具頭 = "大一字";
}
public string 組合工具頭()
{
return 工具頭;
}
}
產生工具頭袋子
public static class 工具頭袋子
{
private static readonly List<幸福螺絲起子換頭介面> _工具頭列表;
static 工具頭袋子()
{
_工具頭列表 = new List<幸福螺絲起子換頭介面>();
_工具頭列表.Add(new 大十字());
_工具頭列表.Add(new 大一字());
}
public static 幸福螺絲起子換頭介面 取出工具頭(string 大小形狀)
{
return _工具頭列表.First(x => x.工具頭.Equals(大小形狀) );
}
}
因為大十字跟大一字只有差別在文字就請自行腦補
需求修改 要如何加一個小一字呢
先新增一個 小一字.cs程式碼如下
public class 小一字 : 幸福螺絲起子換頭介面
{
public string 工具頭 { get; set; }
public 小一字()
{
工具頭 = "小一字";
}
public string 組合工具頭()
{
return 工具頭;
}
}
然後在 工具頭袋子的建構子加上
_工具頭列表.Add(new 小一字());
這樣就完成了
會看到主流程的
幸福螺絲起子換頭介面 工具頭 = 工具頭袋子.取出工具頭(大小形狀);
都不用改程式就完成需求異動,
對照現實世界的情況,也就是多做一個小一字頭
然後放到工具袋裡,是不是跟物件導向程式碼的是一致的
然後增加在多的工具頭也是增加 螺絲起子配件專案內的程式
就是現實世界工具袋可替換的工具頭變多一樣
結語
這樣比較下來 應該會覺得物件導向程式的神奇之處(也有麻煩之處,程式碼變多了)
你也想要開始 寫物件導向程式了嗎
接下來會想要介紹
物件導向三大特性 與 SOLID原則
不過今天就先聊到這囉 Bye
程式碼一樣放到github
https://github.com/initialsam/OOP_Screwdriver
如果內容有誤請多鞭策謝謝