自動生成你的程序開發文檔

- 中國WEB開發者網絡 (http://www.webasp.net)
-- 技術教程 (http://www.webasp.net/article/)
--- 自動生成你的程序開發文檔 (http://www.webasp.net/article/18/17837.htm)
-- 作者:未知
-- 發佈日期: 2005-04-22
項目到了尾聲,大家都開始頭疼——又要寫文檔了……是的,我們大多數人都不是從正規的Programer訓練出來的。當初學習編程序的時候,就從來沒有想過要給自己寫的那幾個程序編寫一份完整的文檔,所有的註釋都僅僅是為了自己當時能夠想起這段代碼到底是幹什麼的,沒有人想過這些代碼的升級、共享問題。但是,開始做商業軟件之後,一切都變了,尤其是大型的團隊開發項目中。
大家也許注意到了,java的API文檔總是緊緊跟隨著JSDK的版本的提高而保持著最新的狀態。試想一下,手工維護這麼複雜的文檔可能嗎?當然不可能,這一切都是javadoc這個小程序的功勞(當然也有java類庫作者們做程序註釋的一份功勞)。API文檔就是用它根據最新的源代碼自動生成的,一切都是這麼容易——只需要你把本來就要寫的註釋寫得更規範一些,再稍微詳細一些。然而,大家似乎好像根本就沒有意識到它的存在,很少有人會用它來為自己的程序生成文檔。不知道,你現在是否對它有了興趣?好吧,下面我們就開始這個令人輕鬆的自動文檔生成之旅。

【如何插入註釋】

JAVADOC為你生成代碼不是憑空來的,也不是它會自動分析你的代碼——每個人都有自己的代碼風格,如果要進行分析翻譯恐怕還是機器碼更容易生成百倍。它的分析機制依賴於你按照規範為你的代碼添加應有而足夠的註釋。只有你老老實實寫註釋,才有可能把以前需要做雙份的工作一次做了。
Javadoc工具可以從下列對像中提取出信息:
· 包。
· 公共類。
· 公共接口。
· 公共或者受保護的方法。
· 公共或者受保護的變量/常數。
針對每一種特性,你都應該提供一條註釋。每一條註釋都要以/**打頭,以*/結尾。在每條/** …… */文檔註釋可包括任意格式的文字。,它的第一個句子應該是一個總結性的語句,javadoc會自動把它提出來製作總結頁。當然,這裡你完全可以使用一些HTML的記號,例如<i>...</i>表示斜體;<tt>...</tt>表示等寬的「打印機」字體;<b>...</b>表示粗體;甚至用<img...>包括一副圖像等等。(但是不要使用類似於<h1>的標題格式的標記,或者水平分隔線<hr>等,它們會和文檔自己的格式發生衝突)然後在後面接上一些特殊的「標記」。每個標記以@開頭,例如@author或者@param等等。
加入在註釋中包含了指向其它文件的其它文件的鏈接的話(例如你的插圖和圖片),需要將那些文件放置在名為doc-files的子目錄中。javadoc會將這些目錄以及其中的文件從源目錄複製到文檔目錄。下面我們分類解釋一下我們可能會比較常用的一些標記。

■常規註釋
下面這些標記可以在所有文檔註釋中使用。
◇ @since 版本
該標記可以生成一個註釋表明這個特性(類、接口、屬性或者方法等)是在軟件的哪個版本之後開始提供的。
◇ @deprecated 類、屬性、方法名等
這個標記可以增加一條註釋,指出相應的類、方法或者屬性不再應該使用。javadoc僅將首句複製到概覽部分和索引中。後面得句子還可以解釋為什麼不鼓勵使用它。有時候,我們也推薦另外一種解決辦法,例如:
@deprecated Use <tt>theAnotherMethod</tt>
或者使用{@link}標記給一個推薦的連接關於它的使用我們將馬上介紹。
◇ @see 鏈接
這個標記在「See also」(參見)小節增加一個超鏈接。這裡的鏈接可以是下面幾項內容:
· package.class#member label 添加一個指向成員的錨鏈接,空格前面是超鏈接的目標,後面是顯示的文字。注意分隔類和它的成員的是#而不是點號,你可以省略包名或者連類名也一塊省略,缺省指當前的包和類,這樣使註釋更加簡潔,但是#號不能省略。label是可以省略的。
· <a href=...>label</a> 這個不用解釋了吧。
· "Text" 這個直接在「See also」中添加一段沒有鏈接的文字。
◇ {@link 鏈接目標 顯示文字}
其實準確的說,link的用法和see的用法是一樣,see是把鏈接單列在參見項裡,而link是在當前的註釋中的任意位置直接嵌入一段帶超級鏈接的文字。

■為類和接口添加註釋
類或者接口的註釋必須在所有import語句的後面,同時又要位於class定義的前面。除了上面所說的常規標記以外,你還可以在類註釋中使用如下標記:
◇ @author 作者名
當使用author標記時,用指定的文本文字在生成的文檔中添加「Author」(作者)項。文檔註釋可以包含多個@author標記。可以對每個@author指定一個或者多個名字。當然你同樣可以使用多個作者標記,但是它們必須放在一塊兒。
◇ @version 版本
這個標記建議一個「版本」條目,後面的文字可以是當前版本的任意描述。
下面是類註釋的一個例子:
/**
* An implementation of a menu bar. You add <code>JMenu</code> objects to the
* menu bar to construct a menu. When the user selects a <code>JMenu</code>
* object, its associated <code>JPopupMenu</code> is displayed, allowing the
* user to select one of the <code>JMenuItems</code> on it.
* <p>
* For information and examples of using menu bars see
* <a
href="http://java.sun.com/docs/books/tutorial/uiswing/components/menu.html">How to Use Menus</a>,
* a section in <em>The Java Tutorial.</em>
* For the keyboard keys used by this component in the standard Look and
* Feel (L&F) renditions, see the
* <a href=doc-files/Key-Index.html#JMenuBar>JMenuBar</a> key assignments.
* <p>
* <strong>Warning:</strong>
* Serialized objects of this class will not be compatible with
* future Swing releases. The current serialization support is appropriate
* for short term storage or RMI between applications running the same
* version of Swing. A future release of Swing will provide support for
* long term persistence.
*
* @beaninfo
* attribute: isContainer true
* description: A container for holding and displaying menus.
*
* @version 1.85 04/06/00
* @author Georges Saab
* @author David Karlton
* @author Arnaud Weber
* @see JMenu
* @see JPopupMenu
* @see JMenuItem
*/

■方法註釋
緊靠在每條方法註釋的前面,必須有一個它所描述的那個方法的簽名。同樣除了使用常規用途的標記以外,還可以使用如下針對方法的註釋:
◇ @param 變量描述
當前方法需要的所有參數,都需要用這個標記進行解釋,並且這些標記都應該放在一起。具體的描述(說明)可同時跨越多行,並且可以使用html標記。
◇ @return 該方法的返回值
這個標記為當前方法增加一個返回值(「Returns」)小節。同樣具體描述支持html並可跨多行。
◇ @throws 該方法拋出的異常
這個標記為當前方法在「Throws」小節添加一個條目,並會自動創建一個超級鏈接。具體的描述可以跨越多行,同樣可以包括html標記。一個方法的所有throws都必須放在一起。
下面是一個方法註釋的例子:
/**
* Returns the model object that handles single selections.
*
* @param ui the new MenuBarUI L&F object
* @return the <code>SingleSelectionModel</code> property
* @see SingleSelectionModel
* @see JComponent#getUIClassID
* @see UIDefaults#getUI
*/

■包和綜述註釋
前面的都是針對某一個類、方法等的註釋,可以直接放在JAVA源文件中。然而為了生成一個包的註釋,必須在每個包的目錄下放置一個名為package.html的文件來對包進行描述。標籤<body>....</body>之間的文字都會被javadoc自動提取出來。
也可以為所有源文件提供一個綜述註釋,寫入名為overview.html文件中,將其放在所有源文件所在的父目錄下面。標籤<body> .... </body>之間的文字也都會被javadoc自動提取出來,做成文檔的Overview

【如何提取程序文檔】

首先,我們還是依照慣例來看看javadoc的基本用法,你可以通過javadoc -help來獲得它當前版本的具體設定細節。
javadoc [options] [packagename] [sourcefiles] [@files]
參數可以按造任意順序排列。
· options 命令行選項。
· packagenames 一系列包的名字,空格分隔,必須分別制定想要為之建立文檔的每一個包。Javadoc不遞歸作用於每一個包,也不允許使用通配符。
· sourcefiles 一系列源文件名,用空格分隔。源文件名可以包括路徑和通配符如「*」。
· @files 以任意次序包含包名和源文件的一個或者多個文件。當在sourcefiles中需要指定的文件太多的時候,就可以使用它來簡化操作。目標文件是以空格或者回車來進行分隔的源文件名。
其中常用的選項有:
-d 路徑
指定javadoc保存生成的HTML文件的目的目錄,缺省為當前目錄。
-author
在文檔中包含作者信息(默認情況下會被省略)
-version
在文檔中包含版本信息(在默認情況下會被省略)
-header header文本
指定放置在每個輸出文件頂部的頁眉文件。該頁眉文件將放在上部導航欄的右邊,header文本可以包括HTML標記和空格,但是如果這樣就必須用引號將它括起。在header中的任何內部引號都不許使用轉義。
-footer footer文本
指定放置在每個輸出文件底部的腳注文本。腳本將放置在下部導航欄的右邊,其它同header一樣。
-bottom text
指定放置在麼個輸出文件底部的文本。該文本將放置在頁底,位於導航欄的下面。其它同header參數。
-protected
只顯示受保護的和共有的類及成員,這是缺省狀態。
-public
只顯示公有的類和成員。
-package
只顯示包、受保護的和公有的類及成員。
-private
顯示所有的類和成員,如果是內部開發使用的程序文檔,這個將非常有用。
-sourcepath sourcepathlist
當將包名傳遞給javadoc的時候,可以指定查找源文件(.java)的搜索路徑。但必須注意,只有當用javadoc命令指定包名時才能使用sourcepath選項。如果省略sourcepath,則javadoc使用classpath查找源文件。注意:你需要把sourcepath設置成目標包的源文件所在的目錄,例如:你在從c:jproject裡有一個包cn.com.linuxaid,你想為它裡面的文件生成文檔,那麼你就必須寫成c:jprojectcncomlinuxaid。
-clathpath clathpathlist
指定javadoc查找「引用類」的路徑,「引用類」是值帶文檔的類加上它們引用的任何類。javadoc將搜索指定路徑的所有子目錄。classpathlist可以包含多個路徑,它們用分號分隔。

下面我們來舉一個例子:
假設,我們需要在targetdocdir放置我們生成的文檔,需要對c:jproject裡的cn.com.linuxaid包內的源文件建立程序文檔。那麼我們需要進入c:jprojectcncom(也就是包含了overview.html的目錄——假如你提供了它的話)。然後運行 javadoc -d targetdocdir cn.com.linuxaid

除了javadoc提供了豐富的選項參數來讓你定制你所需要生成的程序文檔以外,還可以借助doclet來產生任何形式的輸出,具體的情況,請仔細閱讀聯機幫助文檔。

webasp.net