?? 5.+
字號:
軟件設(shè)計詳細(xì)說明書
1. 引言
1.1 編寫目的
將概要設(shè)計進(jìn)行細(xì)化,產(chǎn)生與源代碼的直接映像
1.2 背景
無
1.3 定義
1.4 參考資料
《軟件工程》,電子工業(yè)出版社
2. 程序(模塊)系統(tǒng)的組織結(jié)構(gòu)
JSApplet
SearchThread
3. 模塊JSApplet設(shè)計說明
3.1 模塊JSApplet描述
用于人機(jī)交互。所有的界面顯示。所有的用戶操作及軟件對用戶操作的響應(yīng)主要在這上面進(jìn)行。
用于存放全局變量。在這里全局變量作為通訊的一種重要手段,因?yàn)樵谶@里使用的是Applet,所以所有的全局變量其實(shí)可以看作是Applet上的一個對象供其它對象直接存儲。
3.2 功能
見描述
3.3 性能
無
3.4 輸入項(xiàng)
搜索串
選擇的引擎
3.5 輸出項(xiàng)
JSApplet的響應(yīng)
3.6 算法
定義了下列方法用于調(diào)用:
//JSApplet初始化
public void init()
//設(shè)置按鈕狀態(tài),在init()中使用。
void controlSetting()
//從輸入文件JSENGINES.TXT中整理出搜索引擎的信息
Hashtable getEngData()
//從輸入文件JSENGINES.TXT中整理出搜索引擎的類別(間接通過getEngData()取得。)
Vector getEngCateg(Hashtable engData)
//按鈕狀態(tài)設(shè)定
static void buttonStatus(int Status)
//搜索引擎類別選擇
void categorySelect()
//改變語言
void changeLanguage(int languageIndex)
//PREVIEW-STATUS-MESSAGES的顯示狀態(tài)切換
void switchPSM(boolean p, boolean s, boolean m)
//ENGINES&OPTIONS&ABOUT的顯示狀態(tài)切換
void switchEOA(boolean e, boolean o, boolean a)
//清除所有顯示
void clearAll()
//開始搜索
void startSearch()
//停止搜索
void stopSearch()
//新建搜索
void newSearch()
3.7 流程邏輯
初始化:
//取得搜索引擎信息
engDataTable = getEngData();
engDataCateg = getEngCateg(engDataTable);
//設(shè)置控件
controlSetting();
//加入事件監(jiān)聽器
開啟搜索:
for (Enumeration en = engDataTable.elements(); en.hasMoreElements();) {
engDtl = (EnginesDetails)(en.nextElement());
if ((engDtl.name).equals(enginesSelected[srchNo])) {
//將srchChain中的"^"置換成待搜索的字串
srchChainConverted = "";
StringReader strIn = new StringReader(engDtl.srchChain);
while (strIn.read(singleChar,0,1) != -1) {
if (singleChar[0] == '^') {
srchChainConverted += URLEncoder.encode(containingTf.getText().trim());
} else {
srchChainConverted += singleChar[0];
}
}
strIn.close();
//準(zhǔn)備搜索線程
srchThread[srchNo] = new SearchThread(srchChainConverted, engDtl.srchBlkB, engDtl.srchBlkE, engDtl.name, srchNo);
//在STATUS中加入信息
statusLi.add("Starting Search From " + engDtl.name + " ...");
//如果已經(jīng)達(dá)到了實(shí)際的搜索數(shù),就退出。
if (++srchNo >= actualSearchAllowed) break;
}
}
//開始搜索
for (srchNo = 0; srchNo < actualSearchAllowed; srchNo ++) {
//啟動搜索線程
srchThread[srchNo].start();
}
3.8 接口
//公共全局量定義/JSApplet對外的接口
static Hashtable resultTable = new Hashtable(); //結(jié)果集,包括網(wǎng)址、{主題、預(yù)覽},通過網(wǎng)址進(jìn)行定位
static Vector resultIndex = new Vector(); //結(jié)果集,僅包括網(wǎng)址,但可以快速使用elementAt(int)進(jìn)行定位,并確定網(wǎng)址
static boolean _stop = false; //用標(biāo)志讓線程結(jié)束,而不是用stop()!
static int actualSearchAllowed = 0; //實(shí)際應(yīng)打開的線程數(shù),并用于SearchThread的計數(shù)器
//SEARCH
static TextField containingTf = new TextField("");
static Button findNowBu = new Button("");
static Button stopBu = new Button("");
static Button newSearchBu = new Button("");
//RESULTS
static List resultLi = new List();
static Label totalNumLa = new Label("0");
//PSM
static TextArea previewTe = new TextArea("",0,0,TextArea.SCROLLBARS_VERTICAL_ONLY);
static List statusLi = new List();
static TextArea messageTe = new TextArea();
//OPTIONS
static Choice smcCh = new Choice();
static Choice smlCh = new Choice();
static Choice valurlCh = new Choice();
static Choice languageCh = new Choice();
static Choice webBrowCh = new Choice();
static TextField webBrowPTf = new TextField();
3.9 存儲分配
//搜索引擎詳細(xì)信息
class EnginesDetails {
String name; //搜索引擎名稱
String category; //搜索引擎類別
String srchChain; //搜索串
String srchBlkB; //信息塊開始
String srchBlkE; //信息塊結(jié)束
}
//搜索結(jié)果詳細(xì)信息
class ResultsDetails {
String title; //主題
String preview; //預(yù)覽
}
4. 模塊SearchThread設(shè)計說明
4.1 模塊SearchThread描述
用于與Internet通信的接口。
JSApplet信息的來源。
4.2 功能
見描述
4.3 性能
用較快的速度,穩(wěn)定的搜索結(jié)果并進(jìn)行分析
4.4 輸入項(xiàng)
this.srchChainConverted = srchChainConverted;
this.srchBlkB = srchBlkB;
this.srchBlkE = srchBlkE;
this.srchEngName = srchEngName;
this.srchNo = srchNo;
4.5 輸出項(xiàng)
搜索到的網(wǎng)址,并在JSApplet.ResultLi上顯示。
4.6 算法
主要是對搜索信息塊進(jìn)行分析,有如下方法:
//核心搜索線程
public void run()
//用傳入的變量對類中的變量進(jìn)行賦值
public SearchThread(String srchChainConverted, String srchBlkB, String srchBlkE, String srchEngName, int srchNo)
//向前推進(jìn)一個字符
boolean stepOneChar()
//分析信息塊
void analyseBlock()
//網(wǎng)址有效性驗(yàn)證
boolean validUrl()
//格式化結(jié)果集
String formatString(String unFmtStr, int width)
//顯示結(jié)果信息
void showResult()
4.7 流程邏輯
for (int level=0; level < Integer.valueOf(JSApplet.smlCh.getSelectedItem()).intValue() && !JSApplet._stop; level++) {
//用級數(shù)處理搜索串
srchChainConvertedWithLevel = srchChainConverted.replace('`',(char)(48+level));
//打開搜索的頁面流
inURLStream = new BufferedReader(new InputStreamReader((new URL(srchChainConvertedWithLevel)).openStream()));
//推進(jìn)
while (stepOneChar()) {
//找到信息塊的開始:srchBlkB
if (matchString.equals(srchBlkB)) {
//準(zhǔn)備收集信息
resultDtlHead = "";
resultDtlBody.title = "";
resultDtlBody.preview = "";
//對信息塊進(jìn)行分析,并取出URL,TITLE,PREVIEW
analyseBlock();
//將最后一個非結(jié)果集排除,因?yàn)樽詈笠粋€信息塊的結(jié)束不可能也是頁面的結(jié)束。或如果當(dāng)頁已結(jié)束則退出。
if (!stepOneChar()) break;
//適當(dāng)休眠,讓PREVIEW有辦法進(jìn)行!且讓其它搜索線程有辦法進(jìn)行!并讓死鎖有時間釋放。并且如果有多個線程,這0.1秒的重疊后也就不算什么了。
Thread.sleep(100);
//對所得到的結(jié)果進(jìn)行網(wǎng)址有效性驗(yàn)證
if (JSApplet.valurlCh.getSelectedItem().equals("Yes")) {
if (!validUrl()) break; //如果驗(yàn)證不通過,則不將這個URL記入/顯示。
}
//將結(jié)果存放并顯示
showResult();
} //if
} //while
//關(guān)閉流
inURLStream.close();
4.8 接口
this.srchChainConverted = srchChainConverted;
this.srchBlkB = srchBlkB;
this.srchBlkE = srchBlkE;
this.srchEngName = srchEngName;
this.srchNo = srchNo;
4.9 存儲分配
//要搜索的內(nèi)容
String srchChainConverted;
//當(dāng)前搜索線程的序號
int srchNo;
//搜索引擎的基本信息
String srchBlkB, srchBlkE, srchEngName;
//定義搜索當(dāng)中要用到的變量
String srchChainConvertedWithLevel; //加入Level后的搜索串
BufferedReader inURLStream;
char matchChars[] = {' ', ' ', ' ', ' '}; //將與標(biāo)志相符的字符
char singleChar[] = {' '}; //每次取得的字符
String matchString; //用作matchChars到String的轉(zhuǎn)化。
int resultCount = 0; //當(dāng)前線程找到的結(jié)果
//準(zhǔn)備搜集的信息
String resultDtlHead = new String(); //用于存放結(jié)果集中的URL
ResultsDetails resultDtlBody = new ResultsDetails(); //用于存放主題和預(yù)覽
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -