程式架構
本週的教學影片檔:請點我
本週的初始程式碼:請點我
在前兩週的課程,我們學會了許多基本的資料型態和控制指令的方式,也成功的幫me
物件我
新增了左轉和一次前進很多步的指令,現在大家手上的程式碼應該長的像上面的連結這樣,如果你手邊沒有程式碼,現在也請先把它打開。
上一週的最後,身為設計者的我們想到了一個問題:當初設計me
物件並且新增了一個我
的時候,我們的目的只是做一些指令測試,但未來真的要寫出有明確目的的程式時,我們可能需要很多個me
物件(例如我們的世界裡可能有很多NPC:機器人、怪物、旅店老闆...),目前的命名方式顯然十分容易讓人誤會。
在本章一開始,我們先調整一下設計,讓程式碼更容易被看懂。
// 刪除 struct me { struct 角色 { var 面向:方向 var 座標:點 } var 一號機器人 = 角色(面向: 方向.北方, 座標:原點) var 二號機器人 = 角色(面向: 方向.北方, 座標:原點)
在我們這麼做的同時,叫我左轉()
和叫我前進幾步()
指令也失效了,因為它們相應的程式碼是尋找我
物件,並且執行它的前進()
和右轉()
指令,在這個物件的名稱消失了(現在的全新角色
物件有兩個,分別叫做一號機器人
與二號機器人
),電腦就無法找到這個角色來執行指令了。
這不禁讓我們開始思考:為什麼要新增自訂指令?其出發點是讓程式碼更容易閱讀、操作更方便,在只有一個角色
物件的時候,我們原先的寫法是沒有問題的,但有很多個不同的角色
物件時,如果我們必須為了讓一號機器人
蛇行,就寫一個自訂指令,要讓二號機器人
來回巡邏,又寫一個自訂指令,以後還有三號、四號、五號機器人...這顯然違反了「操作更方便」這個需求。
為什麼幫一號機器人
新增左轉指令的時候,二號機器人
不知道這個指令?為什麼我們不能像我.右轉()
一樣去寫我.左轉()
,而必須寫成叫我左轉()
?其實是我們的架構設計出了問題,前兩週的課程我們比較專注在理解程式設計的「程式」兩字,而本週的課程重點,將會把重心轉移到「設計」,介紹正確的架構觀念。