全新的程式架構

現在我們一切就緒,雖然本週的課程牽涉到的大多是抽象上的概念,學習起來可能比較痛苦,但此刻就是把範例程式碼重寫成物件導向風格的最佳時機!不要害怕遇到錯誤,從做中學是成為程式設計高手最有效率的方法。

我們的目標是將整個範例程式碼的struct 角色改寫成class 角色,並且新增第一週的最後,我們想要完成的功能左轉前進指定步數,並且將前進指定步數的數值,放在()內傳達給該指令,下面會逐步的說明如何達成這個目標,希望聰明的你可以只參照第一步(因為第一步還會教一個新的語法),之後就自己動手做,真的遇到無法解決的錯誤,才往下看問題出在哪裡。

第一步我們將struct移植成class,並且把所有func前方的mutating刪除,mutating是一個struct專用的語法,告訴電腦當前的func將會涉及到自身某個或某些屬性的修改,不使用mutating是無法改變任何自身屬性的(即使宣告為var也一樣)。我們的前進()會修改自身的座標屬性,右轉()則會修改面向屬性,最後的printMove()則只是用來列印出移動的訊息,沒有涉及任何屬性的修改,因此才沒有加上mutating

class 角色 {
    var 面向:方向
    var 座標:init (面向: 方向, 座標:) {
        self.面向 = 面向
        self.座標 = 座標
    }

    func ...
    func ...
}

接著,會有許多種不同的做法,你可以新增一個繼承角色class 機器人,並且把前進、右轉和列印移動訊息的指令都遷移過去,並且新增左轉、前進數步的指令。

class 機器人: 角色 {
    func 右轉()...
    func 前進()...

    func 左轉() {
        for _ in 1...3 {
            self.右轉()
        }
    }

    func 前進數步(步數: Int) {
        for _ in 1...步數 {
            self.前進()
        }
    }
}

也可以保留原先的角色架構,新增一個繼承角色class 聰明的角色,並且把左轉、前進數步的指令寫在這個新class中。

class 聰明的角色: 角色 {
    func 左轉()...
    func 前進數步(步數: Int)...
}

也可以直接把左轉、前進數步的功能直接寫在原本的class 角色裡面。這三種寫法造成了細微的程式架構差異,在本專案裡面,它們的差別並不是很大,但在複雜的專案裡面,往往在開始時就要決定好那些物件要設計那些指令,那些物件又怎麼繼承那些物件,才會事半功倍。

想想看,為什麼要維持著struct的型態,不改寫成class

results matching ""

    No results matching ""