白喬原創:實戰軟件DIY

 

開發一個屬於自己的軟件?讓流行軟件的包裝打上你的名字?也許這是最令你感到振奮的事情了。然而,這並不是很容易做到的事情。如何從一個好的思路出 發,到軟件的最終出品,箇中艱辛足以讓你感到迷茫……本文將圍繞筆者自行開發的免費軟件《FlashNow!動畫瀏覽器》的具體開發過程,循序漸進,深入 淺出,向讀者朋友簡單介紹軟件開發的相關知識。

需要指出的是,軟件開發是一件很嚴謹的事情,據說需要完整的系統的軟件工程理論知識;對於軟件開發,每個人也會有自己鍾愛的開發方法和習慣(正如有 的人偏愛於用左手寫字一樣)。本文不想花多大的篇幅講述令人頭疼的軟件工程、軟件管理的概念,畢竟我們更多的潛在的“開發商”羣還基本上就是那些古里古怪 的只熱衷於物理代碼的程序員們,而程序員的特點,很簡單,除了激情十足,就是懶散。抽象的概念總會讓人頭疼,本文所想做到的,就是根據筆者實戰的具體過 程,向讀者朋友們推薦一種實際可行的方法,而絕不是理論。跟着我來,Do It Yourself!我真誠的希望:通過本文,讀者朋友能夠學到一點真正有用的東西。

0. 前言

開發一個屬於自己的軟件?讓流行軟件的包裝打上你的名字?也許這是最令你感到振奮的事情了。然而,這並不是很容易做到的事情。如何從一個好的思路出 發,到軟件的最終出品,箇中艱辛足以讓你感到迷茫……本文將圍繞筆者自行開發的免費軟件《FlashNow!動畫瀏覽器》的具體開發過程,循序漸進,深入 淺出,向讀者朋友簡單介紹軟件開發的相關知識。

需要指出的是,軟件開發是一件很嚴謹的事情,據說需要完整的系統的軟件工程理論知識;對於軟件開發,每個人也會有自己鍾愛的開發方法和習慣(正如有 的人偏愛於用左手寫字一樣)。本文不想花多大的篇幅講述令人頭疼的軟件工程、軟件管理的概念,畢竟我們更多的潛在的“開發商”羣還基本上就是那些古里古怪 的只熱衷於物理代碼的程序員們,而程序員的特點,很簡單,除了激情十足,就是懶散。抽象的概念總會讓人頭疼,本文所想做到的,就是根據筆者實戰的具體過 程,向讀者朋友們推薦一種實際可行的方法,而絕不是理論。跟着我來,Do It Yourself!我真誠的希望:通過本文,讀者朋友能夠學到一點真正有用的東西。

0.1 好的軟件開發

那麼,怎樣才能保證好的軟件開發呢?一般認爲,以下幾個方面是缺不可少的:
²        好的軟件思路。idea,這是前幾年IT業界非常時髦的話題,出過國的、沒出過國的ITer,只要談到企業生存之道,總會提及good idea。確實是這樣,好的思路對於軟件開發來說尤爲重要,它可以大大激發軟件開發的激情,有利於軟件開發過程的順利開展,好的idea會給你帶來大把大 把的鈔票。要學會比較和鑑析,但不要抄襲。不要重複人類勞動,這很重要;
²        好的軟件管理。軟件管理是一件煩瑣的事情,但不掌握好軟件管理更是一件煩瑣的事情,不要“做一天和尚,撞一天鐘”,要有計劃和有效的管理;
²        好的軟件實現。“工欲善其事,必先利其器”,選擇合適的高效的開發工具,正如選擇了一把鋒利的戰刀,非常重要,不要企圖再用DEBUG來編寫一個Windows程序。記住,要最合適最高效的工具,而不是最好的,不要人云亦云。原因很簡單,沒有最好的;
²        好的軟件測試。軟件測試是很重要的環節,Java程序員通常認爲軟件測試應該佔用不少於30%的時間,好的測試環境和測試工具有利於軟件的整體開發。程序 員,包括你,用腳趾都知道:調試一行代碼要比編寫一行代碼令人難受的多。因此,準備好的測試環境和測試工具,準備好的測試,會讓你的軟件開發順利得多;
²        好的軟件文檔。簡明完整的軟件開發文檔是軟件開發過程中非常重要的環節,作爲程序員,30%的工作時間用來撰寫技術文檔是很正常的。缺乏文檔,一個軟件系統就缺乏生命力,在未來的查錯、升級以及模塊的複用時就都會遇到極大的麻煩;
²        好的軟件界面。如果還希望你的軟件給你帶來更大的喜悅的話(包括名氣和利潤),那就給你的軟件準備好友好的UI(user interface,用戶界面)。友好的界面風格,詳盡的幫助文檔,不是你所喜歡的,但爲了出名和賺錢,你必須做。

0.2 軟件開發過程

