[心得整理] c# 物件導向程式 - 1.為何要用物件導向寫程式

[心得整理] 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

如果內容有誤請多鞭策謝謝