本章我們站在較高的層次快速瀏覽器Squeak體系艰猬,熟悉其運(yùn)行環(huán)境。其中包含大量的實(shí)踐機(jī)會(huì)埋市,因此最好在手頭有個(gè)電腦可以用來(lái)輸入測(cè)試
下面會(huì)使用一個(gè)特殊的標(biāo)記作為練習(xí)實(shí)踐的提示冠桃。在實(shí)踐中,我們會(huì)啟動(dòng)Squeak道宅,學(xué)習(xí)與其運(yùn)行環(huán)境的交互方法食听,探索基礎(chǔ)工具,掌握定義新的方法污茵,對(duì)象和如何發(fā)送消息給對(duì)象
1.1 開始
Squeak在www.squeak.org提供免費(fèi)下載樱报。需要三部分下載,其中包含四個(gè)文件泞当。
(1) virtual machine
(vm) 特定于不同操作系統(tǒng)與進(jìn)程的Squeak虛擬機(jī)迹蛤。大部分通用電腦操作系統(tǒng)都有對(duì)應(yīng)的預(yù)編譯的虛擬機(jī)
(2) sources
文件包含了Squeak中所有基礎(chǔ)實(shí)現(xiàn)部分。圖中的版本是SqueakV39.sources
。這個(gè)版本只可以用于3.9以及更高版本的Squeak盗飒。早期的版本需要使用對(duì)應(yīng)的sources版本嚷量。Squeak的3.0到3.8需要使用SqueakV3
(3)system image
是一個(gè)Squeak運(yùn)行時(shí)靜態(tài)快照鏡像文件。主要包含兩個(gè)文件.image
文件包含Squeak系統(tǒng)中的所有對(duì)象的狀態(tài)逆趣。.changes
文件包含其他所有在系統(tǒng)對(duì)象上的變化蝶溶。圖中我們使用Squeak3.9-final-7067
鏡像文件
本書中例子使用的Squeak版本是Squeak-dev
,可以在http://damien.cassou.free.fr/squeal-dev
獲取相關(guān)信息汗贫。這個(gè)版本包含豐富的預(yù)裝工具身坐,并且其他的擴(kuò)展包可以通過(guò)點(diǎn)擊安裝秸脱。本書中的所有入門練習(xí)可以應(yīng)用到任何版本落包,因此只需要安裝其中的一個(gè)版本,就可以掌握在其他版本中的開發(fā)摊唇。當(dāng)然在不同版本會(huì)有點(diǎn)細(xì)節(jié)的不同,不過(guò)仍然建議使用這個(gè)版本熟悉Squeak的基本應(yīng)用
在Squeak開發(fā)中巷查,鏡像文件(.image,.changes)會(huì)發(fā)生變化有序,所以需要確保這兩個(gè)文件是可寫的。經(jīng)常將這兩個(gè)文件放在相同目錄中岛请。盡量不要使用純文本編輯這兩個(gè)文件旭寿,Squeak只是使用這兩個(gè)文件保存對(duì)象的狀態(tài),以及對(duì)象發(fā)生變化的記錄信息崇败。在開始編程前最好將這兩個(gè)文件進(jìn)行備份盅称,這樣就可以隨時(shí)從新的鏡像文件開始變成
vm
文件與sources
文件通常是只讀的,可以在不同的用戶中共享后室。這些文件可以保存在相同目錄缩膝,也可以保存在所有人都可以訪問的目錄下。接下來(lái)選擇喜歡的操作系統(tǒng)即可開始享受Squeak編程的樂趣
Launching (啟動(dòng))
Doit 將.image
文件拖到虛擬機(jī)圖標(biāo)即可岸霹,或者雙擊.image
文件,或者在命令行輸入虛擬機(jī)名字與.image
文件路徑疾层。
啟動(dòng)后,將會(huì)看到一個(gè)大窗口贡避,包含大量的工作區(qū)間痛黎。Squeak使用上下文相關(guān)菜單。
First Interaction(初步交互)
Doit點(diǎn)擊窗口的空白地方打開菜單欄刮吧,選擇open...workspace
創(chuàng)建一個(gè)新的工作區(qū)間
Squeak通常使用帶有三個(gè)按鍵的鼠標(biāo)進(jìn)行操作舅逸。其中左側(cè)的red button
進(jìn)行選擇, 右側(cè)的yellow button
打開操作菜單皇筛。
Doit 在工作區(qū)間輸入Time now
琉历。然后右擊,選擇print it
鼠標(biāo)的第三個(gè)按鈕blue button
用來(lái)操作圖形,保護(hù)一系列對(duì)屏幕圖形對(duì)象的操作旗笔,如旋轉(zhuǎn)縮放彪置,
Doit點(diǎn)擊鼠標(biāo)滾輪,拖著其中按鈕繞著工作區(qū)間旋轉(zhuǎn)
可以自定義鼠標(biāo)配置蝇恶,修改其鼠標(biāo)按鈕實(shí)現(xiàn)不同功能拳魁。另外還可以使用alt
按鈕模擬鼠標(biāo)按鈕功能。使用蘋果機(jī)撮弧,可以使用鍵盤相應(yīng)按鈕模擬鼠標(biāo)潘懊。
可以配置鼠標(biāo)的工作方式配合操作系統(tǒng)與鼠標(biāo)驅(qū)動(dòng)。Squeak包含一些通用的鼠標(biāo)使用配置和鍵盤元鍵操作方式贿衍,可以使用Word
菜單的open
選項(xiàng)打開配置授舟。在preference browser
界面中, general
選項(xiàng)包含swapMouseButtons
可以用來(lái)切換鼠標(biāo)按鈕keyboard
選項(xiàng)包含調(diào)整不同鍵盤按鍵功能
Doit打開preference browser
試試搜索框找到swapMouseButtons
選項(xiàng)
1.2 Word菜單
Doit 在Squeak空白地方點(diǎn)擊打開Word
菜單贸辈。默認(rèn)情況下松開鼠標(biāo)菜單消失释树。可以點(diǎn)擊插針按鈕放在桌面上擎淤,鼠標(biāo)放開后也不會(huì)消失奢啥。可以拖著移動(dòng)嘴拢,直到點(diǎn)擊菜單外地方或者進(jìn)行選擇后才會(huì)消失桩盲。
word
菜單包含了Squeak提供的豐富的工具
Doit 選擇open...
選項(xiàng)。
接下來(lái)會(huì)看到一系列Squeak的核心工具席吴,包括系統(tǒng)菜單和工作區(qū)間赌结。在接下來(lái)的章節(jié)中會(huì)詳細(xì)介紹它們
1.3 保存,關(guān)閉和重啟Squeak會(huì)話
Doit返回word
菜單,選擇new morph...
然后選擇from alphabeitical list>A-C>BlobMorph
會(huì)打開一個(gè)圖形
Doit選擇word>save as...
輸入SBE
點(diǎn)擊Accepts(s)
然后選擇Word>save and quit
打開.image
和.changes
文件所在目錄抢腐,會(huì)發(fā)現(xiàn)SBE.image
和SBE.changes
文件包含在save and quit
的一系列操作信息姑曙。可以將這兩個(gè)文件移動(dòng)到任意的硬盤空間迈倍,也可以發(fā)送到其他地方伤靠。
Doit點(diǎn)擊SBE.image
文件再次啟動(dòng)Squeak
現(xiàn)在又返回到上次操作狀態(tài)。
當(dāng)?shù)谝淮螁?dòng)Squeak啼染,Squeak虛擬機(jī)加載提供的image鏡像文件宴合,包含一系列對(duì)象的快照,隨著在Squeak中的編程過(guò)程中迹鹅,可以發(fā)生消息給這些對(duì)象卦洽,也可以創(chuàng)建新的對(duì)象,這些對(duì)象會(huì)隨著銷毀而進(jìn)行內(nèi)存自動(dòng)回收
退出Squeak時(shí)斜棚,保存對(duì)象的快照阀蒂。保存的快照將會(huì)覆蓋原先的鏡像文件该窗。也可以以新的名字保存鏡像文件
在.image
文件外還有一個(gè).changes
文件,包含使用系統(tǒng)工作在源代碼基礎(chǔ)上的操作蚤霞,大部分時(shí)間不需要考慮這個(gè)文件酗失。這個(gè)文件通常用來(lái)修正錯(cuò)誤,后面會(huì)介紹
這個(gè)鏡像文件是1970年的后期的Smalltalk-80鏡像文件的一種變種昧绣。有些對(duì)象已經(jīng)使用了數(shù)十年
也許會(huì)認(rèn)為這些鏡像文件是保存和管理軟件工程的核心规肴,其實(shí)并不是這樣。后面會(huì)降到夜畴。還有大量的優(yōu)秀工具用來(lái)管理和共享軟件開發(fā)拖刃。鏡像文件非常重要,需要慎重對(duì)待贪绘,可以使用Monticello來(lái)管理代碼版本和共享代碼
Doit 中擊圖形
會(huì)出現(xiàn)一系列對(duì)圖形的操作兑牡,可以點(diǎn)擊幾個(gè)按鈕試試效果
1.4 工作區(qū)間和腳本運(yùn)行(Workspaces and Transcripts)
Doit 關(guān)閉打開的窗口,點(diǎn)擊Tools
工具欄兔簇,打開一個(gè)Transcripts
和workspaces
发绢,調(diào)整位置
可以直接拖拽邊角實(shí)現(xiàn)縮放也可以中擊選擇縮放硬耍,
任何時(shí)候只有一個(gè)窗口是激活的垄琐。通常在最前面并且是高亮的。鼠標(biāo)在這個(gè)窗口區(qū)域
transcript
用來(lái)輸出系統(tǒng)信息的對(duì)象经柴,可以看做系統(tǒng)控制臺(tái)system console
需要注意的是transcript
會(huì)影響性能狸窘,打開與其交互會(huì)降低運(yùn)行效率,另外這個(gè)工作并不是線程安全的坯认,在多個(gè)操作發(fā)生時(shí)可能出現(xiàn)意外問題
workspace
通常用來(lái)輸入代碼判斷翻擒,用來(lái)測(cè)試。也可以用來(lái)記錄文本內(nèi)容牛哺。如todo列表或者使用鏡像文件的姓名列表陋气。通常用來(lái)顯示一個(gè)鏡像文件的文檔。
Doit 在workspace輸入下面的語(yǔ)句
Transcript show: 'hello world'; cr .
然后嘗試在workspace進(jìn)行雙擊引润,注意單詞巩趁,文本被選中取決于點(diǎn)擊的穩(wěn)為主
Doit然后選擇整個(gè)文件,右擊淳附,選擇do it
transcript窗口將會(huì)顯示hello world文本议慰。再次運(yùn)行,(d)表示可以使用CMD-d進(jìn)行快捷操作
上面就是一個(gè)簡(jiǎn)單的Smalltalk表達(dá)式的計(jì)算過(guò)程奴曙。發(fā)送消息show 'hello wold'
給Transcript
對(duì)象别凹。然后發(fā)送消息cr
。Transcript
接著準(zhǔn)備出來(lái)這些消息洽糟,查找show:
方法和cr
方法進(jìn)行相應(yīng)的響應(yīng)
隨著使用炉菲,會(huì)發(fā)現(xiàn)smalltalk并不會(huì)調(diào)用一個(gè)操作和方法只是簡(jiǎn)單的發(fā)送消息堕战。這個(gè)集中體現(xiàn)了面向?qū)ο蟮木幊趟枷搿?duì)象用來(lái)負(fù)責(zé)響應(yīng)動(dòng)作拍霜,只需要簡(jiǎn)單發(fā)送消息給對(duì)象即可践啄。而不是命令對(duì)象做什么。對(duì)象負(fù)責(zé)查找方法來(lái)響應(yīng)消息沉御。
1.5 鍵盤快捷鍵
計(jì)算表達(dá)式時(shí)屿讽,不一定需要使用右擊按鈕》婉桑可以直接使用鍵盤快捷鍵伐谈。通常在菜單中使用(x)進(jìn)行描述。根據(jù)不同操作平臺(tái)试疙,可以選擇不同的快捷命令鍵
Doit 使用CMD-d
快捷鍵诵棵,計(jì)算workspace其中的表達(dá)式。
還可以使用do it
print it
inspect it
和explore it
快捷方式祝旷。
Doit在workspace中輸入3+4
表達(dá)式履澳,然后選擇do it
使用快捷鍵
可能會(huì)注意到并沒有任何事情發(fā)生,僅僅是發(fā)送+ 3
到數(shù)字對(duì)象4.結(jié)果對(duì)象7已經(jīng)計(jì)算出來(lái)和得到返回怀跛。然而workspace并不會(huì)接受這個(gè)結(jié)果距贷,丟棄這個(gè)響應(yīng)。如果想要查看結(jié)果吻谋,需要選擇print it
忠蝗。prinit it
編譯表達(dá)式,執(zhí)行編譯結(jié)果,發(fā)送printSting
到這個(gè)結(jié)果漓拾,顯示這個(gè)結(jié)果信息
Doit 選擇3+4
選擇print it
Doit 刪除高亮的7
阁最,然后選擇3+4
,選擇inspect it
這樣會(huì)打開一個(gè)新的inspector窗口,以SmallInteger:7
作為標(biāo)題骇两,Inspector是一個(gè)非常有用的工作可以用來(lái)瀏覽與操作系統(tǒng)中的對(duì)象速种。標(biāo)題表明表達(dá)式的運(yùn)行結(jié)果。左側(cè)允許我們?yōu)g覽器對(duì)象的實(shí)例變量低千。右側(cè)顯示實(shí)例變量的信息配阵。底層用戶發(fā)送消息給這個(gè)對(duì)象來(lái)測(cè)試使用
Doit 在底層中輸入self squared
,選擇print it
Doit 關(guān)閉inspector.在workspace輸入表達(dá)式Object
然后選擇explore it
這次會(huì)打開一個(gè)以O(shè)bject為標(biāo)題的窗口如下
栋操,
可以點(diǎn)擊對(duì)應(yīng)的小箭頭打開詳細(xì)信息.
explorer可以用來(lái)查找對(duì)象的信息闸餐,輸出一個(gè)樹狀信息。我們直接查找存儲(chǔ)在Object中的信息矾芙,
1.6 包管理 SqueakMap
SqueakMap是一個(gè)基于web的應(yīng)用與庫(kù)包管理系統(tǒng)舍沙,這個(gè)包管理系統(tǒng)使用分布式,由不同地方的人負(fù)責(zé)管理與維護(hù)剔宪。
Doit選擇Word>open..>SqueakMap package loader
可以在其中安裝對(duì)應(yīng)版本的應(yīng)用與庫(kù)包拂铡。
1.7 系統(tǒng)查看(The system Browser)
系統(tǒng)查看工具是開發(fā)中非常重要的工具壹无,其中包含幾個(gè)非常有用的窗口
Doit選擇word>open..>class browser
打開
其中的標(biāo)題顯示了我們正在查看的對(duì)象類
系統(tǒng)查看工具打開時(shí),所有面板都是空的感帅,第一個(gè)面板是系統(tǒng)分類斗锭,包含所有的類
Doit在分類(Category-namespace)中選擇Kernel-Objects
第二個(gè)面板顯示分類(Category-namespace)下的類(class)
Doit在類(class)列表選擇Object類
第三個(gè)面板顯示當(dāng)前類的功能接口協(xié)議(protocols-interface)。包含方法的分類失球。第四個(gè)面板默認(rèn)顯示所有的方法
Doit在協(xié)議(protocols)列表選擇printing協(xié)議
可以滾動(dòng)查找到這個(gè)協(xié)議岖是,然后在第四個(gè)列表中出現(xiàn)所有相關(guān)的方法
Doit在方法(Method)列表查找printString方法
在底下會(huì)顯示方法的源代碼。
1.8 查看類(Finding Classes)
在Squeak中有多種方法可以用來(lái)查找一個(gè)類实苞,首先可以使用系統(tǒng)查看器豺撑,查找
另外一種方法是發(fā)送browse
消息到類,這個(gè)請(qǐng)求會(huì)打開一個(gè)類的查看器黔牵,
Doit 在workspace中輸入Boolean browse
聪轿,然后選擇do it
這樣會(huì)打開一個(gè)關(guān)于Boolean類的查看窗口
Doit使用鍵盤快捷方式查看Boolean類
值得注意的是類Boolean被選擇后,協(xié)議與方法并么有進(jìn)行選擇猾浦。
最低下顯示了兩個(gè)面板陆错,中間包含類的定義(class definition),包含需要發(fā)送給父類用來(lái)創(chuàng)建一個(gè)子類的源代碼金赦。這里包含創(chuàng)建一個(gè)命名為Boolean的子類音瓷,并沒有包含任何實(shí)例變量,類變量或者字典信息素邪。并且將Boolean類存儲(chǔ)到Kernel-Objects 類分類下
最低層的面包包含類的注釋(class comment)外莲,用來(lái)描述了id意義猪半,可以單擊類面板下的?號(hào)來(lái)查看
如果想查看繼承鏈兔朦,可以使用hierarchy browser
Doit單擊中間的hierarchy
,查看Boolean類的繼承鏈
打開一個(gè)繼承鏈查看窗口,展示了Boolean的父類和子類信息磨确。非直接父類和子類則關(guān)閉的
經(jīng)常使用名稱類查找一個(gè)類沽甥,另外還可以查找不知道名稱或者忘記名稱的類
Doit鼠標(biāo)放置在系統(tǒng)查看器的類分類面板中,輸cmd-f乏奥“谥郏或者選擇find class(f)...
.輸入Time
接下來(lái)會(huì)看到一系列包含time的類的列表,選擇Time邓了,可以查找其具體信息恨诱。切換另一個(gè)可以使用cmd-b。返回上次查找的類
1.9 查看方法(Finding Methods)
有時(shí)候只記得方法的名稱或者方法名稱的一部分骗炉≌毡Γ可以使用方法查找來(lái)獲取其信息
Doit 選擇method finder
圖標(biāo),然后輸入now
句葵。按回車鍵
接下來(lái)方法查找其會(huì)顯示一系列包含now的方法厕鹃。滾動(dòng)到now兢仰。右側(cè)面板將會(huì)顯示包含now方法的三個(gè)類。選擇其中一個(gè)并打開它
有時(shí)候剂碴,僅僅指定有一個(gè)方法存在把将,不清楚具體名稱。也可以使用方法查看器忆矛,比如察蹲,需要找到一個(gè)方法將字符串轉(zhuǎn)換為大寫,
Doit 在方法查找器中輸入a
.A
催训。
方法查找器將會(huì)返回可能需要的方法
右側(cè)面板顯示復(fù)合條件的方法递览。星號(hào)表明所在的類,方法將會(huì)執(zhí)行瞳腌,返回需要的結(jié)果绞铃,沒有星號(hào)的方法返回這個(gè)期望的結(jié)果,復(fù)合條件但是并么有得到執(zhí)行
也可以使用參數(shù)來(lái)查找方法嫂侍。比如可以查找一個(gè)方法用來(lái)查找兩個(gè)數(shù)字的最大公因子儿捧。可以試著輸入25.35.5作為例子挑宠。
1.10 定義新的方法
測(cè)試驅(qū)動(dòng)開發(fā)已經(jīng)改變了編寫代碼的方式菲盾,這個(gè)測(cè)試驅(qū)動(dòng)的背后理念稱為行為驅(qū)動(dòng)開發(fā)或者TDD。通常編寫一系列的例子來(lái)定義預(yù)期行為各淀。來(lái)測(cè)試我們的代碼懒鉴。用來(lái)確保代碼的嚴(yán)謹(jǐn)性
經(jīng)常使用例子說(shuō)明一個(gè)方法的意義
testShout
self assert:('Dont"t painc' shout = 'DON"T PANIC!')
那么我們?nèi)绾卧赟queak里面定義一個(gè)新的方法。首先我們需要確定方法所在的類型碎浇。這個(gè)shout
方法需要定義在String類中临谱。對(duì)應(yīng)的測(cè)試?yán)樱覀兪褂肧tringTest
Doit查找StringTest
類奴璃,選擇一個(gè)合適的協(xié)議tests-converting
悉默。然后下面會(huì)提示一個(gè)模板來(lái)實(shí)現(xiàn)方法,刪除苟穆,輸入上面的代碼抄课,然后選擇accept(s)
進(jìn)行編譯保存。
因?yàn)槿鄙?code>shout方法雳旅,這個(gè)窗口將會(huì)需要確認(rèn)這個(gè)方法跟磨。可以用來(lái)進(jìn)行類型檢查攒盈,但是這個(gè)例子中抵拘,下面我們創(chuàng)建shout方法。
Doit為了運(yùn)行創(chuàng)建的新的test沦童。打開SUint TestRunner仑濒。word>open>test runner
打開的窗口的左側(cè)顯示系統(tǒng)類分類列表叹话,
Doit選擇Collections Tests-Text
然后右側(cè)會(huì)顯示對(duì)應(yīng)的測(cè)試類。選擇其中的StringTest墩瞳。點(diǎn)擊下面的Run selected
運(yùn)行這些測(cè)試?yán)?br>
將會(huì)看到測(cè)試運(yùn)行的信息溶耘。
可以使用調(diào)試器對(duì)其中的代碼進(jìn)行調(diào)試
Doit選擇String類熬甚,然后選擇converting協(xié)議驱敲,輸入下面的方法定義鹿霸,然后編譯保存