按照傳統的觀點,完整的軟件開發包括以下幾個階段:
²        項目啓動:啓動你的軟件項目,包括問題定義、可行性分析和制訂計劃。確定該軟件的開發目標和總的要求,探索這個問題是否值得去解,是否有可行的解決辦法;並根據對開發系統的理解,制訂出軟件開發全過程總的計劃進度安排;
²        需求分析:確定系統必須完成哪些工作,也就是對目標系統提出完整、準確、清晰、具體的要求;
²        系統設計(概要設計和詳細設計):概要設計要先確定系統具體的實施方案;然後進行結構設計,確定軟件結構;詳細設計就是在概要設計的基礎上,考慮“怎樣實現”這個軟件系統,直到對系統中的每個模塊給出足夠詳細的過程性描述;
²        軟件實現(編碼):將系統詳細設計的結果翻譯成用選定的語言書寫的程序。
²        測試及運行維護:通過各種類型的測試及相應的調試,使軟件達到預定的的要求。
聽起來一套一套的,沒什麼大不了的,實際上,包括你,大部分程序員做軟件開發時,潛意識的,大抵還是按照以上的路子走的;這些的階段之間,也並沒有 什麼嚴格的界限,各個階段的反覆和交錯是常有的事情;此外,對於小的軟件項目,以上的每個步驟也並不總是必需的。只要保證好的軟件質量和開發效率,你甚至 完全可以不理睬以上這些說法,去走自己的路子。
好了,準備好了嗎?下面我們馬上進入緊張有序的實戰訓練中去……

1. 實戰目標

我們到底要做什麼?“一副圖畫勝過千言萬語”,圖1爲FlashNow!的最終用戶安裝界面(在本文的後續內容我們將學習到軟件安裝程序的製作)。
圖1 FlashNow!動畫瀏覽器安裝界面

再也簡單不過了,我們要做的是一個Flash動畫瀏覽器。圖2和圖3是軟件運行界面的2個不同風格的快照(snapshot),圖2是FlashNow!的查看視圖,圖3是FlashNow!的瀏覽視圖,一個類似於資源瀏覽器的界面。
圖2 FlashNow!的查看視圖
 
圖3 FlashNow!的瀏覽視圖

程序跑起來會有2個界面,實戰目標應該清楚了,FlashNow!實際上就是一個類似於acdsee雙界面的Flash動畫瀏覽器。
“麻雀雖小,五臟俱全”,再簡單的軟件都必須有詳盡的幫助文檔。如圖4爲FlashNow!的幫助界面。看來我們的實戰內容還應包括幫助文檔的編寫。
圖4 FlashNow!的幫助界面
看來要學的東西還真的不少,那我們趕快開動吧!

2. 實戰部署

編碼?別急。對程序員來說,編碼是很愜意的事情(就象碰到咖啡和啤酒一樣),但記住:不要急着編碼。做好完整的實戰部署,才能打好仗。

2.1 問題定義

爲什麼要開發FlashNow!?開發FlashNow!真的有必要嗎?FlashNow!系統的開發真正可行嗎?下面我們來具體分析一下需求產生的基本背景。

也許你使用過acdsee,很好的東西,acdsee是個很成功的案例,大量的收藏圖片,合法的,或者不合法的,你都會想到使用acdsee來查看 它,這就是acdsee成功的地方。那麼,現在流行什麼了?現在(實際上是去年、或者前年)流行起Flash動畫了,追美眉的男生一定很清楚,阿貴系列 的,snoopy系列的,流氓兔系列的,ShowGood MTV,還有更多的無厘頭的MTV,都紛紛採用Flash動畫格式,去網上隨便走走,活靈活現的Flash廣告比中關村的ITer還要多。
總之,Flash動畫很流行了。Flash作爲一種成熟的流式技術,給動畫帶來了豐富的聲音、快的速度和吸引人的交互性,Flash讓動畫活起來 了。有Flash查看工具嗎?有的,市場上流行的動畫瀏覽器不少,有一款國外的產品SwfBrowser就很不錯。怎麼說呢,利用 ShockwaveFlash控件,通過VB就完全可以做出一個象模象樣的Flash動畫瀏覽器來。作爲Flash的締造者,Macromedia也提供 了界面美觀(其實根本就不美觀,除了菜單還是菜單,極其醜陋)的Flash Player。

在這樣的市場環境下,開發FlashNow!是否還有其必要性,有的。據Flash fans反映,這些流行的Flash動畫播放器還存在以下一些問題:

²        瀏覽、查看界面脫離,視覺上不直觀,操作上不方便;
²        文件瀏覽、文件打開界面不支持動畫預覽;
²        不支持多副動畫的順序瀏覽,對於大量Flash動畫的收藏用戶來說,操作麻煩;
²        動畫播放控制不方便,跳轉、定位功能不強;
²        不支持動畫文件(特別是遠程文件)的保存;
²        支持轉換的文件格式有限,不利於Flash動畫的多渠道傳播;
²        不支持標準FlashPlayer動畫程序(.exe文件)的播放;
²        未提供ShockwaveFlash控件中文版本,本地化程度不夠;
²        不支持ShockwaveFlash控件的自動檢測與安裝,用戶需自行安裝和配置;

對於以上階段所提出的問題有行得通的解決辦法嗎?問題定義接下來就是做項目的可行性分析,以探索這個問題是否值得去解,是否有可行的解決辦法。做可 行性分析一般要求從經濟上估計開發費用以及最終的從開發成功系統所獲得的收入或利益、衡量比較支出的費用和收到的利益;從技術上分析功能、性能以及限制條 件,能否是一個技術上可實現的系統;從法律上明確系統開發可能導致的責任,有無違法的問題。

