《斯坦福公开课:编程方法学》笔记

1)面向对象思想的引入
      本课程最初说明如何用Java编写的一个小程序的运行操作。是一个叫karel机器人的程序,提供几个方法供用户使用。在课程里面把karel说成是一种语言,命令就是karel类提供的几个公共方法。若需要用到karel没提供的动作命令,则可以自己创建新的命令。这样刚开始的时候,就把编程理解成是对象的相互操作,给后面向对象思想做预备。
      以前学C语言的时候,不是面向对象,而是面向过程。导致后来面向过程的思想根深蒂固,结果变成是用面向对象语言写的面向过程的程序。现在最新体会是面向对象时解耦后的面向过程。

2)逻辑错误
OBOB:off by one bug 差一错误
infinite loop:无限循环
调试:简单化、条理化、假设、严谨、冷静。bad value|faulty logic|unwantted assumption.

3)注释:
注释代码做了什么,最好包括前置条件pre-condition和后置条件post-condtion,说明程序的运行状态。不管代码多还是少,注释会使代码具体化、清晰化

错误处理:要确保循环的退出,避免无限循环的情况,尤其效率我们第一次和计划最后退出循环那一次body的运行,即对于循环需要确定第一步和最后一步循环是否已经完成我们所需的动作,例如是否在退出循环后仍需要再执行一次动作,或在进行循环之前先将动作执行一次,以免off by one bug。以及这个最后一步是否能有效的确保在条件判断中退出循环,是否各种情况都考虑到。

注释(comment):要养成良好的编程习惯,在文件和方法之前加入注释,方便阅读。给出方法的前置条件和后置条件,也就是前提和结果。以Karel举个例子,Karel将Beeper从一点移到另外一点,并且返回。返回后需要将karel回复到原来状态,例如原来面向哪个方向就是哪个方向。如果只是做完搬运的动作,如果没能完全回复原状,会影响后面的操作。如果状态发生变化,那么在注释中的后置条件中需清晰表达。有例如S路行行走,有一个行一行的方法,是否需要说明后置条件为,已经转向。

逐步求精(stepwise refinement):就是至上而下逐步分解的(top down design)。除了某些特定的情况,在设计中通常会采用这种方式。而由下至上则是很多程序员入门前易犯的错误。对于分解的动作,如何能回归最初状态,准备执行下一个动作,是不错的选择。现在的CPU不在乎多些计算,而需要将程序写得简洁和清晰。例如karel这个小机器人,在某位置上,进行移动和操作,最后回到原来的位置上,或者面向某个方向(不一定是绝对方向,例如非墙方向,即可前进方向),这样就是回复原来的状态,使得任何人在你处理完之后,得到一个良好的状态。


4)分解:逐步求精:自顶向下
      思考问题一般都是从抽象层面开始,想整体后细节。把大步骤一步一步分解到小步骤,直到原语的层次(计算机可以理解)。

 

  分解的一般性原则:

 

  1. 每个方法应该能解决一个问题,问题有多个层次;
  2. 一个方法大概在1-15行之间
  3. 好的方法名字,容易阅读出功能,并应加上comment(加上前置和后置条件)

     不管是面向对象还是面向过程都会用到逐步求精。


[5)loop and a half
while(true){..... break;.....}


6)Java虚拟机栈:Java方法执行的内存模型,通常所说的栈内存(另一个堆内存)
     ppt演示方法调用画出Java方法执行运行时栈帧结构。每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作数栈、动态链接(指向运行时常量池中该栈帧所属方法的引用,用于支持方法调用过程中的动态链接多态)、方法返回地址(包括正常完成出口和异常完成出口)、附件信息(如调试信息)等信息。 ——来自周志明《深入理解Java虚拟机》片段
    调用函数时,会把当前方法栈帧中的操作数栈中的值传递给调用函数的方法栈帧中的局部变量表,栈中存放的是基本类型数据和对象的引用。
    Java垃圾回收指堆中对象的回收,栈中的数据会在方法结束时弹出。堆中的对象根据一定规则标识为可达或不可达,在垃圾回收器根据垃圾回收算法回收不可达对象。

7)private
①信息隐藏,使用户不用关心类里面的具体结构
②控制访问对象变量,例如:可以返回一个字段的副本防止原版被修改


8)减少判断使用默认值

    private int factorial(int n)  
    {  
         int result=1;  
         for(int i=1;i<=n;i++)  
            result*=i;  
         return result;       
    }  

9)包装类,String对象不变性
String类的任何操作都会造成重新创建一个新的对象,代替原来的对象。基本类型的包装类也一样也具有不变性,其包含的基本类型不会被改变,只能是重新生成一个新的对象存放改变后的值。除了包装类自带的常量池除外。如果改变后的基本类型能在常量池中找到就不重新创建新的对象,而是将常量池中的对象返回。

10)数组初始化
Java静态语言-->Java数组也是静态的:当数组被初始化后,该数组的长度是不可变的。初始化Java数组的2种方式: ①静态初始化:初始化时显示指定每个数组元素的初始值,由系统决定数组长度; ②动态初始化:初始化时只指定数组长度,由系统为数组元素分配初始值。

 

    public class Cs   
    {         
        public static void main(String[] args)  
        {  
            int[] m=new int[3];   
            System.out.println(m[1]);           //0   
            System.out.println(m);              //[I@c3c749  
            System.out.println(int[].class);    //class [I 所以数组会自动初始化  
            System.out.println(int.class);      //int  
            //length不是类的属性字段,对应java指令码  arraylength 获得数组的长度值并压入栈顶  
            int n=m.length;            
        }     
    }  

 

    public class Cs   
    {         
        public static void main(String[] args)  
        {  
            Hah a=new Hah();  
            Hah b=new Hah();  
            b.haha="ddddd";  
            Hah[] m=new Hah[]{a,b,null,null};  
            Hah[] m1={a,b};  
            Hah[] m2=new Hah[3];  
            Hah[] m3=new Hah[3]{a,b,null}; //error  
            System.out.println(m[1].haha);  
        }     
    }  

 

 

 

参考资料:

https://bravecs.iteye.com/blog/1606763

https://blog.csdn.net/skdhfdfc/article/details/86743351

上一篇:力扣3. 无重复字符的最长子串---滑动窗口+哈希表


下一篇:力扣229 求众数II 摩尔投票