斯坦福大学给了一个Karel的类,以此为基础进行编程教学。记录一些笔记。
第1课:课程介绍 (2012.1.22)
比以前学校的老师讲课风趣不少,要学习和被学习真的很不一样。
程序很多人会写,但是要成为大师就不一样。就像作文大家都会写,但是写作成为大师就很难。
第2课:欢迎来到Karel的世界(2012.1.22)
编程要注重可读性,程序不仅仅是写给机器看的,也是写给人看的,这是优秀程序员的首要条件。
程序应该具有的通用性,不是针对单一情况处理,在处理复杂情况中的方法的复用性。这取决于我们如何分解功能和结合功能,例如Java中,定义一个方法实现怎样的功能。
第3课:Karel与Java(2012.1.22)
错误处理:要确保循环的退出,避免无限循环的情况,尤其效率我们第一次和计划最后退出循环那一次body的运行,即对于循环需要确定第一步和最后一步循环是否已经完成我们所需的动作,例如是否在退出循环后仍需要再执行一次动作,或在进行循环之前先将动作执行一次,以免off by one bug。以及这个最后一步是否能有效的确保在条件判断中退出循环,是否各种情况都考虑到。
注释(comment):要养成良好的编程习惯,在文件和方法之前加入注释,方便阅读。给出方法的前置条件和后置条件,也就是前提和结果。以Karel举个例子,Karel将Beeper从一点移到另外一点,并且返回。返回后需要将karel回复到原来状态,例如原来面向哪个方向就是哪个方向。如果只是做完搬运的动作,如果没能完全回复原状,会影响后面的操作。如果状态发生变化,那么在注释中的后置条件中需清晰表达。有例如S路行行走,有一个行一行的方法,是否需要说明后置条件为,已经转向。
逐步求精(stepwise refinement):就是至上而下逐步分解的(top down design)。除了某些特定的情况,在设计中通常会采用这种方式。而由下至上则是很多程序员入门前易犯的错误。对于分解的动作,如何能回归最初状态,准备执行下一个动作,是不错的选择。现在的CPU不在乎多些计算,而需要将程序写得简洁和清晰。例如karel这个小机器人,在某位置上,进行移动和操作,最后回到原来的位置上,或者面向某个方向(不一定是绝对方向,例如非墙方向,即可前进方向),这样就是回复原来的状态,使得任何人在你处理完之后,得到一个良好的状态。
分解的一般性原则:
- 每个方法应该能解决一个问题,问题有多个层次;
- 一个方法大概在1-15行之间
- 好的方法名字,容易阅读出功能,并应加上comment(加上前置和后置条件)