採取FlashNow!來解決以上的問題,符合其特殊的技術背景和市場背景,在技術上也是完全可行的。
以上的內容構成了對FlashNow!項目待解決問題的定義及可行性分析。明確了工程目標,下面我們將開始制訂開發計劃。

2.2 制訂計劃

做任何事情之前必須有個完整的計劃(不要老提“計劃趕不上變化”),不要將你的項目置於無序的、失去控制的狀態之中。在啓動你的軟件項目之前,你最好學會使用Microsoft Project。

嚴格意義上來講,Microsoft Project是一種功能強大而靈活的項目管理工具,可以用於控制簡單或複雜的項目。它能夠幫助您安排和追蹤所有的活動,從而使您對它們的進度瞭如指掌。 使用Microsoft Project,可以建立軟件項目的進度計劃表,分配任務的資源和成本,優化項目進度計劃表,並監視項目實際執行情況。

圖5示出了使用Microsoft Project制訂FlashNow!開發計劃的實況。
圖5 使用Microsoft Project制訂FlashNow!開發計劃
沒有一成不變的計劃,在FlashNow!的後續開發過程中,以上制定的計劃內容和開發進度會根據實際情況做相應的調整和細化。

2.3 需求分析

說白了,需求分析就是要求明白“系統必須做什麼”。
系統的需求包括功能需求、性能需求、可靠性需求和資源使用需求等等,其中,功能需求是系統中最主要的需求,所以,對系統功能需求的分析是這一階段的關鍵。
很簡單,針對2.1的問題,就可以得出FlashNow!的簡單功能需求:
²        支持瀏覽/查看雙界面;
²        支持動畫文件的預覽,支持拇指圖;
²        支持多副動畫順序瀏覽(支持全屏顯示);
²        支持方便快捷的動畫播放控制;
²        支持本地/遠程動畫文件的播放、保存;
²        支持多種文件格式的轉換;
²        支持標準FlashPlayer動畫程序(.exe文件)的播放;
²        提供ShockwaveFlash控件中文版本;
²        支持控件的自動檢測與安裝;

以上的內容就構成了對FlashNow!簡單的功能需求分析,當然這不是最具體的,仍需要細化。細化需求,需要更多的信息採集和文檔準備,對於小型 的軟件開發,一種偷懶的辦法就是在軟件設計之前設計好系統的菜單結構和對話框界面(如圖6所示),或者更細的,準備好幫助文檔的草稿,這些都是以後要做的 事情,而菜單定義好了,幫助文檔設計好了,系統的功能需求也基本定好了。
圖6 FlashNow!的菜單設計

3. 實戰策略

確定了FlashNow!的功能需求之後,接下來就是系統設計的工作。很簡單,“怎樣解決用戶需求所提出的問題”,“在多種解決方案中,哪一種方案最合適”,如此如此,就是具體的系統設計的過程。系統設計一般分成概要設計和詳細設計,大抵是“逐步求精”的思路。
如何設計我們的FlashNow!呢?不要慌,我們從系統流程設計、系統模塊設計和系統類設計三個方面入手。

3.1 系統流程設計

FlashNow!包括兩個重要的流程,用戶可以直接啓動FlashNow!,或者從一個.swf文件關聯過去;另一種方式,用戶可以從文件夾的 Shell菜單中選取“啓動FlashNow!動畫瀏覽器(F)”來啓動FlashNow!,對應於不同的系統入口,FlashNow!的系統流程設計如 下:
流程一(瀏覽視圖):
 流程二(查看視圖):
流程很簡單,但願軟件實現起來也同樣的簡單。

3.2 系統模塊設計

總體來說FlashNow!可以分成以下幾大模塊:
²        Flash動畫播放控制模塊
包括動畫播放(Play)、停止(Stop)、跳轉(Seek)、拖放(Drag)、放大(ZoomIn)、縮小(ZoomOut)、全屏顯示(FullScreen)模塊;包括動畫循環播放、畫面質量和動畫背景色設置等模塊;
²        Explorer文件目錄樹模塊
包括Explorer文件目錄樹(ShellTree)的顯示、操作模塊;包括跳轉上級目錄、前進、後退等模塊;
²        Explorer文件列表模塊
包括Explorer文件列表(ShellList)的顯示、操作模塊;包括文件刪除、更名、預覽模塊;包括文件信息顯示、排序模塊;
²        Flash動畫文件操作模塊
包括動畫文件順序播放、文件跳轉、本地/遠程文件保存、文件格式轉換模塊;
²        ShockwaveFlash控件自動檢測安裝模塊
包括ShockwaveFlash控件自動檢測模塊、安裝模塊;
²        系統設置模塊
包括用戶系統設置、系統關閉和啓動時自動保存和載入系統配置模塊;
這六大模塊具有交錯的部分,例如Explorer文件目錄樹模塊和Explorer文件列表模塊,當用戶選取目錄樹其中的文件夾時,該文件夾下的文件列表也要相應地顯示出來。

3.3 系統類設計

