1. 程式人生 > >白喬原創:實戰軟體DIY

白喬原創:實戰軟體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_image001[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_image003[70,200位元組]

圖9  使用Visual C++開發FlashNow!程式

FlashNow!基本上是個很正常的Windows Explorer-like SDI應用,使用MFC AppWizard(如圖10所示)可以迅速得到系統的框架。

 clip_image005[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_image007[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_image009[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_image011[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_image015[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_image017[98,785位元組]

圖16 InstallShield for Microsoft Visual C++ 6

“蘿蔔青菜,各有所愛”,筆者比較喜歡使用國產的中文軟體SetupBuilder(如圖17所示)。感興趣的讀者朋友可以訪問以下地址:

http://www.irsys.com.cn

 clip_image019[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_image023[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記錄,告訴使用者發生了什麼錯誤;

²        要會“抄襲”,只要不犯法,原始碼、思路、幫助文件都可以抄;

²        準備完整的幫助文件;

²        不要欺騙使用者,不要總想著竊取使用者的資訊,也不要不打招呼就為使用者設定新的桌面和屏保,要講禮貌;

²        嘗試團體開發,即便是一個簡單得不能再簡單的軟體,也儘量分給幾個人做;你會在團體合作中體會到前所未有的樂趣,會完善你的思路,會培養成更好的編碼習慣,會得到更多專案管理的經驗;

²        不要告訴別人你是“程式設計”的,告訴他你是“某某軟體專案的主管”;

就這些,祝你成功,再見。

相關推薦

原創實戰軟體DIY

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

原創solr cloud的sql查詢引擎solr-sql

SolrCloud介紹   在我們應用還很渺小的時候,一臺Solr伺服器能完全勝任這份工作,隨著我們應用慢慢長大,訪問也越來越多,一臺Solr伺服器的弊病也逐漸顯現如查詢變慢了,機器宕機就無法繼續提供服務,於是乎我們引入了Solr叢集,通過前端負載均衡和索引Replica

原創圖資料線上互動框架InteractiveGraph

InteractiveGraph 詳細介紹     InteractiveGraph 是一個使用JavaScript開發的開源專案,為大規模圖資料提供了一個基於Web的互動操作框架,其資料可以來自於本地的GSON檔案。  &nb

原創圖資料線上互動伺服器 InteractiveGraph-neo4j

InteractiveGraph-neo4j日前釋出v0.0.1版本。 InteractiveGraph-neo4j基於Neo4j資料庫為InteractiveGraph提供伺服器後端。InteractiveGraph為大型圖資料提供了一個基於web的互動操作框架,其資料可以來自於GSON檔

原創VC之美化介面篇

本文專題討論VC中的介面美化,適用於具有中等VC水平的讀者。讀者最好具有以下VC基礎: 1. 大致瞭解MFC框架的基本運作原理; 2. 熟悉Windows訊息機制,熟悉MFC的訊息對映和反射機制; 3. 熟悉OOP理論和技術; 本文根據筆者多年的開發經驗,並結合簡單的

原創主考官不是上帝

由於部門經常為一些橫向專案所累,所以我們常常需要招聘新職員,也以此接觸到了很多面試者,包括剛出校門的應屆生和打拼多年的開發人員。最近網路上關於面試技巧的文章多起來了,多有同感,其實我最想對無數準備面試的同仁們說的是:記住,擺正心態,主考官不是上帝! 我們想想,主考官是幹嘛的

VC之控制元件篇(原創

1 使用Windows標準控制元件 1.1 常見控制元件列表 Windows標準控制元件即普通控制元件,撰寫此文時,筆者每天面對的Word就帶了一臉的控制元件,當然你肯定也熟悉:字型選擇下拉框、工具欄、滾動條、狀態列,如此等等。 常見的Windows標準控制元件在VC裡

原創】寫二十年的程式碼是一種什麼樣的體驗?

原文發表於知乎,http://www.zhihu.com/question/35100740/answer/6235494370後老人,來自皖南山區純的農村娃,大學之後才有的程式設計經歷受前面一個兄弟的

重學 Java 設計模式實戰外觀模式「基於SpringBoot開發門面模式中介軟體,統一控制介面名單場景」

![](https://img-blog.csdnimg.cn/20200611230723500.png) 作者:小傅哥 部落格:[https://bugstack.cn](https://bugstack.cn) >沉澱、分享、成長,讓自己和他人都能有所收穫!

原創Nginx反向代理實戰部署

image log nginx反向代理 request 1.8 反向代理 conf 負載 -1 均衡負載服務器 10.0.0.9 [[email protected] conf]# vim nginx.conf worker_processes 1;

原創圖書黑客攻防實戰加密與解密工具包下載地址

ont ike ack 百度 密碼 style 工具包 下載 href 說明:百度每一年都會對分享的進行清理,所以原來的工具包地址失效,請自行下載。黑客攻防:實戰加密與解密工具包下載地址https://pan.baidu.com/s/1mjoGYso 密碼:ezwthttp

原創聊Python小如何系統自學成為Python大牛(基礎篇一)上

Python Python學習 Python開發 Python自學 原創:聊Python小白如何系統自學成為Python大牛(基礎篇一)上 支持原創 本文章,由頭條py柯西發表,禁止轉載,希望大家支持原創 歡迎大家點擊復制鏈接看原文https://www.toutiao.com/i654581

福利貼18個Python爬蟲實戰案例(已開源)

加qq群813622576或vx:tanzhouyiwan免費獲取Python視訊教程以及各類PDF! 爬蟲小工具 downloader.py:檔案下載小助手 一個可以用於下載圖片、視訊、檔案的小工具,有下載進度顯示功能。稍加修改即可新增到自己的爬蟲中。 動

必看測試人有必要參考的軟體測試工作規範

小白必看:測試人有必要參考的軟體測試工作規範        為了規範測試工作、減少開發與測試之前的溝通成本、保證專案進度、提高軟體質量,測試人員有必要參考這份軟體測試工作規範。1.1. 編碼規範  軟體程式開發需要遵守編碼規範,一是可以減少程式碼的維護成本,提高

原創PHP利用session,實現用戶登錄後回到點擊的頁面(本文以TP為例)

con gop query php代碼 自帶 ttr strpos 手機 roo 1、以下內容純屬原創,請謹慎選擇: ①目的:用戶登錄超時,session過期,點擊後跳轉到登錄頁,登錄成功再跳轉到鼠標點擊的頁面。 ②流程:用戶登錄---session過期---點擊跳

原創實現Solaris 與Windows 間的文件共享

when reading work existing pan after 重啟 所有者 相同 背景: 現行作業方式無法實現賬號權限的管控,並且每次訪問都需要創建新的連接。 Solaris訪問windows共享目錄通過以下命令 /usr/sfw/bin/smbclie

原創LNMP架構部署個人博客網站 禁止轉載復制

mcr sysv 返回 瀏覽器 you 首頁 gid 軟件程序 esp nginx編譯安裝步驟 ①. 檢查軟件安裝的系統環境 cat /etc/redhat-release uname -r

曉蓮說-何不原創java 實現二維數組冒泡排序

java println 變量 冒泡排序 cnblogs 交換 public 自己 代碼 新手從業路-為自己回顧知識的同時,也希望和大家分享經驗: 話不多說,上代碼 public class 冒泡排序 { /** * @param admin

Systemd入門教程實戰篇(轉)

現在 重啟 penssh span 日誌 才會 查看 筆記本 dep 作者: 阮一峰 日期: 2016年3月 8日 上一篇文章,我介紹了 Systemd 的主要命令,今天介紹如何使用它完成一些基本的任務。 一、開機啟動 對於那些支持 Systemd 的軟

Docker小從零入門實戰

one service pre var AI play 不知道 ping splay 環境:Centos 6.9 0.查看是否滿足安裝需求。 先檢查服務器環境,docker要求操作系統CentOS6以上,kernel 版本必須2.6.32-431或更高,即>=Cent