自訂指令

在進行上一節最後的幾個小練習的時候,想必有很多狀況需要讓進行左轉的動作對吧!大家雖然學會了使用for-in迴圈,以連續右轉三次的方式完成左轉,但for-in迴圈雖然方便,總歸是三行程式碼,要是有一行指令可以讓我直接左轉,豈不是省事多了!

就像自訂型態一樣,當我們覺得電腦給予的指令太少,而有特殊的需求想新增指令的時候,也是辦的到的!

func 說嗨() {
    print("hi")
}

說嗨()

我們先使用func指令告訴電腦,我們想要新增一個指令,並且將這個指令執行的程式碼放在{}包裹的區域,此後電腦就認得我們剛剛命名的新指令了!我們在之後執行這個指令,電腦就會去查找並執行{}包裹的程式碼。

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

撰寫了這樣的指令之後,我們就可以用叫我左轉()來代替三行的for-in迴圈程式碼,當整個程式有很多時機需要左轉時,這個設計可以省下大量的程式碼,而且讓我們的程式更容易閱讀。

接著聰明的你很興奮的幫增加了各種功能...

func 叫我前進兩步() {
    for _ in 1...2 {.前進()
    }
}

func 叫我前進三步() {
    for _ in 1...3 {.前進()
    }
}

func 叫我前進四步() {
    for _ in 1...4 {.前進()
    }
}

...

等等,這實在是有點蠢對吧?就不能有個功能讓使用一個變數來設定要前進幾步嗎?

var 步數:Int = 0

func 叫我前進幾步() {
    for _ in 1...步數 {.前進()
    }
}

步數 = 5
叫我前進幾步()

非常聰明的設計!如果你自己想到了這樣的方式,恭喜你,擁有這種舉一反三的能力,學習程式設計絕對是如虎添翼的。然而,你或許想到了我們的程式目前有幾個非常明顯的缺陷?考慮這樣的程式碼:

var= me(面向: 方向.北方, 座標:原點)
var 我的分身 = me(面向: 方向.北方, 座標:原點)

我的分身是兩個不同的me物件,他們的屬性互不相干,也可以分開行動,但是問題來了,叫我左轉()叫我前進幾步()都是對的操作(如果你想要叫我的分身左轉,在迴圈裡面應該是執行我的分身.右轉()三次才對。)難道我們要幫我的分身也寫幾乎一模一樣的func?那步數要讓我的分身共用嗎?程式越變越複雜之後會不會有問題?

大家可以好好思考這些設計有可能造成那些問題,在下一週的課程,我們會介紹新的設計方式來解決它們。

results matching ""

    No results matching ""