類設計是更具體的面對對象(OO)的系統設計。
對應於系統流程與系統模塊,FlashNow!系統類設計列表如下:
²        應用類
CFlashNowApp:FlashNow!應用類
²        框架窗口類
CBrowserFrame:瀏覽視圖框架類
CViewerFrame:查看視圖框架類
CBrowserFolder:Explorer文件目錄樹視圖類
CBrowserList:Explorer文件列表視圖類
CFormBar:地址欄類
CLogoBar:廣告條類
CViewerClient:查看視圖類
CDropDownToolBar:支持下拉菜單的工具欄類
CViewerToolBar:動畫播放控制工具欄類
CNavigatorToolBar:Explorer文件目錄樹操作工具欄類
CProgressStatusBar:顯示動畫裝載進度的狀態欄類
²        CShell*類:Explorer實現類
CShell:Shell文件基礎類
CShellTree:Shell文件目錄樹類
CShellList:Shell文件列表類
CShellTreeItemData:Shell文件目錄樹項數據類
CShellListItemData :Shell文件列表項數據類
²        應用數據類
CHistory:Explorer歷史類
CHistoryRecord :Explorer歷史記錄類
CStringQueue:字符串隊列類
CUserData:系統配置數據類;
²        Flash動畫操作類
CShockwaveFlash:ShockwaveFlash控件窗口類
CFlashWnd:ShockwaveFlash控件窗口擴展類
CFlashOCX:ShockwaveFlash控件自動檢測安裝類
²        對話框類
C2HtmlDlg:HTML文件輸出對話框類
CAboutDlg:About對話框類
CFileOpenDlg:文件打開對話框類(支持動畫預覽)
CPropertyDlg:動畫屬性對話框類
CSetupDlg:系統設置對話框類
以上枚舉了FlashNow!的所有類,完整的類設計還應該還包括類的屬性方法的原型定義,限於文章篇幅,在此略去;對於其他項目,可能的話,還要進行系統的數據庫設計,FlashNow!沒有這方面的需求,亦略去。

系統流程設計、系統模塊設計和系統類設計只是系統設計的部分內容,以上的內容也僅僅屬於系統概要設計的層次,系統詳細設計還需要對這些系統流程、系統模塊和系統類設計進行更進一步的細化。

系統設計的輔助工具很多,常用工具有Microsoft Visio、Sybase PowerDesigner和Rational Rose等等,圖6爲使用Microsoft Visio進行系統設計的工作界面。
圖7 使用Microsoft Visio進行系統設計
值得一提的是,系統設計主要還是大腦的活動,輔助工具畢竟只是工具,好的設計方案即便使用Microsoft Word——或者更簡單些——圓珠筆和一些小紙片(但要保證能正確地表達你的思路)都能奏效。筆者在此不再展開,我們繼續以下的實戰過程。

4. 實戰體驗
經過詳細的實戰部署和系統設計,後面就是×××實彈的實戰了。我們按照軟件實現(編碼)——幫助文檔——安裝程序——軟件打包——軟件測試的順序一一介紹。

4.1 版本管理
且慢!還是不要急着編碼,在進入具體的軟件實現階段,作爲常識,你應該掌握一下關於版本管理的概念。

版本管理是軟件配置管理(Software Configuration Management,簡寫爲SCM)的一個重要環節。版本管理不屬於軟件開發過程中某個特定的階段,而是貫穿於整個軟件開發過程中的,在軟件開發過程中 所有的分析、設計文檔和源代碼都必須有嚴格的版本管理來保證。

版本管理的工具軟件很多,在衆多的成熟產品和試驗產品中,筆者推薦目前使用比較廣泛、有較大用戶前景且又能較易獲得的版 本管理器產品Microsoft公司的Visual SourceSafe(VSS)。VSS是Microsoft Visual Studio產品家族的一員,圖8示出了使用Visual SourceSafe對FlashNow!進行版本管理的實況。
 clip_p_w_picpath001[67,964字節]
 圖8 使用Visual SourceSafe進行FlashNow!版本管理
 
運用VSS進行版本控制管理的非常有效而且代價較小的解決方案是:
在一臺Windows NT服務器或者是一臺較爲獨立的Windows98/95 PC上安裝VSS6.0的服務器端軟件,創建一個爲該整個項目存放用的數據庫,然後在該數據庫中創建各個項目和子項目,並由VSS管理員爲小組的每個成員創建一個帳號及他們各自的權限;

在開發小組成員的PC上安裝VSS的客戶端軟件,並創建自己的工作目錄,這樣在軟件的開發過程中,只要通過該客戶端軟件登錄到VSS服務器上,Check Out當前要進行工作的項目或文件,如有修改在工作結束時將其 Check In提交給VSS服務器進行統一更新。

如果你是單槍匹馬,客戶端和服務器端完全可以集成在同一臺機器上。

4.2 軟件實現
你已經有了好的軟件思路,有了完整的系統設計方案,而且,你還知道了如何去維護你的軟件版本,但到現在爲止,你的代碼還是一片空白。說幹就幹,我們開始編碼。

1.       軟件開發工具
“好馬配好鞍”,選擇合適的軟件開發工具至關重要。有一句很流行的話:“真正的程序員用VC,聰明的程序員用DELPHI”,筆者不是聰明的程序員,然而既然我能夠象使用自己的食指一樣靈活地使用Visual C++,那麼,我選擇了VC(如圖9所示)。
 
 clip_p_w_picpath003[70,200字節]
 
圖9  使用Visual C++開發FlashNow!程序
 
FlashNow!基本上是個很正常的Windows Explorer-like SDI應用,使用MFC AppWizard(如圖10所示)可以迅速得到系統的框架。
 clip_p_w_picpath005[108,018字節]
 圖10 使用AppWizard構造FlashNow!應用框架
 
