要掌握软件构造这门课程,首先需要一些基础知识,其中包括JAVA编程语言以及一些其他的规约、概念,本文的内容对应MIT阅读材料中Reading 2: Basic Java的内容。
关于JAVA 的基础知识,如果学习过C语言的话,其实不必专门学习,想要用到什么再去查就好。如果像系统学习,可以遵照上面MIT中指示的那样去学,也可以去菜鸟教程网站去学。但是不要花费太多时间,那样太无聊了,很容易失去兴趣。本文则主要针对一些在这门课中出现的一些特别的概念进行总结。
一、快照图(Snapshot diagrams)
快照图这个名称是英文直译,它长下面这个样子。
快照图可以看到,这个图相当于在程序运行的某一时刻,把程序里面的数据结构形象地画出来,所以叫快照图。例如上面这个图就表示,有一个叫turtle的实例,里面有一个域,就是数据类型为Map<String, Turtle>的字典(准确翻译应该叫映射,不过字典这个词更加形象)。这个字典里存储着三个键值对,其中一个键值对的键为“Buster”。
快照图非常直观地描述了当前时刻内存中地数据结构与状态,因此用处十分广大。程序员最大的问题就是不喜欢写注释,有时候写着写着自己都忘了自己当时写的是什么,相信每个人都有自己的作标记的方法,而快照图则提供了一种标准,不仅利于自己记忆,也有助于与团队成员进行交流。
快照图中,圈代表类,箭头从引用指向引用的值。指向的常量叫做Primitive values,指向的类叫做Object values。
基础值 类值二、可变性与不可变性(Mutability & Immutability)
可变性与不可变性的概念其实十分简单,但是不太容易用语言表达清楚。编程语言中我们总是要定义变量,比如“Type x=a”表示定义了一个类型为Type的变量,其实可以理解为挖了一块内存空间,取了个名字叫做“x”,并且把这片内存空间赋值为a。如果说Type这个类型是可变的,那么我们可以直接在原来的内存空间上把a变成其他的值,比如重新赋值为ab,用快照图表示如下:
可变的数据类型如果说Type这个类型是不可变的,那就不能在原来的内存空间上进行修改了,得重新挖一片内存,赋以新值,然后把这片内存空间叫做x,原来那片就不能叫“x”了。如果原来那片内存空间这时候一个名字都没有了,也就是说程序访问不到了,它没用了,那么它就会被Java自带的垃圾回收机制Garbage Collector给回收回计算机系统,以后想要内存了再说。快照图表示如下:
不可变的数据类型其实这里还有一个细节,可变的数据类型是单层圆形,不可变的数据类型是双层原型,倒回去可以发现举的例子中快照图就是这么画的。
另外还有一种特殊情况,可以将可变的数据类型可以通过修饰词变成不可变的,叫做Immutable references,例如“final int n = 5;”,此时变量只能被初始化一次,便不能再次改变,相当于C语言中的常量。但是这里的不能改变只是不能用“=”来重新赋值,如果这个实例内部存在一些方法,比如“list.add()”,就可以改变内部的值。可见,此限制只是使得变量的内存空间不能再发生改变,但是如果可以修改该内存内部的值,变量的值还是可以改变的。(例如要是把java中的一个List列表a设置为final,这个List就只能指向原来List中的第一个元素了。我们知道List中的一串元素是相连的,知道了第一个就知道了全部,但是这些元素并不是List每个元素的值,而是指向这些值的地址,此时只要把这些地址给修改了,List的值就会改变。这样一通操作,这个a的值——地址元素的首地址没变,但是每个地址元素都变了,List自然也就不是原来的List了)。
万变不离其宗,触类旁通。
三、规约(Specifications)
所谓规约,就是对于一个类(Class)中每个方法(method)的详细描述。同样地,规约也是同时面向开发者和使用者的。它主要包括下面几个方面:
1. 方法签名(method signature):包括函数的名字、参数、返回值的类型,以及这个函数可能会抛出(也就是造成)哪些异常。这些综合在一起,就可以形成一个方法的独特标识,因此叫做方法的签名。
2. 完整的描述:就是对这个方法的功能、意义的完整的文字描述。
3. 参数(Parameters):就是对方法各个参数所代表的意义作出解释。
4. 返回值(Returns):这个方法返回的东西代表什么。
有了规约,我们不需要看代码,就能够理解并正确使用一个类中的所有方法。
网友评论