本章我们站在较高的层次快速浏览器Squeak体系,熟悉其运行环境。其中包含大量的实践机会,因此最好在手头有个电脑可以用来输入测试
下面会使用一个特殊的标记作为练习实践的提示。在实践中,我们会启动Squeak,学习与其运行环境的交互方法,探索基础工具,掌握定义新的方法,对象和如何发送消息给对象
1.1 开始
Squeak在www.squeak.org提供免费下载。需要三部分下载,其中包含四个文件。
Squeak(1) virtual machine
(vm) 特定于不同操作系统与进程的Squeak虚拟机。大部分通用电脑操作系统都有对应的预编译的虚拟机
(2) sources
文件包含了Squeak中所有基础实现部分。图中的版本是SqueakV39.sources
。这个版本只可以用于3.9以及更高版本的Squeak。早期的版本需要使用对应的sources版本。Squeak的3.0到3.8需要使用SqueakV3
(3)system image
是一个Squeak运行时静态快照镜像文件。主要包含两个文件.image
文件包含Squeak系统中的所有对象的状态。.changes
文件包含其他所有在系统对象上的变化。图中我们使用Squeak3.9-final-7067
镜像文件
本书中例子使用的Squeak版本是Squeak-dev
,可以在http://damien.cassou.free.fr/squeal-dev
获取相关信息。这个版本包含丰富的预装工具,并且其他的扩展包可以通过点击安装。本书中的所有入门练习可以应用到任何版本,因此只需要安装其中的一个版本,就可以掌握在其他版本中的开发。当然在不同版本会有点细节的不同,不过仍然建议使用这个版本熟悉Squeak的基本应用
在Squeak开发中,镜像文件(.image,.changes)会发生变化,所以需要确保这两个文件是可写的。经常将这两个文件放在相同目录中。尽量不要使用纯文本编辑这两个文件,Squeak只是使用这两个文件保存对象的状态,以及对象发生变化的记录信息。在开始编程前最好将这两个文件进行备份,这样就可以随时从新的镜像文件开始变成
vm
文件与sources
文件通常是只读的,可以在不同的用户中共享。这些文件可以保存在相同目录,也可以保存在所有人都可以访问的目录下。接下来选择喜欢的操作系统即可开始享受Squeak编程的乐趣
Launching (启动)
Doit 将.image
文件拖到虚拟机图标即可,或者双击.image
文件,或者在命令行输入虚拟机名字与.image
文件路径。
启动后,将会看到一个大窗口,包含大量的工作区间。Squeak使用上下文相关菜单。
First Interaction(初步交互)
Doit点击窗口的空白地方打开菜单栏,选择open...workspace
创建一个新的工作区间
Squeak通常使用带有三个按键的鼠标进行操作。其中左侧的red button
进行选择, 右侧的yellow button
打开操作菜单。
Doit 在工作区间输入Time now
。然后右击,选择print it
鼠标的第三个按钮blue button
用来操作图形,保护一系列对屏幕图形对象的操作,如旋转缩放,
Doit点击鼠标滚轮,拖着其中按钮绕着工作区间旋转
可以自定义鼠标配置,修改其鼠标按钮实现不同功能。另外还可以使用alt
按钮模拟鼠标按钮功能。使用苹果机,可以使用键盘相应按钮模拟鼠标。
可以配置鼠标的工作方式配合操作系统与鼠标驱动。Squeak包含一些通用的鼠标使用配置和键盘元键操作方式,可以使用Word
菜单的open
选项打开配置。在preference browser
界面中, general
选项包含swapMouseButtons
可以用来切换鼠标按钮keyboard
选项包含调整不同键盘按键功能
Doit打开preference browser
试试搜索框找到swapMouseButtons
选项
1.2 Word菜单
Doit 在Squeak空白地方点击打开Word
菜单。默认情况下松开鼠标菜单消失。可以点击插针按钮放在桌面上,鼠标放开后也不会消失。可以拖着移动,直到点击菜单外地方或者进行选择后才会消失。
word
菜单包含了Squeak提供的丰富的工具
Doit 选择open...
选项。
接下来会看到一系列Squeak的核心工具,包括系统菜单和工作区间。在接下来的章节中会详细介绍它们
1.3 保存,关闭和重启Squeak会话
Doit返回word
菜单,选择new morph...
然后选择from alphabeitical list>A-C>BlobMorph
会打开一个图形
Doit选择word>save as...
输入SBE
点击Accepts(s)
然后选择Word>save and quit
打开.image
和.changes
文件所在目录,会发现SBE.image
和SBE.changes
文件包含在save and quit
的一系列操作信息。可以将这两个文件移动到任意的硬盘空间,也可以发送到其他地方。
Doit点击SBE.image
文件再次启动Squeak
现在又返回到上次操作状态。
当第一次启动Squeak,Squeak虚拟机加载提供的image镜像文件,包含一系列对象的快照,随着在Squeak中的编程过程中,可以发生消息给这些对象,也可以创建新的对象,这些对象会随着销毁而进行内存自动回收
退出Squeak时,保存对象的快照。保存的快照将会覆盖原先的镜像文件。也可以以新的名字保存镜像文件
在.image
文件外还有一个.changes
文件,包含使用系统工作在源代码基础上的操作,大部分时间不需要考虑这个文件。这个文件通常用来修正错误,后面会介绍
这个镜像文件是1970年的后期的Smalltalk-80镜像文件的一种变种。有些对象已经使用了数十年
也许会认为这些镜像文件是保存和管理软件工程的核心,其实并不是这样。后面会降到。还有大量的优秀工具用来管理和共享软件开发。镜像文件非常重要,需要慎重对待,可以使用Monticello来管理代码版本和共享代码
Doit 中击图形
会出现一系列对图形的操作,可以点击几个按钮试试效果
1.4 工作区间和脚本运行(Workspaces and Transcripts)
Doit 关闭打开的窗口,点击Tools
工具栏,打开一个Transcripts
和workspaces
,调整位置
可以直接拖拽边角实现缩放也可以中击选择缩放,
任何时候只有一个窗口是激活的。通常在最前面并且是高亮的。鼠标在这个窗口区域
transcript
用来输出系统信息的对象,可以看做系统控制台system console
需要注意的是transcript
会影响性能,打开与其交互会降低运行效率,另外这个工作并不是线程安全的,在多个操作发生时可能出现意外问题
workspace
通常用来输入代码判断,用来测试。也可以用来记录文本内容。如todo列表或者使用镜像文件的姓名列表。通常用来显示一个镜像文件的文档。
Doit 在workspace输入下面的语句
Transcript show: 'hello world'; cr .
然后尝试在workspace进行双击,注意单词,文本被选中取决于点击的稳为主
Doit然后选择整个文件,右击,选择do it
transcript窗口将会显示hello world文本。再次运行,(d)表示可以使用CMD-d进行快捷操作
Do it上面就是一个简单的Smalltalk表达式的计算过程。发送消息show 'hello wold'
给Transcript
对象。然后发送消息cr
。Transcript
接着准备出来这些消息,查找show:
方法和cr
方法进行相应的响应
随着使用,会发现smalltalk并不会调用一个操作和方法只是简单的发送消息。这个集中体现了面向对象的编程思想。对象用来负责响应动作,只需要简单发送消息给对象即可。而不是命令对象做什么。对象负责查找方法来响应消息。
1.5 键盘快捷键
计算表达式时,不一定需要使用右击按钮。可以直接使用键盘快捷键。通常在菜单中使用(x)进行描述。根据不同操作平台,可以选择不同的快捷命令键
Doit 使用CMD-d
快捷键,计算workspace其中的表达式。
还可以使用do it
print it
inspect it
和explore it
快捷方式。
Doit在workspace中输入3+4
表达式,然后选择do it
使用快捷键
可能会注意到并没有任何事情发生,仅仅是发送+ 3
到数字对象4.结果对象7已经计算出来和得到返回。然而workspace并不会接受这个结果,丢弃这个响应。如果想要查看结果,需要选择print it
。prinit it
编译表达式,执行编译结果,发送printSting
到这个结果,显示这个结果信息
Doit 选择3+4
选择print it
Doit 删除高亮的7
,然后选择3+4
,选择inspect it
这样会打开一个新的inspector窗口,以SmallInteger:7
作为标题,Inspector是一个非常有用的工作可以用来浏览与操作系统中的对象。标题表明表达式的运行结果。左侧允许我们浏览器对象的实例变量。右侧显示实例变量的信息。底层用户发送消息给这个对象来测试使用
Doit 在底层中输入self squared
,选择print it
Doit 关闭inspector.在workspace输入表达式Object
然后选择explore it
这次会打开一个以Object为标题的窗口如下
Exploring
,
可以点击对应的小箭头打开详细信息.
explorer可以用来查找对象的信息,输出一个树状信息。我们直接查找存储在Object中的信息,
1.6 包管理 SqueakMap
SqueakMap是一个基于web的应用与库包管理系统,这个包管理系统使用分布式,由不同地方的人负责管理与维护。
Doit选择Word>open..>SqueakMap package loader
可以在其中安装对应版本的应用与库包。
1.7 系统查看(The system Browser)
系统查看工具是开发中非常重要的工具,其中包含几个非常有用的窗口
Doit选择word>open..>class browser
打开
其中的标题显示了我们正在查看的对象类
系统查看工具打开时,所有面板都是空的,第一个面板是系统分类,包含所有的类
Doit在分类(Category-namespace)中选择Kernel-Objects
第二个面板显示分类(Category-namespace)下的类(class)
Doit在类(class)列表选择Object类
第三个面板显示当前类的功能接口协议(protocols-interface)。包含方法的分类。第四个面板默认显示所有的方法
Doit在协议(protocols)列表选择printing协议
可以滚动查找到这个协议,然后在第四个列表中出现所有相关的方法
Doit在方法(Method)列表查找printString方法
在底下会显示方法的源代码。
1.8 查看类(Finding Classes)
在Squeak中有多种方法可以用来查找一个类,首先可以使用系统查看器,查找
另外一种方法是发送browse
消息到类,这个请求会打开一个类的查看器,
Doit 在workspace中输入Boolean browse
,然后选择do it
这样会打开一个关于Boolean类的查看窗口
Doit使用键盘快捷方式查看Boolean类
值得注意的是类Boolean被选择后,协议与方法并么有进行选择。
最低下显示了两个面板,中间包含类的定义(class definition),包含需要发送给父类用来创建一个子类的源代码。这里包含创建一个命名为Boolean的子类,并没有包含任何实例变量,类变量或者字典信息。并且将Boolean类存储到Kernel-Objects 类分类下
最低层的面包包含类的注释(class comment),用来描述了id意义,可以单击类面板下的?号来查看
如果想查看继承链,可以使用hierarchy browser
Doit单击中间的hierarchy
,查看Boolean类的继承链
打开一个继承链查看窗口,展示了Boolean的父类和子类信息。非直接父类和子类则关闭的
经常使用名称类查找一个类,另外还可以查找不知道名称或者忘记名称的类
Doit鼠标放置在系统查看器的类分类面板中,输cmd-f。或者选择find class(f)...
.输入Time
接下来会看到一系列包含time的类的列表,选择Time,可以查找其具体信息。切换另一个可以使用cmd-b。返回上次查找的类
1.9 查看方法(Finding Methods)
有时候只记得方法的名称或者方法名称的一部分。可以使用方法查找来获取其信息
Doit 选择method finder
图标,然后输入now
。按回车键
接下来方法查找其会显示一系列包含now的方法。滚动到now。右侧面板将会显示包含now方法的三个类。选择其中一个并打开它
now有时候,仅仅指定有一个方法存在,不清楚具体名称。也可以使用方法查看器,比如,需要找到一个方法将字符串转换为大写,
Doit 在方法查找器中输入a
.A
。
方法查找器将会返回可能需要的方法
右侧面板显示复合条件的方法。星号表明所在的类,方法将会执行,返回需要的结果,没有星号的方法返回这个期望的结果,复合条件但是并么有得到执行
也可以使用参数来查找方法。比如可以查找一个方法用来查找两个数字的最大公因子。可以试着输入25.35.5作为例子。
1.10 定义新的方法
测试驱动开发已经改变了编写代码的方式,这个测试驱动的背后理念称为行为驱动开发或者TDD。通常编写一系列的例子来定义预期行为。来测试我们的代码。用来确保代码的严谨性
经常使用例子说明一个方法的意义
testShout
self assert:('Dont"t painc' shout = 'DON"T PANIC!')
那么我们如何在Squeak里面定义一个新的方法。首先我们需要确定方法所在的类型。这个shout
方法需要定义在String类中。对应的测试例子,我们使用StringTest
Doit查找StringTest
类,选择一个合适的协议tests-converting
。然后下面会提示一个模板来实现方法,删除,输入上面的代码,然后选择accept(s)
进行编译保存。
因为缺少shout
方法,这个窗口将会需要确认这个方法。可以用来进行类型检查,但是这个例子中,下面我们创建shout方法。
Doit为了运行创建的新的test。打开SUint TestRunner。word>open>test runner
打开的窗口的左侧显示系统类分类列表,
Doit选择Collections Tests-Text
然后右侧会显示对应的测试类。选择其中的StringTest。点击下面的Run selected
运行这些测试例子
将会看到测试运行的信息。
可以使用调试器对其中的代码进行调试
Doit选择String类,然后选择converting协议,输入下面的方法定义,然后编译保存
Method定义
网友评论