2.       天下文章一大抄
請不要誤解我的意思,古人說“天下文章一大抄”,也並非是鼓勵剽竊和抄襲;相反,筆者的意思是鼓勵讀者朋友們懂得借鑑, 流行的開發工具包(SDK)不要太多,這些SDK提供了統一的用戶界面和程序接口,你完全可以象使用自己的代碼一樣去使用它們。程序員要改掉頑固不化、閉 門造車的臭脾氣,該偷懶的時候就該偷懶。

確實有好多可以偷懶的地方,聽說過CJ60Lib嗎?我聽說過。
CJ60Lib 是MFC擴展庫(原名MFCXLib)針對Visual C++ 6.0進行升級的後續版本。CJ60Lib爲用戶提供了功能更強、界面更美觀實用的類,例如CCJMenu提供了圖標菜單,CJOutlookBar提供 了類似於Outlook的界面。使用CJ60Lib,用戶甚至可以只需要很少的代碼構造出類似於Microsoft Visual DevStudio的界面來(如圖11所示)。
 clip_p_w_picpath007[50,485字節]
 圖11 CJ60Lib構造的DevStudio界面
 
CJ60Lib提供了一組文件Shell類:
CCJShell:文件Shell操作類,如獲取文件信息、文件排序、枚舉Shell菜單等;
CCJShellTree:Explorer文件目錄樹視圖類,顯示文件Tree列表;
CCJShellList:Explorer文件列表視圖類,顯示文件List列表;
使用CCJShell*可以輕鬆枚舉出所有的文件項,包括我的文檔、回收站、網上鄰居等特殊文件夾,其行爲完全和“資源管理器”相似。對CJ60Lib有興趣的朋友可以參考如下地址:
http://www.codejockeys.com/codejockeys/
其中,CJ是codejockey的縮寫。

筆者參考(“抄襲”)了CJ60Lib的源碼,並根據FlashNow!的需求重新編寫了CShell*類,事實證明,參考標準的SDK代碼很容易達到事半功倍的效果。對CShell*代碼有興趣的朋友亦可以與筆者聯繫(但請勿應用於任何商用場合——不要做違法的事情)。

值得一提的是,僅僅“抄襲”源代碼還是不夠的,如果必要的話,筆者還鼓勵讀者朋友們抄襲一些成熟的應用的思路及實現方 法。對於FlashNow!的雙界面,筆者花了不少時間和經理,但最終仍很難得到滿意的思路。這時候,使用Visual Studio Tools組中的SPY++,確實是另一種偷懶的辦法。
SPY++可以查看當前系統的所有應用的窗口(windows)、消息(messages)、進程 (proccess)和線程(threads)——確實太棒了,既然acdsee已實現了雙界面,而且據說效果還不錯,那我們來用SPY++來窺其一二:
 clip_p_w_picpath009[72,870字節]
圖12 使用SPY++查看acdsee
 
明白了,acdsee同時創建2個窗口,一個可見(visible),一個隱藏(hidden),好辦,我們的FlashNow!也這麼辦,因爲著名的acdsee已經證明這種方案是可行的,也是可以爲用戶所接受的。

還有什麼可以“抄襲”的嗎?有的,顯示Flash有Macromedia官方的控件 swflash.ocx,swflash.ocx是完全共享的,我們完全可以使用它來顯示Flash動畫,但還有可以改進的地方,我們完全可以將控件的界 面菜單修改成中文(注意:這種“抄襲”不要應用於商用場合,否則——準備好罰金)。
用VC可以修改嵌入到.exe、.dll和.ocx的資源。啓動VC,記住使用resource方式打開swflash.ocx,開始菜單的漢化,如圖13所示。漢化後的菜單界面參見圖2。
clip_p_w_picpath011[83,457字節]
 
圖13 使用Visual C++修改swflash.ocx
 
FlashNow!啓動時將自動檢測ShockwaveFlash控件是否安裝並實現自動安裝。如圖14所示。
 
 
圖14 FlashNow!的控件自動檢測畫面
 
除此之外,幫助文檔也可以拿來“抄襲”,這是後續內容,在此不再展開。

3.       好的編碼風格
要編寫最漂亮的代碼。好的編碼風格是軟件編碼設計的基礎,在團體合作開發中尤爲重要。一般的觀點認爲,好的編碼風格應包括以下內容:
²        符合一定的命名規範;
²        要有至少20%的註釋;
²        要爲調試階段準備足夠的調試信息;
²        不要節省硬盤空間,加上合適的空白(包括Tab,空格和換行);
²        面向對象,層次清晰;
²        儘可能的模塊化,消除重複與冗餘;
²        邏輯清晰,不用goto語句,多用異常機制;
以下片段摘自於FlashNow!源碼,僅供參考:
 
//函數FindChild,在子項中查找指定目錄項
//參數hParent,父目錄
//參數pSlid,指定目錄項,CshellListItemData類參見Shell.h
//返回查找結果,NULL爲查找失敗
HTREEITEM CShellTree::FindChild(HTREEITEM hParent CShellListItemData *pSlid)
{
 //是否包含子項
 if (ItemHasChildren(hParent))
 {
  HTREEITEM hChildItem = GetChildItem(hParent);
  //查看所有子項
  while (hChildItem)
  {
   //比較子項內容
   if(!CompareStid(GetItemData(hChildItem)(LPARAM)pSlid))
    return hChildItem;
   hChildItem = GetNextItem(hChildItem TVGN_NEXT);
  }
 }
 //查找失敗,返回NULL
return NULL;
}
 
