2017年4月8日 星期六

設計模式學習紀錄 - 複用、擴展性、易維護


目前正在攻讀程杰老師的大話設計模式  ,實在非常推薦假日閒暇之餘研讀(若覺得自己寫的程式又臭又長又難維護,這本書真心推薦必買阿...便宜又大碗 ),並依照書本範例所了解的內容做些筆記紀錄 ,若有觀念錯誤的地方也麻煩各位前輩指點,小弟感激不盡!



舉例情境 :  老闆要求使用VB.NET設計一個簡單的WinForm計算機程式

以我過去大學中所應付作業的方式,我會選擇使用IF...ELSE Statement以及所有的操作介面邏輯以及運算邏輯全部寫在同一個Class內,這部分沒有問題,程式也能正常運作,但是工作後我才了解到程式沒有寫完的一天(就算寫完了也要進行維護,就算維護性尚可但也難保老闆會追加新功能,若追加新功能時能夠確保不影響到程式正常運作嗎?)
如果我照著我以前傳統式的方式寫程式我會有加不完的班、修不完的Bug、以及睡不了的覺......。

看書之後以目前腦袋所能理解的範圍歸納出,在設計時需要考慮到
  • 擴展性是否良好?  (若老闆要求加上其他功能,舉例: 開根號的計算 、則因只需要增加某些功能而必須將整個類別重新編譯一次)
  • 是否容易維護 ?  (若系統功能越多、越複雜、則系統就會變得不易維護)
  • 是否能複用(重複使用)? (若老闆需要你設計WebForm的計算機程式、程式是否又要重寫一次)
若依我以前的做法全部寫在同一個Class內,擴展性差、不易維護、無法複用
那要如何達到易維護、擴展性佳且能夠複用呢?

  • 複用:  將業務邏輯以及介面邏輯明確的切開,並提取業務邏輯成為一個獨立類別(當WinForm移植到WebForm上,只需要將介面邏輯重新設計,提取出的業務邏輯也能夠直接套用在WebForm上 (屬於同一個.NET Framework下) 這樣就達到了複用的效果了 )。
  • 易維護、擴展性佳 : 目前已將業務邏輯切開成為一個獨立類別,所有的演算邏輯皆使用該類別的某一個方法,但若是需要增加新的功能,勢必需要將新的演算邏輯加入類別方法內、再加入新的演算邏輯時,無法保證修改時不影響到其他功能(緊耦合)、所以需要將這個獨立類別再進行細分(鬆耦合)若往後有新增加的功能時只要針對該演算邏輯設計,不會影響到其他已設計好的演算邏輯,進而達到容易擴展以及方便維護的功能)。
簡易計算機程式UML類別圖:















設計前先思考有哪一些共用的方法或是屬性,並將他們提取(分離)出來
以簡單的四則運算例子來說
每種運算都有包含兩種屬性,例如
加法 : 加數被加數
減法 : 減數被減數
乘法 : 乘數被乘數
以此類推,會發現可以用兩個變數儲存,再利用物件導向的繼承特性
子類別能夠存取父類別的非Private(Public、Protected修飾子)屬性方法
好處在於可以重複使用(reuse)父類別內的屬性而不必在每一個子類別重新宣告,
但每一種四則運算子類別的演算方法的實作方式都是不同的(加法、減法、乘法、除法),也因為繼承的關係,能夠存取父類別內的方法,但要如何在每個類別內使用同一個運算方法名稱但內部實作的方式不同呢?,此時就能將父類別的方法加上Overridable修飾子 ,當子類別繼承時,就能夠將父類別內的方法進行改寫,實作自身類別的運算方法。


下列為按照書本內教學,並且自身練習時的Code

簡易四則運算父類別

Public Class Operation
    '''     
    ''' 簡易四則運算父類別
    '''     
    ''' 
    ''' 
    Public Class Operation
        
        Public NumberA As Double = 0
        Public NumberB As Double = 0

        ''' 
        ''' 在衍生類別內改寫此方法
        ''' 
        ''' 
        ''' 
        Public Overridable Function GetResult() As Double

        End Function

    End Class


簡易四則運算子類別


    ''' 
    ''' 加法子類別(繼承四則運算父類別)
    ''' 
    ''' 
    Class OperationAdd
        Inherits Operation

        ''' 
        ''' 改寫GetResult方法
        ''' 
        ''' 
        ''' 
        Public Overrides Function GetResult() As Double
            Return NumberA + NumberB
        End Function


    End Class

    ''' 
    ''' 減法子類別(繼承四則運算父類別)
    ''' 
    ''' 
    Class OperationSub
        Inherits Operation

        ''' 
        ''' 改寫GetResult方法
        ''' 
        ''' 
        ''' 
        Public Overrides Function GetResult() As Double
            Return NumberA - NumberB
        End Function
    End Class

    ''' 
    ''' 乘法子類別(繼承四則運算父類別)
    ''' 
    ''' 
    Class OperationMul
        Inherits Operation

        Public Overrides Function GetResult() As Double
            Return NumberA * NumberB

        End Function
    End Class

    ''' 
    ''' 除法子類別(繼承四則運算父類別)
    ''' 
    ''' 
    Class OperationDiv
        Inherits Operation

        Public Overrides Function GetResult() As Double
            Return NumberA / NumberB
        End Function
    End Class






















沒有留言: