這節練習的目的是檢查評估你的遊戲。也許你只完成了一半,卡在那裡沒有進行下去,也許你勉強做出來了。不管怎樣,我們將串一下你應該弄懂的一些東西,並確認你的遊戲裡有使用到它們。我們將學習如何用正確的格式構建class,使用class 的一些通用習慣,另外還有很多的「書本知識」讓你學習。
為什麼我會讓你先行嘗試,然後才告訴你正確的做法呢?因為從現在開始你要學會「自給自足」,以前是我牽著你前行,以後就得靠你自己了。後面的習題我只會告訴你你的任務,你需要自己去完成,在你完成後我再告訴你如何可以改進你的作業。
一開始你會覺得很困難並且很不習慣,但只要堅持下去,你就會培養出自己解決問題的能力。你還會找出創新的方法解決問題,這比從課本中拷貝解決方案強多了。
## 函式的風格
以前我教過的怎樣寫好函式的方法一樣是適用的,不過這裡要添加幾條:
* 由於各種各樣的原因,程序員將 class (類)裡邊的函式稱作method(方法)。很大程度上這只是個市場策略(用來推銷OOP),不過如果你把它們稱作「函式」的話,是會有囉嗦的人跳出來糾正你的。如果你覺得他們太煩了,你可以告訴他們從數學方面示範一下「函式」和「方法」究竟有什麼不同,這樣他們會很快閉嘴的。
* 在你使用class的過程中,很大一部分時間是告訴你的 class如何「做事情」。給這些函式命名的時候,與其命名成一個名詞,不如命名為一個動詞,作為給class的一個命令。就和陣列中 的 `pop` 函式一樣,它相當於說:「嘿,陣列,把這東西給我 `pop`出去。」它的名字不是 `remove_from_end_of_list`,因為即使它的功能的確是這樣,這一個字串也不是一個命令。
* 讓你的函式保持簡單小巧。由於某些原因,有些人開始學習 class 後就會忘了這一條。
## Classh (類) 的風格
* 你的 class 應該使用「camel case(駝峰式大小寫)」,例如你應該使用`SuperGoldFactory` 而不是 `super_gold_factory`
* 你的 `initialize` 不應該做太多的事情,這會讓 class 變得難以使用。
* 你的其它函式應該使用「underscore format(下劃線隔詞)」,所以你可以寫`my_awesome_hair`,而不是 `myawesomehair` 或者 `MyAwesomeHair`。
* 用一致的方式組織函式的參數。如果你的 class 需要處理 users、dogs、和cats,就保持這個次序(特別情況除外)。如果一個函式的參數是(dog, cat, user),另一個的是(user, cat, dog) ,這會讓函式使用起來很困難。
* 不要對全局變數或者來自模組的變數進行重定義或者賦值,讓這些東西自顧自就行了。
* 不要一根筋式地維持風格一致性,這是思維力底下的妖怪嘍囉做的事情。一致性是好事情,不過愚蠢地跟著別人遵從一些白痴口號是錯誤的行為——這本身就是一種壞的風格。好好為自己著想吧。
## 程式碼風格
* 為了以方便他人閱讀,在自己的程式碼之間留下一些空白。你將會看到一些很差的程式設計師,他們寫的程式碼還算通順,但程式碼之間沒有任何空間。這種風格在任何程式語言中都是壞習慣,人的眼睛和大腦會通過空白和垂直對齊的位置來掃描和區隔視覺元素,如果你的程式碼裡沒有任何空白,這相當於為你的程式碼上了迷彩裝。
* 如果一段程式碼你無法朗讀出來,那麼這段程式碼的可讀性可能就有問題。如你找不到讓某個東西易用的方法,試著也朗讀出來。這樣不僅會逼迫你慢速而且真正仔細閱讀過去,還會幫你找到難讀的段落,從而知道那些程式碼的易讀性需要作出改進。
* 學著模仿別人的風格寫程式,直到哪天你找到你自己的風格為止。
* 一旦你有了自己的風格,也別把它太當回事。程式設計師工作的一部分就是和別人的程式碼打交道,有的人審美觀就是很差。相信我,你的審美觀某一方面一定也很差,只是你從未意識到而已。
* 如果你發現有人寫的程式碼風格你很喜歡,那就模仿他們的風格。
## 好的註釋
* 有程序員會告訴你,說你的程式碼需要有足夠的可讀性,這樣你就無需寫註釋了。他們會以自己接近官腔的聲音說「所以你永遠都不應該寫程式碼註釋。」這些人要嘛是一些顧問型的人物,如果別人無法使用他們的程式碼,就會付更多錢給他們讓他們解決問題。要嘛他們能力不足,從來沒有跟別人合作過。別理會這些人,好好寫你的註解。
* 寫註解的時候,描述清楚為什麼你要這樣做。程式碼只會告訴你「這樣實現」,而不會告訴你「為什麼要這樣實現」,而後者比前者更重要。
* 當你為函式寫文件註解的時候,記得為別的程式碼使用者也寫些東西。你不需要狂寫一大堆,但一兩句話謝謝這個函式的用法還是很有用的。
* 最後要說的是,雖然註解是好東西,太多的註解就不見得是了。而且註解也是需要維護的,你要盡量讓註解短小精悍一語中的,如果你對程式碼做了更改,記得檢查並更新相關的註解,確認它們還是正確的。
## 評估你的遊戲
現在我要求你假裝成是我,板起臉來,把你的程式碼打印出來,然後拿一支紅筆,把程式碼中所有的錯誤都標出來。你要充分利用你在本章以及前面學到的知識。等你批改完了,我要求你把所有的錯誤改對。這個過程我需要你多重複幾次,爭取找到更多的可以改進的地方。使用我前面教過的方法,把程式碼分解成最細小的單元一一進行分析。
這節練習的目的是訓練你對於細節的關注程度。等你檢查完自己的程式碼,再找一段別人的程式碼用這種方法檢查一遍。把程式碼打印出來,檢查出所有程式碼和風格方面的錯誤,然後試著在不改壞別人程式碼的前提下把它們修改正確。
這週我要求你的事情就是批改和糾錯,包含你自己的程式碼和別人的程式碼,再沒有別的了。這節習題難度還是挺大,不過一旦你完成了任務,你學過的東西就會牢牢記在腦中。
- 笨方法更简单
- 习题 0: 准备工作
- 习题 1: 第一个程式
- 习题 2: 注释和井号
- 习题 3: 数字和数学计算
- 习题 4: 变数(variable)和命名
- 习题 5: 更多的变数和印出
- 习题 6: 字串(string)和文字
- 习题 7: 更多印出
- 习题 8: 印出,印出
- 习题 9: 印出,印出,印出
- 习题 10: 那是什么?
- 习题 11: 提问
- 习题 12: 模组 (Module)
- 习题 13: 参数、解包、参数
- 习题 14: 提示和传递
- 习题 15: 读取档案
- 习题 16: 读写档案
- 习题 17: 更多的档案操作
- 习题 18: 命名、变数、程式码、函式
- 习题 19: 函式和变数
- 习题 20: 函式和档案
- 习题 21: 函式可以传回东西
- 习题 22: 到现在你学到了哪些东西?
- 习题 23: 阅读一些程式码
- 习题 24: 更多练习
- 习题 25: 更多更多的练习
- 习题 26: 恭喜你,现在来考试了!
- 习题 27: 记住逻辑关系
- 习题 28: 布林(Boolean)表示式练习
- 习题 29: 如果(if)
- 习题 30: Else 和 If
- 习题 31: 做出决定
- 习题 32: 回圈和阵列
- 习题 33: While 回圈
- 习题 34: 存取阵列里的元素
- 习题 35: 分支 (Branches) 和函式 (Functions)
- 习题 36: 设计和测试
- 习题 37: 复习各种符号
- 习题 38: 阅读程式码
- 习题 39: 阵列的操作
- 习题 40: Hash, 可爱的 Hash
- 习题 41: 来自 Percal 25 号行星的哥顿人(Gothons)
- 习题 42: 物以类聚
- 习题 43: 你来制作一个游戏
- 习题 44: 评估你的游戏
- 习题 45: 物件、类和从属关系
- 习题 46: 一个专案骨架
- 习题 47: 自动化测试
- 习题 48: 更进阶的使用者输入
- 习题 49: 创造句子
- 习题 50: 你的第一个网站
- 习题 51: 从浏览器中取得输入
- 习题 52: 创造你的网页游戏
- 下一步
- 一个老程式设计师的建议