保持好的編碼風格,並不是嚴格依照死板的標準,程序員有必要在代碼的可寫性(不要讓自己難受是首要條件)和可讀性(不要讓別人難受)找到一個合適的均衡點。

4.3 幫助文檔
對於程序員來說,編寫幫助文檔就象寫情書一樣令人頭疼,但記住,你必須寫下去!再則,幫助文檔,其實也是一個簽名的好機會,何樂而不爲呢?

1. 幫助文檔格式
如果你已經裝了Windows 98或者後續版本,一定會發現它的幫助文檔和以前已經完全兩樣了。它採用新一代基於HTML文件格式的幫助文檔,文件擴展名爲.chm(已編譯的HTML 幫助文件)。HTML幫助文檔是一個統一的窗口(參見圖4),改變了原有幫助文檔目錄窗口和文檔內容窗口分離的情況,左側是目錄(Content)、索引 (Index)和搜索(Search)這三個功能項,通過常見的標籤欄切換。右側是幫助信息的顯示部分,顯示的是完全正常的HTML源代碼。

2. 使用HTML Help WorkShop製作幫助文檔
製作HTML幫助文檔的工具很多,最常見的是微軟公司的HTML Help Workshop工具包,感興趣的朋友可以查看以下的地址:
http://www.microsoft.com/workshop/author/HTMLhelp
HTML Help Workshop是英文版的,不過沒有關係,幫助文檔運行文件有簡體中文版,並且運行的界面是根據用戶使用的操作系統,與Workshop的語言版本沒有關係。
圖15示出了使用HTML Help Workshop設計FlashNow!幫助文檔的實況。
 
clip_p_w_picpath015[60,583字節]
 
圖15 使用HTML Help Workshop設計FlashNow!幫助文檔
 
HTML 幫助文檔的核心是充分利用HTML文件的表現能力,對分散的HTML文件(包括圖片、聲音文件等)作整體的包裝,只要你會製作HTML文件,基本上大事已備。

要生成已編譯的chm文件,需要以下源文件:
²        .htm文件:網頁文件,用以描述各幫助頁面;
²        .hhc文件:content文件,用以描述各幫助內容項;
²        .hhk文件:index文件,用以描述各幫助關鍵字項;
²        .hhp文件:工程文件,包含描述工程配置;
下面我們以FlashNow!爲例,簡單學習一下幫助文檔的製作:
²          運行Help Workshop,新建一個“工程(Project)”FlashNow.hhp,出現工程編輯界面。在工程編輯界面的上方是3個標籤欄,第一個 “Project”是有關工程的編輯,第二個“Contents”是目錄,第三個“Index”是索引。
²          選定“工程(Project)”標籤欄,單擊“改變工程選項”按鈕,出現工程選項對話框,這裏僅改變標題(Title)的內容,把製作內容標題 “FlashNow!1.05.20用戶幫助手冊”寫入,編譯後這個標題將出現在窗口的標題欄中。其它的內容暫時用系統的默認值。然後單擊“加入/刪除封 面文件”按鈕,加入封面頁的HTML文件。封面頁的文件一定要有,否則編譯的幫助文件運行後,系統會報錯。好了,簡單的工程編輯就完成了。
²          選定“目錄(Contents)”標籤欄,這時系統請你選定一個新目錄文件的名稱,指定後出現目錄編輯界面。按照內容的需要添加標題(Heading)或 頁面目錄(Page),並對每個目錄選定相應的HTML文件。標題可以分爲多級,並在標題上也放置需要的HTML文件,作爲標題的說明內容。如圖4的左側 所示的FlashNow!的Contents,通過“添加標題(Insert a head)”,依次建立“What's FlashNow!”“系統註冊與安裝”“功能描述與使用”“版權信息”“常見問題解答”5個標題,再在各級標題下“添加頁面目錄(Insert a page)”,並設定好每項頁面目錄所對應的頁面(URL)。
²          完成目錄編制後,一個HTML幫助文件已具備了雛形,什麼都先別幹,現在編譯(File\Compile)!在當前工作目錄可以找到FlashNow.chm,就是編譯之後的幫助文檔了,呵呵,怎麼樣?看到效果了嗎?
²          還沒有結束呢,完整的幫助系統應該還包括索引,選定“索引(Index)”標籤欄,添加關鍵字(Add a keyword),這樣,FlashNow.chm就是一個完整的幫助文檔了。
上述內容簡單介紹的是編制HTML幫助文件的基本步驟,上手很容易。但HTML Help Workshop的功能遠非這些,如在窗口定義中可以設計你所喜愛的形式,幾乎所有的窗口要素都可以改變。它還支持全文檢索功能,而且很容易製作。詳細的 內容請參考HTML Help Workshop的幫助文檔,或微軟的相應網頁。
如果你缺乏學習HTML Help Workshop的動力,試着想想別的辦法,將往日的情書(當然是寫給同一個人的)和QQ聊天記錄用HTML Help Workshop封裝起來,送給心愛的美眉,絕對是個好主意。

4.4 安裝程序

