黃河笑 楊煥宇 陳海建 王 磊 鄭任兒
摘要 :本文論述了在設計與開發(fā)“軟件工程”網絡課程中采用的基于案例的教學內容設計,該教學設計以同一個案例貫穿所有章節(jié),增進了學生對知識點的掌握和理解;開發(fā)環(huán)境使用Dorado MVC架構(Struts+Hibernate+Spring),獲得了好的效果。與傳統(tǒng)的開發(fā)模式比較,這種開發(fā)模式最大的優(yōu)勢在于可以節(jié)省開發(fā)人員在開發(fā)Web應用表現層時的工作量,同時又為用戶提供非常友好的交互界面。
關鍵詞 :網絡課程;案例;樹型結構
中圖分類號:G642 文獻標識碼:B
1引言
在開放教育和遠程教育中,網絡教學正被越來越多地使用,開發(fā)適用于網絡教學的高質量的網絡課程已經成為發(fā)
展網絡教育的一個非常重要的課題。
《現代遠程教育技術標準體系和11項試用標準(簡介)》中對網絡課程進行了定義。網絡課程是通過網絡表現的某門學科的教學內容及實施的教學活動的總和,它包括兩個組成部分:按一定的教學目標、教學策略組織起來的教學內容和網絡教學支撐環(huán)境。
“軟件工程”課程是本科計算機專業(yè)的一門重要課程。在當前的教學中,特別是開放教育和遠程教育中還存在著很多欠缺,案例太少,或者各章中的案例相互割裂,使得學生學完該課程之后無法形成整體的軟件工程概念和思想。因此設計和開發(fā)貫穿整個教學過程的案例成為“軟件工程”網絡課程的必然選擇。
2 “軟件工程”網絡課程的教學內容設計
2.1以案例為中心
當前的計算機相關專業(yè)實踐教學環(huán)境存在諸多薄弱環(huán)節(jié),特別是在軟件工程教學中,很難為學生提供一個全面的感性認識。而當前的教學是離散的過程,沒有提供一個完整的商業(yè)軟件的實例來講解商業(yè)軟件開發(fā)的全部過程。經過調查研究、綜合對比和專家論證,我們選擇了某
軟件公司的商務軟件“應急系統(tǒng)”作為整個軟件工程網絡課程的案例。選擇該軟件的原因是該系統(tǒng)在Windows平臺上基于C++開發(fā),而C++是大部分計算機科學與技術專業(yè)的學生都學習過的第四代開發(fā)平臺,不足的地方是部分學生不了解應急系統(tǒng)。在教學內容設計中我們先對此公司“應急系統(tǒng)”的相關知識作了簡單介紹,然后把軟件工程的各個階段與該軟件的相關內容進行了一一映射和組合,公開了大部分相關設計和源代碼。
2.2兼顧面向過程和面向對象
當前軟件設計與開發(fā)的手段一般采用面向過程和面向對象這兩種方法。雖然“應急系統(tǒng)”是采用面向對象方法設計的,但是我們補充了面向過程的設計內容,這樣學生通過比較,既能熟悉和了解面向過程和面向對象的設計方法,又增強了理解,從而獲得了比較好的教學效果。
3網絡課程支撐環(huán)境的設計
3.1總體結構
系統(tǒng)設計應由上而下進行。首先設計總體結構,然后再逐層深入,直至進行每一個模塊的設計??傮w設計主要是在系統(tǒng)分析的基礎上,將整個系統(tǒng)劃分為若干子系統(tǒng),子系統(tǒng)則由若干模塊組成。數據的存儲以及整個系統(tǒng)實現等方面都進行了合理的安排。圖1所示為“軟件工程網絡”課程開發(fā)與設計的總體結構圖。
3.1系統(tǒng)開發(fā)平臺——Dorado MVC架構
Dorado全稱“Dorado Web應用開發(fā)套件”,包含:Dorado Web UI控件集及UI引擎(Dorado Web UI Components and UI Engine),Dorado可視化集成開發(fā)工具 (Dorado Studio),Dorado MVC開發(fā)框架和Dorado Web應
用框架。其中Dorado MVC開發(fā)框架的主要功能有:提供類似Struts的MVC開發(fā)框架,以便更加方便地利用Dorado套件進行基于MVC架構的開發(fā);提供性能監(jiān)控控制臺,可以方便地對系統(tǒng)運行過程中各功能點的運行效率進行統(tǒng)計和分析;支持國際化資源配置;支持模塊化配置。Dorado MVC開發(fā)框架是一個可選件。Dorado套件完全支持各種第三方開發(fā)框架,如Struts、WebWork等。我們利用Dorado與目前較為流行的Struts+Hibernate+Spring進行協(xié)同開發(fā)。
3.2系統(tǒng)主要模塊算法與設計
(1) 集合混淆算法
客觀題測試用于學生自測。題目是隨機排列的,順序與數據庫的存儲順序不同,它使用了Java.util.Collections中的shuffle(Listlist)方法來實現,下面是其在JDK 6.0中的算法和代碼。
使用指定的隨機源隨機更改指定列表的序列。所有序列更改發(fā)生的可能性都是相等的,假定隨機源是公平的。
此實現向后遍歷列表,從最后一個元素向前一直到第二個元素,將隨機選擇的元素重復交換到“當前位置”。元素是從列表中隨機選擇的,從第一個元素運行到當前位置。
此方法以線性時間運行。如果指定列表沒有實現RandomAccess接口并且是一個大型列表,則此實現在改組列表前將指定列表轉儲到該數組中,并將改組后的數組轉儲回列表中。這避免了二次型行為,該行為是因為在適當位置改組一個“有序訪問”列表而引起的。
private static Random r;
public static void shuffle(Listlist) {
if (r == null) {
r = new Random();
}
shuffle(list, r);
}
public static void shuffle(Listlist, Random rnd) {
int size = list.size();
if (size < SHUFFLE_THRESHOLD || list instanceof RandomAccess) {
for (int i=size; i>1; i--)
swap(list, i-1, rnd.nextInt(i));
} else {
Object arr[] = list.toArray();
// Shuffle array
for (int i=size; i>1; i--)
swap(arr, i-1, rnd.nextInt(i));
// Dump array back into list
ListIterator it = list.listIterator();
for (int i=0; i it.next(); it.set(arr[i]); } } } (2)DES加密算法 由于客觀題的隨機排列,使得試題的排列次序與數據庫中有所不同。同時,考慮到通過逐條在數據庫中查詢來校驗答案對數據庫的壓力過大,所以事先查詢出試題的答案,然后根據打亂后的試題次序把正確答案拼成一個字符串,然后加密放到頁面的隱藏域中。這樣一來,當提交試題查看結果時不用再次查詢數據庫,只要把答案字符串解密,然后分割成數組校驗即可。
這里的加解密采用了DES算法。
DES算法的入口參數有三個:Key、Data、Mode。其中Key為8字節(jié)共64位,是DES算法的工作密鑰;Data也為8字節(jié)64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。
DES算法是這樣工作的:如Mode為加密,則用Key去把數據Data進行加密,生成Data的密碼形式(64位)作為DES的輸出結果;如Mode為解密,則用Key去把密碼形式的數據Data解密,還原為Data的明碼形式(64位),作為DES的輸出結果。在通信網絡的兩端,雙方約定一致的Key,在通信的源點用Key對核心數據進行DES加密,然后以密碼形式在公共通信網(如電話網)中傳輸到通信網絡的終點。數據到達目的地后,用同樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣便保證了核心數據(如PIN、MAC等)在公共通信網中傳輸的安全性和可靠性。
下面是加密算法的部分代碼(解密原理類似):
public class DesEncrypt {
private Key key;
/**
* 根據參數生成KEY
*
* @param strKey
*/
public void getKey(String strKey) {
try {
KeyGenerator _generator = KeyGenerator. getInstance("DES");
_generator.init(new SecureRandom (strKey.getBytes()));
this.key = _generator.generateKey();
_generator = null;
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 加密 String明文輸入,String密文輸出
*
* @param strMing
* @return
*/
public String getEncString(String strMing) {
byte[] byteMi = null;
byte[] byteMing = null;
String strMi = "";
BASE64Encoder base64en = new BASE64Encoder();
try {
byteMing = strMing.getBytes("UTF8");
byteMi = this.getEncCode(byteMing);
strMi = base64en.encode(byteMi);
} catch (Exception e) {
e.printStackTrace();
} finally {
base64en = null;
byteMing = null;
byteMi = null;
}
return strMi;
}
/**
* 解密 以String密文輸入,String明文輸出
*
* @param strMi
* @return
*/
public String getDesString(String strMi) {
BASE64Decoder base64De = new BASE64Decoder();
byte[] byteMing = null;
byte[] byteMi = null;
String strMing = "";
try {
byteMi = base64De.decodeBuffer(strMi);
byteMing = this.getDesCode(byteMi);
strMing = new String(byteMing, "UTF8");
} catch (Exception e) {
e.printStackTrace();
} finally {
base64De = null;
byteMing = null;
byteMi = null;
}
return strMing;
}
(3) 章節(jié)維護算法
本網絡課程中的課程章節(jié)、目錄均為樹形結構,其數據模型采用了樹的模型,然后通過遞歸從根開始逐層遍歷顯示每個節(jié)點,便于導航學生學習。
下面是顯示樹形結構的代碼,由于樹形結構的顯示使用了ExtJs(Ajax)框架來渲染,所以代碼最終將產生JavaScript代碼的字符串,交由ExtJs框架完成最后顯示工作。
public String getExtTreeString(String prexHref ,String target ,boolean allowEdit ) {
......
//查詢根節(jié)點(包含子節(jié)點層次)
Course rootWithHierarchy = treeNodeDao. getTreeRootWithHierarchy();
StringBuffer rootInfo = new StringBuffer();
//構造ExtJs的樹形代碼
appendInfo(rootWithHierarchy , rootInfo);
StringBuffer treeInfo = new StringBuffer("new Ext. tree.AsyncTreeNode(" + Constants.PLACEHOLDER + rootInfo + ")");
return ExtUtil.formatExtStr(treeInfo);
}
private void appendInfo(Course node , StringBuffer buf){
if(node == null) return ;
//如果是葉子節(jié)點,構造葉子信息
if(node.getIsLeaf()) appendLeaf(node,buf);
//如果是目錄,構造目錄信息
else appendFolder(node , buf);
}
private void appendFolder(Course node , StringBuffer buf){
buf.append(",{text:'" + node.getText() + "',");
if(allowEdit){
buf.append("href:'"+prexHref+node.getId()+"',");
buf.append("hrefTarget:'" + target + "',");
}
buf.append("id:'" + node.getId() + "',");
buf.append("leaf:false,");
buf.append("children:[" + Constants.PLACEHOLDER);
//遍歷子節(jié)點,構造子節(jié)點信息
for(Course child: node.getChildren()){
appendInfo(child , buf);
}
buf.append("]}");}
private void appendLeaf(Course node , StringBuffer buf){
buf.append(",{text:'" + node.getText() + "',");
buf.append("id:'" + node.getId() + "',");
buf.append("iconCls:'user',");
buf.append("href:'"+prexHref + node.getId() + "',");
buf.append("hrefTarget:'" + target + "',");
buf.append("leaf:true");
buf.append("}");
}
從上述代碼中可以看出,首先找出(包含子節(jié)點信息的)根節(jié)點,然后通過appendInfo方法來產生ExtJs的JavaScirpt代碼,appendInfo會根據節(jié)點類型(葉子或目錄)來調用appendLeaf或appendFolder方法,其中appendFolder首先生成該目錄的信息,然后逐個顯示子節(jié)點信息,子節(jié)點又會調用appendInfo方法。就是這樣遞歸的調用,形成了最終的字符串,然后通過服務器傳到表現層,通過ExtJs來顯示整棵樹。
4結束語
我們在設計和開發(fā)“軟件工程”網絡課程時,采用基于案例的教學內容設計,同一個案例貫穿所有章節(jié),增強了學生對知識點的掌握和理解。開發(fā)環(huán)境采用Dorado MVC架構(Struts+Hibernate+Spring),獲得了好的效果。這種開發(fā)模式與傳統(tǒng)MVC的開發(fā)模式比較,其最大的優(yōu)勢在于可以節(jié)省開發(fā)人員在開發(fā)Web應用表現層式的工作量,同時又為用戶提供非常友好的交互界面。
從表1中可以看出,本文采用的方法在開發(fā)工作量、用戶界面、軟件可擴展性等三個方面都具有相當大的優(yōu)勢。
本網絡課程的設計和開發(fā)是從教學內容和網絡教學支撐環(huán)境兩個方面展開的,已在教學中使用一年,收到了較好的教學效果。特別是課程章節(jié)采用樹型結構,使得學生在自主學習的過程中獲得了更好的導航效果,提高了學習效率。下一步的工作是多增加藝術性方面的內容,尤其是媒體素材設計方面。
參考文獻:
[1] 林惠強,劉財興,林丕源. “軟件工程”課程啟發(fā)式教學的研究與實踐[J]. 計算機教育,2008(11):40-42.
[2] 佚名. Dorado與Strats、Hibernare、Spring的集成開發(fā)模式[EB/OL]. [2009-6-10].http://www.javaeye.com/topic/141135.