亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

分析用Javadoc形式集成文檔的利與弊

2019-11-18 13:29:30
字體:
來源:轉載
供稿:網友

  java語言按照Javadoc注釋約定采用了一種集成的方法來進行API文檔編制。Javadoc工具可以幫助生成好的API文檔,然而大多數Java API文檔卻很糟糕。因為它是源代碼的一部分,所以 API 的文檔編制職責最終還是落到了工程師身上。在本文中,Brian 對 Java 文檔編制實踐的當前狀態進行了嚴厲的批評,同時提供了一些關于如何編寫更有用的 Javadoc 的準則。
  對于大多數 Java 類庫來說,Javadoc 是唯一的文檔。而且,除了商業軟件組件之外,許多 Java 類不會用到 Javadoc。雖然 Javadoc 作為 API 參考工具很出色,但對于了解類庫是如何組織的和應該如何使用它來說,它卻是一種十分差勁的方法。并且即便用了 Javadoc,它通常只包含有關方法完成了什么的最基本信息,而忽略了諸如錯誤處理、參數及返回值的作用域和范圍、線程安全、鎖定行為、前置條件、后置條件、不變條件或副作用之類的重要特性。
  向 Javadoc 學習
  對于包括大多數開放源碼包和大多數內部開發的組件在內的許多Java工具而言,實際情況是:包括Javadoc在內,幾乎所有類庫或組件都不具有有效的文檔。這就意味著開發人員要從Javadoc學習使用工具,而且我們應該考慮根據這一現實組織我們的Javadoc。我經常開玩笑說:現在,Java程序員需要具備的最重要的技能之一是熟練地使用Google和Javadoc來對那些文檔編制得十分糟糕的 API 進行“逆向工程”。這可能是真的,但卻并不十分好笑。
  大多數 Java 包都有某種“根”對象,它是在得到該工具內的任何其它對象之前,必須創建的第一個對象。在 JNDI中,該根對象是Context,而在JMS和JDBC中,它是Connection。假如有人告訴您JDBC中的基礎對象是 Connection,以及如何獲得這一對象,那么接著您很可能會從 Javadoc 中通過仔細察看 Javadoc 中可用的方法列表找到如何創建并執行 Statement,以及如何迭代生成的 ResultSet。但您如何知道獲得 Connection 是您的第一步呢?Javadoc 在包內按照字母順序組織類,在類中按照字母順序組織方法。遺憾的是,Javadoc 中沒有神奇的“從這里開始(Start Here)”記號把讀者帶到瀏覽 API 的邏輯開始位置。
  包描述
  最接近“從這里開始”記號的是包描述,但它卻很少得到有效的使用。假如將文件 package.Html 與源代碼一起放在一個包中,那么標準的 doclet 會將已生成的 package-summary.html 文件中的內容連同類列表一起放在該包內。遺憾的是,生成我們都很熟悉的 HTML 文檔的標準 doclet 卻無法使包描述易于找到。假如您單擊左上窗格中的某個包,那么這會在左下窗格中產生方法列表,但并不會在主窗格中產生包的摘要 — 必須單擊左下窗格中的包名稱來查看摘要。但不要緊,究竟大多數包并沒有包描述。
  包文檔是一個放置“從這里開始”文檔的極好的地方,這一文檔用來概述包做什么、主要摘要是什么以及從何處開始瀏覽包的 Javadoc。
  類文檔
  除包文檔之外,特定于類的文檔對于幫助用戶徹底了解新工具也能起到重要的作用。類文檔當然應該包括此特定類做什么的描述,但還應該描述該類與包中的其它類如何關聯,非凡是要標識任何與該類相關的工廠類。例如,JDBC 中的 Statement 類文檔應該說明:Statement 是通過 Connection 類的 createStatement() 方法獲得的。這樣,假如一個新用戶偶然進入 Statement 頁面,那么他會發現首先他需要獲得 Connection。對每個類都應用這一約定的包會迅速為用戶指出根對象,用戶因而能夠得心應手。
  因為 Javadoc 是圍繞對特定類進行文檔編制而設計的,因此在 Javadoc 中通常沒有明顯的位置來放置演示幾個相關類一起使用的示例代碼。但由于一味地側重于特定類或方法的文檔編制,我們失去了討論如何組合包中內容的機會。假如對于根對象,在包文檔或類文檔中有一個演示一些基本用法的簡單代碼示例,則對于許多用戶來說,將是非常有用的。例如,Connection 類文檔可以有一個簡單示例,該示例獲取連接、創建預編譯語句、執行該語句并迭代結果集。從技術上說,這可能不屬于 Connection 頁面,因為它還描述了包中的其它類。然而,尤其是當結合了上面那種引用當前類所依靠的類的技術時,用戶才能非常迅速地找到獲取簡單的實用示例的途徑,不管類的組織方式如何。
  糟糕的文檔=糟糕的代碼
  對于大多數 Java 類庫來說,除了那些作為打包組件出售的商業產品之外,要么沒有 Javadoc,要么非常糟糕。由于存在的事實是對于大多數包來說,Javadoc 是我們擁有的唯一文檔,這基本上意味著使我們自己陷入了這樣的困境:除了作者之外,其他人沒法使用我們的大部分代碼——假如不付出重大的“考古”一樣的努力,至少會這樣。
  由于文檔現在是代碼的一部分,因此我認為是軟件工程社區形成一個共識的時候了,這就是,即使代碼很出色,假如文檔很糟糕,也應該被認為是差勁的代碼,因為不能有效地重用。單元測試不久前還聲譽不佳,只是到了最近它才受到了許多工程師的青睞,就和它一樣,為了改善我們生產的軟件的可靠性和可重用性,API 文檔也必須成為開發過程的一個集成部分。
  編寫Javadoc就是某種形式的代碼檢查
  編寫合理的Javadoc也會產生副作用,它迫使我們進行某種形式的代碼檢查,來研究類的體系結構和它們之間的關系。假如單個包、類或方法很難編制文檔,那么或許可以嘗試同時對多個包、類或方法進行文檔編制,這應該是個提示,即可能它需要重新設計。
  文檔的自我檢查方面使得某些方面更加重要,即在開發過程中盡早編寫Javadoc,然后隨著代碼的不斷開發,定期對其進行檢查,而不是僅僅等待代碼完成再編寫文檔(假如有剩余時間的話)。后一種策略十分常見,它將編寫文檔拖到項目最后,而那時時間安排十分緊張,開發人員的壓力也很大。結果再常見不過了,就是那種一文不值的文檔,它只提供了“文檔假象”。用戶真正需要的是了解該類的工作原理,而該文檔卻沒有提供任何這樣的信息。
  清單 1. 典型的一文不值的 Javadoc
  
  /**
   * RePResents a command history
   */
   public class CommandHistory {
   /**
   * Get the command history for a given user
   */
   public static CommandHistory getCommandHistory(String user) {
   . . .
   }
   }
  什么是好的文檔
  
  
  那么好的文檔包括哪些內容呢?
  
  上面描述的組織技術(在類描述中引用相關類或工廠類,也包括了包概述和代碼樣本)是形成優秀文檔的好開端。它有助于新用戶使用 Javadoc 了解新工具。
  
  但體系結構的概述只完成了任務的一半。另一半則是具體地解釋方法做什么和不做什么、在什么條件下運行以及它們如何處理錯誤條件。大多數 Javadoc 都沒有完全提供所需的信息,即便是那些充分描述了方法在期望情況下的行為的 Javadoc 也是如此,這些缺少的信息包括:
  
  · 方法如何處理錯誤條件或不合要求的輸入
  
  · 如何將錯誤條件傳回給調用者
  
  · 可能會拋出哪個特定異常的子類
  
  · 哪些值對于輸入是有效的
  
  · 類不變條件、方法前置條件或方法后置條件
  
  · 副作用
  
  · 在方法之間是否有重要聯接
  
  · 類如何處理多個線程同時訪問一個實例的情況。
  
  Javadoc 約定提供了 @param 標記,它讓我們除了能夠對參數的名稱和類型編制文檔之外,還可以對其意義編制文檔。然而,并不是所有的方法都能很好地接受參數的任何值。例如,雖然可以合法地向任何獲取對象參數的方法傳遞空值(null)而不違反類型檢查規則,但并不是所有的方法都能在傳入空值時正常工作。Javadoc 應該顯式地描述有效的參數范圍,假如它希望某個參數非 null,那么它應該這樣描述,而假如它期望參數值在某個范圍內,例如某種長度的字符串或大于 0 的整數,那么它也應該那樣描述。并非所有方法都仔細檢查其參數的有效性;不進行有效性檢查也沒有編制關于可接受的輸入范圍的文檔,這二者的結合為災難埋下了隱患。
  
  返回代碼
  
  Javadoc 使得描述返回值的意義變得很輕易,但正如方法參數一樣,@return 標記應該包括對可能返回的值范圍的具體描述。對于對象取值的返回類型而言,它會返回空值嗎?對于整數取值的返回類型而言,結果會限制在一個已知值或非負值的集合上嗎?任何返回代碼都有非凡意義嗎,例如從 java.io.InputStream.read() 返回 -1 表示文件結束符?返回代碼會被用來表示例如假如無法找到表項則返回空值那樣的錯誤條件嗎?
  
  異常
  
  標準 doclet 復制方法的 throws 子句,但 Javadoc @throws 標記應該更為具體。例如,NoSUChFileException 是 IOException 的子類,但 java.io 中的大多數方法卻只被聲明為拋出 IOException。然而,方法可能獨立于其它 IOException 而拋出 NoSuchFileException,這是調用者要了解的很有用的事實 — 它應該被包括在 Javadoc 中。還應該指出拋出各種異常類的實際錯誤條件,以便調用者知道在給定異常被拋出時該采取什么糾正措施。應該用 @throws 標記對方法可能拋出的每個經檢查的或未經檢查的異常編制文檔,并對引發拋出異常的條件編制文檔。
  
  前置條件、后置條件和不變條件
  
  當然,您應該對方法對對象狀態的影響編制文檔。但您可能需要編制得更具體一些,描述方法的前置條件、后置條件和類不變條件。前置條件是在調用方法前對對象狀態的約束;例如,調用 Iterator.next() 的前置條件是 hasMore() 為真。后置條件是方法調用完成后對對象狀態的約束,例如在調用 add() 之后 List 不能為空。不變條件是對對象狀態的一種約束,它保證該狀態始終

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美一区三区三区高中清蜜桃| 国产精品久久久久久av福利软件| 国产成人综合精品在线| 国产成人精品亚洲精品| 久久艳片www.17c.com| 日韩av在线高清| 国内精品国产三级国产在线专| 美日韩丰满少妇在线观看| 亚洲一区二区三区视频播放| 成人网页在线免费观看| 欧美激情一区二区三区久久久| 国产日产欧美精品| 伊人久久大香线蕉av一区二区| 久久久亚洲成人| 久久久国产视频91| 亚洲色图综合网| 91精品久久久久久久久久久久久| 日韩大胆人体377p| 欧美大片在线看免费观看| 国产精品日日做人人爱| 亚洲精品小视频在线观看| 国产区亚洲区欧美区| 亚洲色无码播放| 成人网在线免费看| 久久久久久91| 日韩免费在线观看视频| 国产视频久久久久| 国产精品视频免费在线| 亚洲午夜激情免费视频| 亚洲a一级视频| 亚洲第一偷拍网| 欧洲成人午夜免费大片| 久久大大胆人体| 国产精品午夜国产小视频| 久久综合久久美利坚合众国| 久99久在线视频| 伊人久久久久久久久久久久久| 亚洲一二在线观看| 日韩中文在线中文网三级| 久久久久久成人| 91系列在线观看| 日韩高清欧美高清| 成人黄色av网| 国产精品69精品一区二区三区| 亚洲一区二区三区四区在线播放| 日日狠狠久久偷偷四色综合免费| 亚洲97在线观看| 欧美性xxxxhd| 国产精品亚洲第一区| 国语自产偷拍精品视频偷| 国产精品久久久久久久久男| 国产精品日韩欧美综合| 国产+人+亚洲| 亚洲精品国产成人| 欧美老少配视频| 欧美电影免费观看电视剧大全| 日本中文字幕不卡免费| 超碰精品一区二区三区乱码| 影音先锋欧美在线资源| 日本精品性网站在线观看| 成人福利网站在线观看11| 一夜七次郎国产精品亚洲| 欧美亚洲在线播放| 一本色道久久综合亚洲精品小说| 日本aⅴ大伊香蕉精品视频| 国产成人精品在线播放| 欧美成人在线免费视频| 欧美成人午夜免费视在线看片| 亚洲tv在线观看| 久久精品国产成人精品| 动漫精品一区二区| 日本人成精品视频在线| 上原亚衣av一区二区三区| 亚洲精品91美女久久久久久久| 亚洲另类xxxx| 久久理论片午夜琪琪电影网| 久久全球大尺度高清视频| 中文字幕亚洲一区二区三区| 久久久国产精品x99av| 亚洲2020天天堂在线观看| 日韩www在线| 亚洲电影免费观看高清完整版在线| 日韩在线精品视频| 久久人人97超碰精品888| 美女av一区二区| 欧美精品久久久久久久久| 欧美精品在线看| 久久精品国产一区二区电影| 欧美激情视频一区| 日韩免费在线看| 成人免费xxxxx在线观看| 亚洲欧美制服另类日韩| 欧美高清videos高潮hd| 欧美性生活大片免费观看网址| 亚洲人成在线电影| 欧美精品做受xxx性少妇| 成人在线播放av| 国语自产精品视频在线看抢先版图片| 欧美日韩国产在线| 国产视频精品va久久久久久| 日韩av成人在线| 在线日韩中文字幕| 91九色视频导航| 欧美黄网免费在线观看| 欧美日韩一区二区在线| 日韩欧中文字幕| 欧美国产激情18| 色香阁99久久精品久久久| 91在线免费网站| 亚洲国产精品系列| 中国人与牲禽动交精品| 91久久综合亚洲鲁鲁五月天| 国产精品久久久久久久7电影| 色999日韩欧美国产| 91免费看片网站| 在线免费观看羞羞视频一区二区| 欧美日韩一二三四五区| 欧美激情xxxx性bbbb| 久久久欧美一区二区| 成人在线精品视频| 亚洲美女性生活视频| 成人国产精品久久久久久亚洲| 亚洲最大在线视频| 欧美一区深夜视频| 成人xxxx视频| 伊人久久久久久久久久久久久| 日韩av在线导航| www.日韩不卡电影av| 欧美精品videofree1080p| 亚洲综合自拍一区| 国产午夜精品美女视频明星a级| 亚洲欧美三级在线| 欧美在线免费看| 日韩a**中文字幕| 亚洲乱码一区av黑人高潮| 国产精品久久久久久久久久新婚| 久久久人成影片一区二区三区| 日本欧美一级片| 亚洲欧美日韩国产成人| 亚洲精品在线91| 欧美亚洲第一页| 亚洲精品国产综合久久| 91在线高清免费观看| 国产精品视频成人| 国产成人拍精品视频午夜网站| 国产伊人精品在线| 午夜精品久久久久久99热软件| 亚洲免费av片| 亚洲欧美在线免费观看| 日韩成人在线视频观看| 亚洲精品国产美女| 欧美激情综合色综合啪啪五月| 国产精品99导航| 欧美大片大片在线播放| www.久久久久久.com| 中文字幕日韩精品在线观看| 91精品久久久久久综合乱菊| 国产免费成人av| 欧美二区乱c黑人| 欧美最猛性xxxxx亚洲精品| 日韩精品在线看| 国产日韩在线播放| 久久精品国产久精国产思思| 久久九九亚洲综合|