1. 規範化的安裝程序
當你完成一個應用軟件的開發後,如果你的軟件不要求是那種“綠色”產品(“綠色” 產品不會隨便弄髒用戶的硬盤),那麼你還需要爲分發該軟件而做一個規範化的安裝程序。這是使你的軟件商品化所不可缺少的一步。
一般而言,一個規範化的安裝程序應該滿足以下幾個條件:
²        只需安裝一次。也就是安裝完後,用戶不用進行其它的設置就能使用你的軟件;(應用軟件內部的參數設置是另一回事。)
²        要保證目標盤上“簡潔、乾淨”。就是說你的安裝程序能根據用戶所選擇的功能,僅安裝所需的部分,不把多餘的文件複製到用戶的目標盤上,特別是不向註冊表中添加無用的信息;
²        要保證對註冊表的正確使用,註冊表實際上是一個Windows的系統數據庫,所有應用軟件都可用它存儲一些必要的信息,例如用戶註冊信息、類的註冊、系統配置信息等,但對註冊表使用不當,就會導致系統性能的降低;
²        安全性。安裝程序應具備對已安裝系統進行必要檢查的能力,同時還應具有卸載功能,讓用戶可以根據自身的需要卸載你的軟件。在做這些的同時,還不應影響其他應用軟件的正常運行;

2. 使用SetupBuilder製作安裝程序
安裝程序的製作工具很多,知名的有InstallShield和Wise。如圖16爲InstallShield for Microsoft Visual C++ 6的界面。
 
clip_p_w_picpath017[98,785字節]
 
圖16 InstallShield for Microsoft Visual C++ 6
 
“蘿蔔青菜,各有所愛”,筆者比較喜歡使用國產的中文軟件SetupBuilder(如圖17所示)。感興趣的讀者朋友可以訪問以下地址:
http://www.irsys.com.cn
 clip_p_w_picpath019[143,678字節]
 
圖17 使用SetupBuilder製作FlashNow!安裝程序
 
以FlashNow!爲例,以下簡要介紹SetupBuilder的使用步驟:
²        新建工程FlashNow.spp;
²        常規設置\安裝程序基本設置:設置基本信息,如圖18所示;
 
 
圖18 FlashNow!的安裝程序基本設置
 
²        常規設置\指定文件組、組件和安裝類型:FlashNow!設置了2個文件組:Program Files包含可執行程序flashnow.exe和ShockwaveFlash控件中文版本cswflash.ocx;Movies包含範例文件 flashnow.swf和版本信息文件about.swf。接下來設置組件以包含不同的文件,最後設置不同的安裝類型(典型、最小、自定義)以包含不同 的組件。
²        常規設置\安裝程序對話框設置:設置安裝時各對話框的信息內容,這一項很簡單,界面完全可視化。
²        完成編譯\編譯安裝程序:選擇發佈磁盤類型爲1.44M,編譯;
運行setup.exe,看到激動人心的界面了嗎?“FlashNow!1.05.20安裝程序正在啓動SetupBuilder(TM)安裝程序嚮導,以幫助完成接下來的工作,請稍候……”,yahoo!感覺如何?
FlashNow.spp還需要別的配置纔算完整,因爲以上的步驟生成的setup.exe除了拷貝文件這些蠻活,別的 什麼都不會做,沒有桌面快捷方式,“開始\程序”裏也沒有FlashNow!,這個安裝程序對於註冊表沒有絲毫的改動,當用戶雙擊Flash文件的時候, 如果沒有合適的播放器的話,系統仍會傻乎乎地要求你選擇打開方式……
好辦,繼續修改FlashNow.spp:
²        高級設置\指定程序組和圖標:在可視化的“所見即所得(WYSIWYG)”界面中添加桌面快捷方式和程序項;其中程序項包括“白喬主頁”、“FlashNow!動畫瀏覽器”和“卸載FlashNow!動畫瀏覽器”三項;
²        高級設置\登記註冊表信息:同樣的可視化“所見即所得(WYSIWYG)”界面,添加以下內容:
我的電腦\HKEY_CLASSES_ROOT\.swf = ShockwaveFlash.ShockwaveFlash
我的電腦\HKEY_CLASSES_ROOT\ ShockwaveFlash.ShockwaveFlash = ShockwaveFlash動畫文件
我的電腦\HKEY_CLASSES_ROOT\ ShockwaveFlash.ShockwaveFlash\Shell\Open\Command = "<INSTALLDIR>\FlashNow.exe" "%1"
我的電腦\HKEY_CLASSES_ROOT\Folder\ Shell\啓動FlashNow!動畫瀏覽器(&F)\Command = "<INSTALLDIR>\FlashNow.exe" -B "%1"
我的電腦\HKEY_LOCAL_MACHINE\SOFTWARE\bluejoe\FlashNow.Vesion = 1.05.20
前三項操作用以註冊.swf的文件類型,並指定FlashNow!爲關聯應用程序;最後一項註冊版本信息;第四項則在文件夾Shell菜單裏添加“啓動FlashNow!動畫瀏覽器(F)”項,其行爲如圖19所示。
clip_p_w_picpath023[80,525字節]
 
圖19 FlashNow!在文件夾Shell菜單中的行爲
 
怎麼樣?酷吧?
SetupBuilder什麼都好,就是要註冊不好,否則超過2M的軟件包不給製作。要麼你去繳費註冊,要麼你就只有去學習E文軟件InstallShield。

4.5 程序打包

