练习 45. 你来做一个游戏

你要开始学会自食其力了。通过阅读这本书,你应该已经知道,你需要的所有的信息网上都有,你只要去搜索就能找到。唯一困扰你的就是如何使用正确的词汇进行搜索。学到现在,你在挑选搜索关键字方面应该已经有些感觉了。现在是时候尝试写一个大项目,并让它运行起来。

要求如下:

  • 创建一个不同于我之前那个的游戏。

  • 使用多个文件,并使用 import 来调用它们。确保你知道 import 的用法。

  • 每个房间使用一个类,并给出符合其用途的类名(比如 GoldRoom、KoiPondRoom)。

  • 你的执行器需要了解这些房间,所以创建一个运行并了解它们的类。有很多方法可以做到这一点,但是你要考虑如何让每个房间返回到下一个房间,或者设置一个下一个房间是什么的变量。

除此之外,就交给你了。花一周时间来做这件事,让它成为你所能做的最好的游戏。使用类、函数、字典、列表,任何你可以使它变得更好的东西。本课的目的是教你如何在其他文件中构造需要其他类的类。

记住,我不会告诉你具体怎么做,因为你必须自己做、去弄清楚。编程就是解决问题的过程,这个过程意味着你要不断尝试、试验、失败、放弃你之前所做的,然后再试一次。当你遇到困难时,可以向别人寻求帮助,并给他们看你的代码。如果他们对你很刻薄,就别理他们,把注意力放在那些不刻薄并且愿意帮你的人身上。持续修改和简化你的代码,直到它完整可执行为止,然后再研究一下还有没有可以被改进的地方。

祝你好运,一周后再见。

评估你的游戏

在这个练习中你会评估你所完成的游戏。也许你只完成了一半,卡在哪里没有进行下去,也许你勉强做出来了。不管怎样,我们会串一下你应该弄明白的一些东西,并确认你的游戏里有使用到这些内容。我们还会学习如何用正确的格式构建类以及使用类的一些通用习惯,另外还有很多的“书本知识”让你学习。

为什么我会让你先行尝试,然后才告诉你正确的做法呢?因为从现在开始你要学会“自给自足”,以前我一直牵着你往前走,以后就得靠你自己了。后面的习题我只会告诉你你的任务,你需要自己去完成,在你完成后我再告诉你如何改进你的作业。

一开始你可能会觉得很困难并且很不习惯,但是只要你坚持下去,就会培养出自己解决问题的能力。你还会找出创新的方法来解决问题,这比从课本中复制粘贴强多了。

函数的风格

以前我教过的如何写好函数的方法同样适用,不过这里要再添加几条:

  • 由于各种各样的原因,程序员将类里边的函数称作方法(method)。很大程度上这只是个宣传策略。不过每次你把它们称作“函数”,就会有啰嗦的人跳出来纠正你应该叫“方法”。你要是觉得他们太烦了,可以让他们从数学角度演示一下“函数”和“方法”究竟有什么不同,这样他们很快就会闭嘴。

  • 在你使用类的过程中,很大一部分时间是告诉你的类如何“做事情”。给这些函数命名的时候,与其用函数的功能来命名函数,不如把它当作是给类的命令来命名。就像列表的 pop 函数一样,它相当于说:“嘿,列表,把这东西给我 pop 出去。”它的名字不是 remove_from_end_of_list ,即使它的功能的确是这样,这一串字符也不是针对一个列表的命令。

  • 让你的函数保持小而简洁。不知道为什么,有些人开始学习类之后 就会忘了这一点。

类的风格

• 你的类应该使用 “驼峰式大小写”(camel case),比如你应该用 SuperGoldFactory 而不是 super_gold_factory

• 你的 init 函数不应该做太多的事情,这会让类变得难以使用。

• 你的其它函数应该使用 “下划线隔词”(underscore format),所以你可以写 my_awesome_hair,而不是 myawesomehair 或者 MyAwesomeHair

• 用一致的方式组织函数的参数。如果你的类需要处理 users、dogs 和 cats,就保持这个次序(特别情况除外)。如果一个函数的参数是(dog, cat, user),另一个的是(user, cat, dog),这会让函数使用起来很困难。

• 尽量不要使用来自模块或者全局的变量,它们应该是相互独立的。

• 愚蠢地保持一致性是思维狭隘的表现。一致性是好事,但是无脑地遵循一些白痴口号是一种很不好的作为。你应该好好为自己着想。

• 永远永远都要使用 类名(object) 的方式定义类,否则你会碰到大麻烦。

代码的风格

• 为了以方便他人阅读,为自己的代码字符之间留一些空行。你会看到一些很差的程序员,他们写的代码还算通顺,但字符之间没有任何空行。这种风格在任何编程语言中都是坏习惯,因为人的眼睛和大脑会通过空白和垂直对齐的位置来扫描和区分视觉元素,如果你的代码里没有任何空白,这相当于为你的代码刷了一层伪装涂料。

• 如果一段代码你无法朗读出来,那么这段代码的可读性可能就有问题。如果你无法让一段代码简单易用,试着大声朗读出来。这样不仅会强迫你放慢速度,真正去仔细阅读,还会帮你找到难读的段落,从而知道哪些代码的易读性需要作出改进。

• 学着模仿别人的风格写 Python 程序,直到有一天你也能找到自己的风格。

• 一旦你有了自己的风格,也别把它太当回事。程序员工作的一部分就是和别人的代码打交道,有的人审美就是很差。相信我,你的审美某一方面一定也很差,只是你从未意识到而已。

• 如果你发现有人写的代码风格你很喜欢,那就模仿他们的风格。

好的注释

• 程序员可能会告诉你,你的代码需要有足够的可读性,所以不用写注释。他们会以自己接近官腔的声音说“所以你永远都不应该写注释或文档。证明完毕(QED)”。这些程序员要么是做顾问的,如果别人无法使用他们的代码,就会付更多钱给他们让他们解决问题。要么他们能力不足,从来没有跟别人合作过。别理会这些人,好好写你的注解。

• 当你写注解的时候,要描述清楚为什么要这样做以及你在做什么。代码只会告诉你“这样实现”,但是“为什么要这样实现”更为重要。

• 当你为函数写文档注解的时候,记得为别的代码使用者也写些东西。你不需要狂写一大堆,但一两句话说明一下这个函数的用法还是很有用的。

• 虽然注释是好东西,但是太多的注释就不见得是了。而且注释也是需要维护的,所以你要尽量让注释简短切题,如果你对代码做了更改,记得检查并更新相关的注释,确保它们还是正确的。

评估你的游戏

现在我要你假装成是我,板起脸来,把你的代码打印出来,然后拿一支红笔,把代码中所有的错误都标出来,包括你从这个练习中或者从目前为止你读到的其他指南中发现的。等你批改完了,我要求你把所有的错误改正过来。这个过程你要多重复几次,争取找到更多可以改进的地方。使用我前面教过的方法,把代码分解成最小的单元,一一进行分析。

这个练习的目的就是训练你对于细节的关注。等你检查完自己的代码,再找一段别人的代码用这种方法检查一遍。把一部分代码打印出来,检查出所有关于代码和风格方面的错误,然后试着在不改坏别人代码的前提下把它们修改正确。

这周我要求你的事情就是批改和纠错,包含你自己的代码和别人的代码。这个练习难度很大,不过一旦你完成了任务,你学过的东西就会牢牢记在脑中。