SetupBuilder生成出來的是一堆安裝文件。打包成一個zip文件很不錯,但更好的主意是打包成一個自解壓文件,Winzip Self-Extractor就是這樣的工具,圖20示出了Winzip Self-Extractor的工作界面。
 
圖20 使用Winzip Self-Extractor製作FlashNow!安裝包
 
使用Winzip Self-Extractor製作軟件包很簡單,只要按照程序嚮導一路Next即可。運行打包後的文件,FlashNow.exe將自動解壓並運行setup.exe開始系統的安裝。

4.6 軟件測試

軟件開發還沒有完成,還有軟件測試。
不要忽略軟件測試。目前國內很多軟件開發公司存在一個通病,那就是開發出來的軟件產品的質量一直得不到很好的保證,很多 產品在正式交給用戶使用後總是存在諸多的問題。其原因是多方面的,很重要的原因是軟件開發的管理水平不高,尤其是一直以來忽視了對軟件產品進行必要和充分 的測試。
完整的測試生命週期包括測試計劃、測試設計、測試開發、測試執行和測試評估。以FlashNow!爲例,按照測試內容,測試可以分爲:
²        功能測試(FlashNow!滿足了所有的功能需求嗎?)
²        用戶界面測試(FlashNow!的用戶界面友好嗎?)
²        性能測試(FlashNow!性能穩定嗎?存在“異常錯誤”嗎?)
²        壓力測試(在系統環境不正常的情況下,FlashNow!運行如何?)
²        容量測試(系統滿負荷的情形下,FlashNow!的承受能力如何?)
²        配置測試(FlashNow!的軟件配置和硬件配置如何?)
²        安裝測試(FlashNow!安裝之後,組件是否齊全,系統設置是否正確?)

測試過程包括單元測試、集成測試、系統測試和驗收測試。驗收測試是發佈軟件之前的最後一個測試操作。驗收測試的目的是確保軟件準備就緒,並且可以讓最終用戶將其用於執行軟件的既定功能和任務。

實施驗收測試的常用策略有三種,它們分別是:正式驗收、非正式驗收(α測試)和β測試。α測試是由用戶在開發環境下進行 的測試,也可以是公司內部的用戶在模擬實際操作環境下進行的測試;β測試是由軟件的多個用戶在實際使用環境下進行的測試。只有當α測試達到一定的可靠程度 時,才能開始β測試。β測試處在整個測試的最後階段。同時,產品的所有手冊文本也應該在此階段完全定稿。

FlashNow!的β測試由一羣熱心的(也許是無奈的)網友和兄弟們幫助完成,對於他們無限的熱忱和對各種bugs無限的承受力,筆者在此表達深深的敬意!

按照測試方法來分,測試包括人工測試和工具測試兩種,可視測試工具有:Rational Visual Test,Rational Performance,Logiscope TestChecker 等等,在此不在贅述。

5. 實戰成果

實戰的成果就一個.exe安裝文件,如圖1所示。後續的內容就是你如何發佈軟件,如何銷售軟件,利用產品來爲你賺錢(如果你還想要錢的話)。在知名 的網站發佈你的軟件,或者登記註冊你的軟件,與感興趣的商家主動聯繫也是好辦法,好的idea,總會有明智的商家願意掏錢與你合作。

FlashNow!至此還沒有賺取一分錢的利潤,FlashNow!1.05.20完全免費,FlashNow!的廣告條還是虛席以待——但我仍希望有明智的商家(最好是經營Flash網站的)給我寄來熱忱的協議書……

軟件商品化是你的事,筆者沒有更好的經驗。

6. 實戰經驗

本文到此結尾,有所收穫嗎?我希望你有。正如我前面所提醒的,軟件開發過程是一個嚴謹完整的過程,各種理論在拼命地解釋程序員各個階段的行爲並得出 更新更枯燥的規則,各種軟件開發工具也因此應運而生,要足夠時髦,就必須掌握更多更新的工具。軟件開發是學問,本文只嘗試以淺顯的語言和具體的實例來告訴 讀者朋友們一種組織軟件開發的思路,僅僅如此。

實戰結束了,以下的經驗是我想帶給你的:
²        不要急着編碼。編碼工作量不應該超過開發工作的百分之二十,成熟的系統設計會事半功倍;
²        不要忽視測試。測試應該至少要佔工程的百分之三十,如果你不想做一個不負責任的軟件牛仔的話,在經歷足夠的測試之後,再發布你的軟件;
²        不要追求怪異的界面,不要總記着在產品中顯示自己的名字或者照片;
²        註釋應該至少要佔源代碼的百分之二十;
²        最簡單的程序也應該有自己的log記錄,告訴用戶發生了什麼錯誤;
²        要會“抄襲”,只要不犯法,源碼、思路、幫助文檔都可以抄;
²        準備完整的幫助文檔;
²        不要欺騙用戶,不要總想着竊取用戶的信息,也不要不打招呼就爲用戶設置新的桌面和屏保,要講禮貌;
²        嘗試團體開發,即便是一個簡單得不能再簡單的軟件,也儘量分給幾個人做;你會在團體合作中體會到前所未有的樂趣,會完善你的思路,會培養成更好的編碼習慣,會得到更多項目管理的經驗;
²        不要告訴別人你是“編程”的,告訴他你是“某某軟件項目的主管”;

就這些,祝你成功,再見。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章