欧美色欧美亚洲高清在线观看,国产特黄特色a级在线视频,国产一区视频一区欧美,亚洲成a 人在线观看中文

  1. <ul id="fwlom"></ul>

    <object id="fwlom"></object>

    <span id="fwlom"></span><dfn id="fwlom"></dfn>

      <object id="fwlom"></object>

      有效檢查Java代碼的三個(gè)工具

      時(shí)間:2019-05-12 11:22:16下載本文作者:會(huì)員上傳
      簡(jiǎn)介:寫(xiě)寫(xiě)幫文庫(kù)小編為你整理了多篇相關(guān)的《有效檢查Java代碼的三個(gè)工具》,但愿對(duì)你工作學(xué)習(xí)有幫助,當(dāng)然你在寫(xiě)寫(xiě)幫文庫(kù)還可以找到更多《有效檢查Java代碼的三個(gè)工具》。

      第一篇:有效檢查Java代碼的三個(gè)工具

      有效檢查Java代碼的三個(gè)工具

      Java項(xiàng)目最枯燥的一部分,也是程序員總是避而不談的一部分,就是檢查代碼。為了區(qū)塊括號(hào)、代碼縮進(jìn)、Javadoc注釋以及命名約定而檢查其他人的上千行代碼的確是一件痛苦的事。更糟糕的是,通常代碼的檢查還受限于緊迫的項(xiàng)目進(jìn)度。沒(méi)有足夠的時(shí)間對(duì)代碼的細(xì)節(jié)進(jìn)行評(píng)估,因此代碼檢查經(jīng)常變成了對(duì)代碼的美化練習(xí)。不管檢查者有多么好的意圖,優(yōu)化和邏輯檢查都退居次席。

      Java代碼分析器減輕了這樣的痛苦

      在面對(duì)這種情況的時(shí)候,Java代碼分析器正是對(duì)癥良藥。這些工具盡可能地將代碼檢查過(guò)程自動(dòng)化。留給人工來(lái)做的就只有檢查類(lèi)的缺陷以及核心邏輯并確定可能的優(yōu)化方法。優(yōu)化(去除不必要的實(shí)例化對(duì)象、檢查數(shù)據(jù)庫(kù)連接是否合理、確保數(shù)據(jù)在可能的情況下被緩存)對(duì)于任何代碼通常會(huì)帶來(lái)性能上的極大改進(jìn)。

      最近我接觸了各種代碼分析器。我覺(jué)得一個(gè)基本的最重要的功能是與常用IDE(如NetBeans、Eclipse、jEdit以及JDeveloper)的集成。有一些代碼檢查工具在查找錯(cuò)誤方面很有效,但是它們需要你根據(jù)給出的錯(cuò)誤行的行號(hào)手工來(lái)追蹤錯(cuò)誤。這樣的工具使用起來(lái)太累人了。與IDE環(huán)境集成了的工具可以大大簡(jiǎn)化這個(gè)過(guò)程,因?yàn)榇a檢查的結(jié)果是由所使用的IDE顯示的。你只需在錯(cuò)誤上雙擊就可以在Java編輯器中到達(dá)錯(cuò)誤代碼所在的行

      我的試用心得

      在我試用過(guò)的工具中,我發(fā)現(xiàn)其中三個(gè)工具十分強(qiáng)大并合乎與IDE集成的標(biāo)準(zhǔn),它們是: PMD、Checkstyle 和 Jalopy。

      PMD和Checkstyle

      根據(jù)PMD的文檔,它會(huì)對(duì)代碼中的如下部分進(jìn)行檢查:

      未使用的本地變量

      空的catch塊

      未使用參數(shù)

      空if語(yǔ)句

      重復(fù)的import語(yǔ)句

      未使用的私有方法

      可能是Singletons的類(lèi)

      短/長(zhǎng)變量及方法名字

      Checkstyle檢查如下部分:

      Javadoc注釋

      命名約定

      標(biāo)題

      Import語(yǔ)句

      體積大小

      空白

      修飾符

      混合檢查(包活一些有用的比如非必須的System.out和printstackTrace)

      它們的作用

      不像PMD,Checkstyle能夠檢查Javadoc注釋?zhuān)坏荘MD提供了一項(xiàng)叫作CPD的很有用的功能,它檢查代碼的拷貝粘貼部分。我使用PMD找到的最頻繁的錯(cuò)誤是未使用的import語(yǔ)句,未使用的私有變量以及意外重復(fù)拼寫(xiě)。Checkstyle可以發(fā)現(xiàn)更多的錯(cuò)誤。包括漏掉的Javadoc注釋?zhuān)^(guò)80個(gè)字符的行、不合約定的變量名、用tab來(lái)代替空格等等。兩個(gè)工具都允許創(chuàng)建自定義的規(guī)則。

      如果想在你的組織中使用它們中的一個(gè),Checkstyle似乎更好一些:它檢查公司編碼約定的大多數(shù)項(xiàng)目。如果增強(qiáng)代碼質(zhì)量是主要目標(biāo),那PMD是一個(gè)好的選擇。但是如果你想要更多的功能并真正使用工具來(lái)修改代碼,應(yīng)該試試Jalopy。

      Jalopy

      Jalopy是一個(gè)易于配置的源代碼格式程序,它能檢測(cè)并修補(bǔ)Java代碼中大量的習(xí)慣性缺陷。Jalopy更像一個(gè)代碼整理器而不是檢查器。Jalopy的插件現(xiàn)在已經(jīng)支持大多數(shù)IDE,而且多數(shù)是無(wú)縫集成。我發(fā)現(xiàn)Jalopy特別強(qiáng)大,能夠干許多很酷的事情。例如,它可以修改代碼縮進(jìn)、對(duì)齊括號(hào)、使行寬符合某個(gè)字符長(zhǎng)度、插入相關(guān)的Javadoc注釋以及對(duì)import語(yǔ)句排序。Jalopy最好的地方是超級(jí)自定義功能。一個(gè)簡(jiǎn)單的用戶(hù)界面就可以讓你選擇Jalopy的所有功能的開(kāi)關(guān),不需要XML配置文件。

      不要浪費(fèi)資源

      我建議大家使用這些工具來(lái)代替那些費(fèi)時(shí)費(fèi)力卻收效甚微的人工代碼檢查工作。一旦使用這些工具將代碼檢查變成了一個(gè)相對(duì)輕松的任務(wù),你就可以把代碼檢查作為一項(xiàng)普通工作而不是在項(xiàng)目結(jié)尾被進(jìn)度逼得一團(tuán)糟時(shí)做的事情。這些工具也提供了與Apache Ant的集成,因此你可以每天運(yùn)行這些代碼檢查器,在編譯或執(zhí)行單元測(cè)試它們也能工作得很好??刂坪媚愕拇a,并交付那些你真的認(rèn)為是高質(zhì)量的東西。

      第二篇:代碼檢查

      代碼檢查

      摘要:代碼檢查是白盒測(cè)試的一種靜態(tài)測(cè)試方法,是眾多軟件測(cè)試方法中發(fā)現(xiàn)軟件缺陷最有效的方法之一。本文結(jié)合國(guó)內(nèi)外學(xué)者在相關(guān)領(lǐng)域的研究情況,介紹代碼檢查相關(guān)的基本概念、過(guò)程和分析方法。

      關(guān)鍵字:白盒測(cè)試,代碼檢查,靜態(tài)分析,檢查規(guī)則

      一、引言

      按照測(cè)試時(shí)源代碼是否可見(jiàn),軟件測(cè)試可以分為白盒測(cè)試和黑盒測(cè)試兩類(lèi)。

      白盒測(cè)試(結(jié)構(gòu)測(cè)試),即邏輯驅(qū)動(dòng)的測(cè)試,是在了解程序內(nèi)部結(jié)構(gòu)的基礎(chǔ)上,對(duì)程序的邏輯結(jié)構(gòu)進(jìn)行檢查,從中獲取測(cè)試數(shù)據(jù)。白盒測(cè)試關(guān)注的是測(cè)試用例執(zhí)行的程度或覆蓋程序邏輯結(jié)構(gòu)的程度。白盒測(cè)試一般只應(yīng)用于軟件開(kāi)發(fā)階段。

      白盒測(cè)試,又可按照是否需要運(yùn)行程序,進(jìn)一步細(xì)分為了靜態(tài)測(cè)試和動(dòng)態(tài)測(cè)試兩種。通常情況下是按照先靜態(tài)后動(dòng)態(tài)測(cè)試順序來(lái)實(shí)施。其中,靜態(tài)測(cè)試包括代碼檢查、靜態(tài)結(jié)構(gòu)分析、代碼質(zhì)量度量等測(cè)試內(nèi)容。靜態(tài)測(cè)試既可以由人工進(jìn)行,充分發(fā)揮人的邏輯思維優(yōu)勢(shì),也可以借助軟件工具自動(dòng)進(jìn)行。

      代碼檢查是一種對(duì)程序代碼進(jìn)行靜態(tài)檢查。傳統(tǒng)的代碼檢查是通過(guò)人工閱讀代碼的方式,檢查軟件設(shè)計(jì)的正確性;用人腦模擬程序在計(jì)算機(jī)中的運(yùn)行,仔細(xì)推敲、校驗(yàn)和核實(shí)程序每一步的執(zhí)行結(jié)果,進(jìn)而判斷其執(zhí)行邏輯、控制模型、算法和使用參數(shù)與數(shù)據(jù)的正確性。

      在實(shí)踐中,代碼檢查比動(dòng)態(tài)測(cè)試更有效率,能找到更多的缺陷,通常能發(fā)現(xiàn)30%~70%的邏輯設(shè)計(jì)和編碼缺陷。代碼檢查非常耗費(fèi)時(shí)間,而且需要專(zhuān)業(yè)知識(shí)和經(jīng)驗(yàn)的積累。代碼檢查定位在編譯之后和動(dòng)態(tài)測(cè)試之前進(jìn)行,在檢查前,應(yīng)準(zhǔn)備好需求描述文檔、程序設(shè)計(jì)文檔、程序的源代碼清單、代碼編碼標(biāo)準(zhǔn)和代碼缺陷檢查表等。

      代碼檢查可以發(fā)現(xiàn)的軟件問(wèn)題包括:聲明或引用錯(cuò)誤、函數(shù)/方法參數(shù)錯(cuò)誤、語(yǔ)句不可達(dá)錯(cuò)誤、數(shù)組越界錯(cuò)誤、控制流錯(cuò)誤、界面錯(cuò)誤和輸入/輸出錯(cuò)誤等。

      1、代碼檢查

      代碼檢查包括桌面檢查、代碼走查和代碼審查等方式,主要檢查代碼和設(shè)計(jì)的一致性,代碼對(duì)標(biāo)準(zhǔn)地遵循、可讀性,代碼邏輯表達(dá)的正確性,代碼結(jié)構(gòu)的合理性等方面;發(fā)現(xiàn)違背程序編寫(xiě)標(biāo)準(zhǔn)的問(wèn)題,程序中不安全、不明確和模糊的部分,找出程序中不可移植部分、違背程序編程風(fēng)格的問(wèn)題,包括變量檢查、命名和類(lèi)型檢查、程序邏輯檢查、程序語(yǔ)法檢查和程序結(jié)構(gòu)檢查等內(nèi)容。下面對(duì)代碼檢查的三種具體方式進(jìn)行介紹。

      桌面檢查

      是一種傳統(tǒng)的檢查方法,由程序員檢查自己編寫(xiě)的程序。程序員在程序通過(guò)編譯之后對(duì)源代碼代碼進(jìn)行分析、檢驗(yàn),并補(bǔ)充相關(guān)的文檔,目的是發(fā)現(xiàn)程序中的錯(cuò)誤。

      代碼走查

      代碼走查就是針對(duì)代碼,在假想的輸入情況下,逐行的瀏覽代碼,走查代碼中潛在的缺陷并記錄結(jié)果的過(guò)程。

      代碼走查以小組會(huì)議方式進(jìn)行,每小組3-5人。與代碼審查不同的是,走查要求與會(huì)者扮演計(jì)算機(jī)的角色讓測(cè)試用例沿被測(cè)程序的邏輯運(yùn)行,是在模擬動(dòng)態(tài)測(cè)試;而代碼審查更多的是靜態(tài)測(cè)試。

      代碼審查

      代碼審查是由一組人通過(guò)閱讀、討論和爭(zhēng)議對(duì)程序進(jìn)行靜態(tài)分析的過(guò)程,以小組會(huì)的方式進(jìn)行。

      審查小組一般由若干程序員(包括程序代碼的設(shè)計(jì)者)和代碼檢查人員組成。會(huì)前把設(shè)計(jì)規(guī)格說(shuō)明書(shū)、控制流程圖、程序文本以及要求、規(guī)范、錯(cuò)誤檢查清單交給與會(huì)者,開(kāi)會(huì)時(shí)程序作者朗讀解釋程序,其他人則集中精力,捕捉程序在結(jié)構(gòu)、功能、編碼風(fēng)格等方面的問(wèn)題。

      2、代碼檢查項(xiàng)

      代碼檢查項(xiàng)即檢查代碼時(shí),指定需要進(jìn)行檢查的內(nèi)容。具體如:檢查變量的交叉引用表;檢查標(biāo)號(hào)的交叉引用表;檢查子程序、宏、函數(shù);等價(jià)性檢查;標(biāo)準(zhǔn)檢查;風(fēng)格檢查;選擇、激活路徑;對(duì)照程序的規(guī)格說(shuō)明,詳細(xì)閱讀代碼,逐字逐句分析;補(bǔ)充文檔。

      檢查項(xiàng)可以作為依據(jù),用來(lái)編制代碼規(guī)則、規(guī)范和缺陷檢查表等。

      3、編碼規(guī)范

      編碼規(guī)范是程序編寫(xiě)過(guò)程中必須遵循的一套事先約定或者已經(jīng)制度化、標(biāo)準(zhǔn)化的規(guī)則集,一般會(huì)詳細(xì)的規(guī)定代碼的語(yǔ)法規(guī)則和語(yǔ)法格式。

      一個(gè)良好的編碼規(guī)范能夠帶來(lái)許多好處:改善代碼質(zhì)量;提高開(kāi)發(fā)進(jìn)度;增進(jìn)團(tuán)隊(duì)精神。對(duì)于軟件開(kāi)發(fā)而言,采用好的編程規(guī)范,雖然不能徹底杜絕糟糕的代碼產(chǎn)生。但對(duì)于代碼檢查和將來(lái)的代碼維護(hù),仍然是意義重大的。

      4、缺陷檢查表

      在進(jìn)行人工代碼檢查時(shí),使用代碼缺陷檢查表作為代碼檢查的參考依據(jù)。在軟件測(cè)試項(xiàng)目實(shí)踐中代碼缺陷檢查表又常被稱(chēng)作代碼檢查清單。

      代碼缺陷檢查表中一般包括開(kāi)發(fā)人員容易出錯(cuò)的地方和在以往的工作中遇到的典型錯(cuò)誤。對(duì)應(yīng)于不同的編程語(yǔ)言,代碼缺陷檢查表的具體內(nèi)容將會(huì)有所不同。例如:對(duì)于C/C++語(yǔ)言代碼缺陷檢查表內(nèi)容有以下幾部分:文件結(jié)構(gòu);文件的版式;命名規(guī)則;表達(dá)式與基本語(yǔ)句;常量;函數(shù)設(shè)計(jì);內(nèi)存管理;C++函數(shù)的高級(jí)特性;類(lèi)的構(gòu)造函數(shù)、析構(gòu)函數(shù)和賦值函數(shù);類(lèi)的高級(jí)特性;其他的常見(jiàn)問(wèn)題等。

      5、代碼檢查規(guī)則

      在代碼檢查中,需要依據(jù)被測(cè)軟件的特點(diǎn),選用適當(dāng)?shù)臉?biāo)準(zhǔn)與規(guī)范。在使用測(cè)試軟件進(jìn)行自動(dòng)化代碼檢查或輔助代碼檢查時(shí),測(cè)試工具需要內(nèi)置許多編碼規(guī)范。不同編程語(yǔ)言,對(duì)應(yīng)的檢查規(guī)范有所不同。針對(duì)與C/C++語(yǔ)言的規(guī)則有以下幾類(lèi)規(guī)則:通用規(guī)則、C++編碼規(guī)則、C編碼規(guī)則、Meyers-Klaus規(guī)則以及自定義規(guī)則。使用時(shí),需要根據(jù)編程語(yǔ)言和被測(cè)程序的特點(diǎn),選擇適當(dāng)?shù)囊?guī)則進(jìn)行檢查。

      6、靜態(tài)分析

      靜態(tài)分析是不執(zhí)行程序,而分析程序代碼的過(guò)程。源代碼被靜態(tài)分析器分析之后,得到的靜態(tài)分析結(jié)果,通常可以表示成一棵靜態(tài)語(yǔ)法樹(shù)。其中包含了被測(cè)項(xiàng)目源代碼的靜態(tài)結(jié)構(gòu)信息:基本代碼成分、程序結(jié)構(gòu)、語(yǔ)句結(jié)構(gòu)、類(lèi)型和模板等信息。

      程序代碼靜態(tài)分析的結(jié)果能夠給代碼檢查提供幫助。

      三、代碼檢查過(guò)程

      傳統(tǒng)的代碼檢查是一種靜態(tài)檢查程序的測(cè)試方法,通常以團(tuán)隊(duì)的形式來(lái)進(jìn)行。檢查團(tuán)隊(duì)由程序作者,一個(gè)負(fù)責(zé)人,一個(gè)記錄員以及一些檢查員組成。首先需要一系列的準(zhǔn)備工作,包括參與者的挑選和材料的準(zhǔn)備。然后是個(gè)人準(zhǔn)備階段,每個(gè)小組成員各自熟悉材料。個(gè)人準(zhǔn)備階段后,就是實(shí)際的檢查會(huì)議。在會(huì)議上,檢查小組在假想的輸入下,由程序作者帶領(lǐng),逐行的瀏覽代碼,評(píng)審代碼中潛在的缺陷。檢查小組根據(jù)發(fā)現(xiàn)缺陷的嚴(yán)重程度和類(lèi)型對(duì)其進(jìn)行分類(lèi),并將問(wèn)題記錄下來(lái)供作者修正。會(huì)議后是作者的返工,作者匯報(bào)每個(gè)缺陷,最后確認(rèn)每個(gè)缺陷已經(jīng)被陳述過(guò)了。圖 11為傳統(tǒng)的代碼檢查過(guò)程。

      圖 1 代碼檢查過(guò)程示意圖

      代碼檢查過(guò)程中的兩個(gè)重要階段“個(gè)人準(zhǔn)備”和“召開(kāi)會(huì)議”階段有以下注意事項(xiàng):

      1、“個(gè)人準(zhǔn)備”階段:

      會(huì)前準(zhǔn)備階段是檢查過(guò)程的一個(gè)關(guān)鍵階段,因?yàn)槿绻麢z查者沒(méi)有為檢查做好充分的準(zhǔn)備,檢查效果會(huì)大打折扣。如果有檢查人員沒(méi)有做好準(zhǔn)備,主審員可取消其代碼檢查資格,甚至取消這次檢查會(huì)議。

      檢查人員要熟悉檢查內(nèi)容的相關(guān)文檔,了解程序背景、設(shè)計(jì)思想和編程方法,在讀懂、“吃”透代碼的基礎(chǔ)上,查出盡可能多的錯(cuò)誤。

      2、“召開(kāi)會(huì)議”階段:

      參與會(huì)議的檢查者應(yīng)具有一定的專(zhuān)業(yè)技能和經(jīng)驗(yàn),缺乏經(jīng)驗(yàn)的檢查人員必然缺乏合適的領(lǐng)域知識(shí)來(lái)深入理解材料;

      參與會(huì)議的檢查者應(yīng)做充分的個(gè)人準(zhǔn)備,沒(méi)有做充分準(zhǔn)備的檢查人員不能在檢查會(huì)中做出實(shí)質(zhì)性的貢獻(xiàn);

      檢查會(huì)議的速度應(yīng)進(jìn)行控制,如果試圖在短時(shí)間內(nèi)處理太多的材料,檢查效果也會(huì)大打折扣?,F(xiàn)在較為常見(jiàn)的代碼檢查速度上的建議為:匯編代碼150行/小時(shí),C語(yǔ)言150行/小時(shí),而對(duì)于C++、Java這種面向?qū)ο笳Z(yǔ)言,代碼檢查速度可以提高到200-300行/小時(shí)。

      由此可見(jiàn),代碼檢查適合于采用工具輔助的特性有:文檔處理,個(gè)人準(zhǔn)備,會(huì)議支持,數(shù)據(jù)收集。

      文檔處理

      這是工具可支持的最明顯的領(lǐng)域。傳統(tǒng)的檢查要求分發(fā)每份文檔的復(fù)印件等,而將紙質(zhì)的文檔替換成計(jì)算機(jī)式的文檔,不只是簡(jiǎn)單的介質(zhì)變更,更是提供了一種契機(jī)——提高文檔的可用性和表示性的機(jī)遇。

      個(gè)人準(zhǔn)備

      首先,自動(dòng)的缺陷檢測(cè)可以用來(lái)發(fā)現(xiàn)簡(jiǎn)單的缺陷。如果簡(jiǎn)單問(wèn)題能被自動(dòng)發(fā)現(xiàn),檢查員就能專(zhuān)注于更加復(fù)雜/困難的缺陷,以及那些不能被自動(dòng)發(fā)現(xiàn)的、潛在的、可能帶來(lái)更大影響的問(wèn)題。另外,自動(dòng)化工具應(yīng)該對(duì)個(gè)人準(zhǔn)備階段提供更多的幫助。例如,檢查員可以利用檢查表以及其它支持文檔,并能很容易地交叉引用它們;還有些代碼輔助理解工具,可為檢查員理解程序、了解程序結(jié)構(gòu)提供幫助。? 會(huì)議支持

      一些成員由于某些原因,可能沒(méi)有花費(fèi)足夠的時(shí)間來(lái)進(jìn)行準(zhǔn)備,但他們?nèi)匀粎⒓訒?huì)議并試圖掩蓋他們的過(guò)失。項(xiàng)目管理人員可以使用計(jì)算機(jī)監(jiān)控的個(gè)人準(zhǔn)備時(shí)間信息,來(lái)剔除那些沒(méi)有做好個(gè)人準(zhǔn)備的成員,或者督促他們投入更多的努力。

      召開(kāi)會(huì)議時(shí),檢查員通常面對(duì)的是一堆枯燥的程序代碼,如果在代碼之外再結(jié)合一些圖、表等便于分析、理解代碼的信息,相信檢查會(huì)議可以進(jìn)行得更加有序和高效。

      數(shù)據(jù)收集

      代碼檢查一個(gè)重要的部分就是度量信息的收集,用來(lái)提供反饋以改進(jìn)檢查過(guò)程。度量信息包括會(huì)議時(shí)間、發(fā)現(xiàn)的缺陷、檢查花費(fèi)的總時(shí)間等。根據(jù)這些數(shù)據(jù),可以來(lái)評(píng)價(jià)每一次代碼審查的質(zhì)量,進(jìn)而給出關(guān)于代碼審查的改進(jìn)建議。

      通過(guò)對(duì)檢查過(guò)程的部分階段提供計(jì)算機(jī)支持,代碼檢查可以進(jìn)行得更加有效。使用計(jì)算機(jī)來(lái)支持檢查過(guò)程,可以提高效率,并增加檢查過(guò)程的嚴(yán)格性。

      四、代碼檢查歷史數(shù)據(jù)

      代碼檢查中的歷史數(shù)據(jù)本質(zhì)是軟件問(wèn)題(缺陷)。按照不同的代碼檢查角度,存在多種對(duì)缺陷分類(lèi)的方法。對(duì)過(guò)往發(fā)現(xiàn)的軟件問(wèn)題進(jìn)行分析,總結(jié)出今后對(duì)于類(lèi)似的代碼需要按照某種規(guī)則來(lái)加以檢查,這種的規(guī)則就是檢查清單上的一條清單項(xiàng),代碼檢查清單就是大量規(guī)則的集合。此外,由于軟件問(wèn)題總是以軟件問(wèn)題報(bào)告為載體形式出現(xiàn),因此軟件問(wèn)題報(bào)告也被通俗的理解為代碼檢查歷史數(shù)據(jù)。

      下面對(duì)缺陷分類(lèi)、代碼檢查清單和軟件問(wèn)題報(bào)告加以研究。

      1、缺陷分類(lèi)

      關(guān)于缺陷分類(lèi)存在以下幾種常見(jiàn)的劃分方式:

      1)按缺陷出現(xiàn)的區(qū)域分類(lèi)

      這種分類(lèi)方式是最常見(jiàn)的缺陷分類(lèi)方式。按照出現(xiàn)區(qū)域?qū)⒋a缺陷劃分為變量級(jí)、屬性級(jí)、函數(shù)/方法級(jí)和類(lèi)級(jí)缺陷。其中,變量級(jí)、屬性級(jí)和部分函數(shù)/方法級(jí)的缺陷,與傳統(tǒng)的面向過(guò)程編程中的缺陷分類(lèi)基本一致;而多數(shù)方法級(jí)缺陷和類(lèi)級(jí)缺陷,則是針對(duì)面向?qū)ο蠹夹g(shù)編程特點(diǎn)提出的。

      2)按檢測(cè)內(nèi)容分類(lèi)

      分為沖突、一致性問(wèn)題兩種。

      沖突對(duì)應(yīng)于文獻(xiàn)[1]中的基于確定性“信念”的判定,而一致性問(wèn)題則對(duì)應(yīng)于基于可能性“信念”的判定。

      3)按對(duì)代碼的危害分類(lèi)

      按照對(duì)代碼的危害,一般分為浪費(fèi)時(shí)間和空間;語(yǔ)義混淆;暴露封裝性,擴(kuò)大使用權(quán)限;程序一致性問(wèn)題;程序約束條件問(wèn)題和空指針問(wèn)題等。

      2、代碼檢查清單(Checklist)

      代碼檢查過(guò)程中,代碼檢查人員都會(huì)有一份代碼檢查清單。代碼檢查清單是一份為代碼檢查人員準(zhǔn)備的缺陷檢查表,檢查表中開(kāi)列所有可能與代碼有關(guān)的缺陷,并注明了檢查的內(nèi)容、缺陷類(lèi)型以及嚴(yán)重性。檢查清單是檢查代碼的依據(jù),代碼檢查人員根據(jù)它來(lái)發(fā)現(xiàn)并判斷問(wèn)題。代碼檢查清單中會(huì)逐條列出所有應(yīng)該檢查的缺陷種類(lèi),以及每條缺陷的各種特征,并且根據(jù)缺陷的嚴(yán)重程度和類(lèi)型對(duì)其進(jìn)行分類(lèi)。通常每一條缺陷的特征描述如下:

      1)缺陷描述:該缺陷的問(wèn)題描述、舉例說(shuō)明,以及相應(yīng)的正確形式;

      2)缺陷出現(xiàn)的區(qū)域:分別為表達(dá)式級(jí)、語(yǔ)句級(jí)、聲明級(jí)、模板缺陷、預(yù)處理缺陷、類(lèi)級(jí)缺陷以及性能缺陷。表達(dá)式級(jí)、語(yǔ)句級(jí)、聲明級(jí)以及預(yù)處理的缺陷,主要面向過(guò)程程序中的缺陷;模板缺陷、類(lèi)級(jí)缺陷,則是針對(duì)面向?qū)ο筌浖奶攸c(diǎn)提出的;代碼冗余等歸為性能缺陷;

      3)缺陷對(duì)代碼的危害:代碼中出現(xiàn)某種缺陷將會(huì)造成什么樣的影響。

      例如,檢查表中一條缺陷的特征描述如下:

      問(wèn)題描述:指針?biāo)竷?nèi)存釋放后沒(méi)有將指針賦為NULL。

      舉例說(shuō)明:

      char *p=(char *)malloc(100);strcpy(p, “hello”);free(p);//p所指的內(nèi)存被釋放,但是p所指的地址還是不變 …

      if(p!=NULL)//沒(méi)有起到防錯(cuò)的作用 { strcpy(p, “world”);//出錯(cuò) }

      正確形式:在釋放內(nèi)存的同時(shí)將指針置空。

      char *p=(char *)malloc(100);strcpy(p, “hello”);free(p);p=NULL;//增加指針置空語(yǔ)句

      if(p!=NULL){ strcpy(p, “world”);}

      出現(xiàn)區(qū)域:語(yǔ)句級(jí)。

      危害:指針被free釋放后其地址并不會(huì)自動(dòng)發(fā)生改變(非NULL),p成為了“野”指針,這種情況下再對(duì)p進(jìn)行操作,很容易造成程序崩潰,后果非常嚴(yán)重。而代碼檢查清單正是由若干條這樣的缺陷特征描述構(gòu)成的。

      3、軟件問(wèn)題報(bào)告(Software Problem Report)

      在軟件測(cè)試過(guò)程中,對(duì)于發(fā)現(xiàn)的每個(gè)軟件問(wèn)題(缺陷),都要進(jìn)行記錄該錯(cuò)誤的特征和再現(xiàn)步驟等信息,以便相關(guān)人員分析和處理軟件問(wèn)題。為了管理測(cè)試發(fā)現(xiàn)的軟件問(wèn)題,通常要采用軟件問(wèn)題報(bào)告數(shù)據(jù)庫(kù),將每一個(gè)發(fā)現(xiàn)的軟件問(wèn)題輸入到軟件問(wèn)題報(bào)告數(shù)據(jù)庫(kù)中,軟件問(wèn)題報(bào)告數(shù)據(jù)庫(kù)的每一條記錄稱(chēng)為一個(gè)軟件問(wèn)題報(bào)告。

      軟件問(wèn)題報(bào)告包括頭信息、簡(jiǎn)述、操作步驟和注釋。

      頭信息包括:被測(cè)試軟件名稱(chēng)、版本號(hào)、缺陷或錯(cuò)誤類(lèi)型、可重復(fù)性、測(cè)試平臺(tái)、平臺(tái)語(yǔ)言、缺陷或錯(cuò)誤范圍。并要求填寫(xiě)完整和準(zhǔn)確。

      簡(jiǎn)述是對(duì)缺陷或錯(cuò)誤特征的簡(jiǎn)單描述,可以使用短語(yǔ)或短句,要求簡(jiǎn)練和準(zhǔn)確。

      操作步驟是描述該缺陷或錯(cuò)誤出現(xiàn)的操作順序,要求完整、簡(jiǎn)潔和準(zhǔn)確。對(duì)命令、系統(tǒng)變量、選項(xiàng)要用大寫(xiě)字母,對(duì)控件名稱(chēng)等要加雙引號(hào)。

      注釋一般是對(duì)缺陷或錯(cuò)誤的附加描述,一般包括缺陷或錯(cuò)誤現(xiàn)象的圖像,包括其他建議或注釋文字。

      軟件問(wèn)題報(bào)告是軟件測(cè)試過(guò)程中最重要的文檔之一。它記錄了軟件問(wèn)題發(fā)生的環(huán)境,軟件問(wèn)題的再現(xiàn)步驟以及性質(zhì)的說(shuō)明,而且還可以跟蹤軟件問(wèn)題的處理過(guò)程和狀態(tài)。軟件問(wèn)題的處理進(jìn)程從一定角度反映了測(cè)試的進(jìn)程和被測(cè)軟件的質(zhì)量狀況及改善過(guò)程。

      五、代碼檢查規(guī)則管理的研究

      1、潛在的編碼規(guī)則和缺陷代碼模式

      潛在的編碼規(guī)則(Implicit Coding Rules)和缺陷代碼模式(Bug Code Pattern)是Tomoko MATSUMURA在文獻(xiàn)[3,4]中針對(duì)代碼檢查實(shí)踐,提出的兩個(gè)相關(guān)的概念。

      潛在的編碼規(guī)則

      潛在的編碼規(guī)則包含以下幾個(gè)特征:

      1)不同于在開(kāi)發(fā)啟動(dòng)時(shí)明確決定的“編碼規(guī)范”的規(guī)則,這些規(guī)則在長(zhǎng)期的測(cè)試/維護(hù)過(guò)程中是潛伏的,對(duì)這些規(guī)則的發(fā)現(xiàn)是不可預(yù)見(jiàn)的。

      2)這些規(guī)則很少在設(shè)計(jì)文檔或者特定的文檔中被清楚的描述。他們通常只存在于開(kāi)發(fā)人員、測(cè)試/維護(hù)人員的記憶中。換言之,是一種尚未系統(tǒng)化的經(jīng)驗(yàn)積累和總結(jié)的結(jié)果。

      3)不同于使用規(guī)范庫(kù)的公用規(guī)則。對(duì)于特定的軟件有其特定的規(guī)則,這也意味著對(duì)于不同的軟件有不同的潛在的編碼規(guī)則。

      4)由于違反潛在的編碼規(guī)則導(dǎo)致的缺陷通常情況下不是那么容易發(fā)現(xiàn)的。其中相當(dāng)多一部分只在特定的罕見(jiàn)的情況下發(fā)生,所以在早期要想發(fā)現(xiàn)這些問(wèn)題是很困難的。

      5)目前,還不存在好的工具或者檢查清單來(lái)發(fā)現(xiàn)違反潛在的編碼規(guī)則的代碼片段,通常的檢查工具(例如PC-Lint、Purify)和通用的檢查清單只能發(fā)現(xiàn)常見(jiàn)的問(wèn)題。

      6)為了減少違反潛在的編碼規(guī)則的現(xiàn)象的發(fā)生,而進(jìn)行重構(gòu)通常很困難。要重構(gòu)一個(gè)軟件,準(zhǔn)確理解代碼是非常必要的,然而,老的系統(tǒng)太復(fù)雜,并且沒(méi)有精確的文檔和了

      解系統(tǒng)的專(zhuān)業(yè)維護(hù)人員??傊貥?gòu)過(guò)期系統(tǒng)的代價(jià)很大,需要冒很大的風(fēng)險(xiǎn)。

      缺陷代碼模式:違反潛在的編碼規(guī)則的編碼模式。

      缺陷代碼模式不是肯定會(huì)導(dǎo)致缺陷的發(fā)生,一段符合缺陷代碼模式的代碼片段,并不意味著代碼片段一定就有缺陷,缺陷代碼模式只是疑似存在缺陷。另一方面,因?yàn)槿毕荽a模式是靜態(tài)的,沒(méi)有考慮到代碼片段之間的動(dòng)態(tài)關(guān)聯(lián)。需要代碼檢查人員或者維護(hù)人員把符合缺陷代碼模式的代碼片段提出來(lái),并判斷究竟是否存在缺陷。

      在軟件開(kāi)發(fā)過(guò)程中發(fā)現(xiàn)和建立缺陷代碼模式有三條主要途徑。其一:在進(jìn)行代碼檢查過(guò)程中,代碼檢查人員發(fā)現(xiàn)一個(gè)軟件問(wèn)題的同時(shí),根據(jù)對(duì)該問(wèn)題是否具備代表性和通用性等因素的考慮,確定是否建立一個(gè)缺陷代碼模式;其二:當(dāng)軟件失效或者發(fā)生問(wèn)題,檢查對(duì)應(yīng)的代碼部分,發(fā)現(xiàn)并確定是否有潛在的編碼規(guī)范與之相關(guān);其三:分析現(xiàn)存的代碼規(guī)范和積累的大量問(wèn)題報(bào)告,從中提煉出潛在的編碼規(guī)則。

      在文獻(xiàn)[3,4]中還給我們介紹了一個(gè)代碼缺陷檢測(cè)系統(tǒng)的大致工作流程,如2所示。

      圖2 缺陷檢測(cè)模型系統(tǒng)的代碼檢查流程參考圖

      2、C++代碼檢查規(guī)則類(lèi)型

      1)規(guī)則層次

      在代碼檢查工作中常??梢园l(fā)現(xiàn)這樣的現(xiàn)象:有些規(guī)則能在所有的項(xiàng)目中都能發(fā)現(xiàn)問(wèn)題,另一些規(guī)則所能發(fā)現(xiàn)的問(wèn)題只存在于某類(lèi)項(xiàng)目中。

      根據(jù)規(guī)則的這個(gè)特點(diǎn),如圖 33中所示,參考文獻(xiàn)[2]中將代碼檢查規(guī)則分為兩個(gè)層次:

      公共規(guī)則(General checks):用于檢查在大多數(shù)情況都有可能發(fā)生的缺陷。

      項(xiàng)目相關(guān)規(guī)則(Project specific checks):用于在項(xiàng)目中檢查可能的缺陷。

      圖 3 一個(gè)典型的代碼檢查規(guī)則清單節(jié)選圖

      在項(xiàng)目中積累了大量軟件問(wèn)題報(bào)告歷史數(shù)據(jù)的支持下,可以從中進(jìn)一步細(xì)化出與項(xiàng)目或開(kāi)發(fā)人員相關(guān)的檢查規(guī)則。

      在學(xué)習(xí)任何一種計(jì)算機(jī)編程語(yǔ)言時(shí),總是按照基本數(shù)據(jù)類(lèi)型->表達(dá)式->語(yǔ)句->復(fù)雜語(yǔ)句->函數(shù)->整個(gè)程序體(類(lèi))的順序逐步學(xué)習(xí)的。事實(shí)上軟件正是按照這樣的順序自下而上逐層組建起來(lái)的,代碼缺陷作為軟件編程寫(xiě)時(shí)的一種異常情況,毫不例外也是按照這樣層次的構(gòu)建而成。在實(shí)際測(cè)試項(xiàng)目的代碼檢查過(guò)程中,我們發(fā)現(xiàn)在每個(gè)層次上都有可能存在潛在代碼缺陷,要找到引起軟件問(wèn)題的根源,要求在盡可能低的層次上找到引發(fā)缺陷的代碼。正因如此,非常有必要在C++語(yǔ)法的每個(gè)層次上都建立相應(yīng)的檢查元規(guī)則。

      圖4為一個(gè)代碼檢查規(guī)則體系模型圖[2],圖中展示了在代碼檢查項(xiàng)目開(kāi)始前,通過(guò)逐級(jí)組合各種元規(guī)則和規(guī)則形成新的檢查規(guī)則,最后形成了初始的檢查清單。在項(xiàng)目實(shí)踐中,經(jīng)過(guò)對(duì)缺陷代碼模式的推導(dǎo),進(jìn)而得到擴(kuò)展的檢查清單。初始檢查清單和擴(kuò)展檢查清單本質(zhì)上并沒(méi)有什么區(qū)別,只是因?yàn)樾纬傻臅r(shí)間不同。

      圖4 代碼檢查規(guī)則體系模型圖

      在檢查代碼時(shí)我們有時(shí)會(huì)想要定義一個(gè)帶有否定意義的規(guī)則,如“在AA情況下如果沒(méi)有BB,則可能存在一個(gè)問(wèn)題”。這類(lèi)檢查規(guī)則采用自然語(yǔ)言描述比較容易,但是要用代碼實(shí)現(xiàn)起來(lái)往往并不簡(jiǎn)單,并且對(duì)這類(lèi)規(guī)則的定義和維護(hù)也比較麻煩。定義組合規(guī)則,是解決這類(lèi)問(wèn)題一種變通的方法。

      下面簡(jiǎn)單介紹一下定義組合規(guī)則的原理。如圖5中所示定義三個(gè)規(guī)則,“滿(mǎn)足情況AA”對(duì)應(yīng)規(guī)則R1,“滿(mǎn)足在AA情況下出現(xiàn)BB”對(duì)應(yīng)規(guī)則R2,將滿(mǎn)足R1但不滿(mǎn)足R2(即以!符號(hào)表示)組合則對(duì)應(yīng)規(guī)則R3-“在AA情況下如果沒(méi)有BB,則可能存在一個(gè)問(wèn)題”。

      圖5 組合規(guī)則示例圖

      根據(jù)前面討論,本文將代碼檢查的規(guī)則分類(lèi)設(shè)計(jì)如下:

      公共規(guī)則?

      定義針對(duì)函數(shù)體(含)以上層次的檢查規(guī)則,在這些層次上出現(xiàn)的缺陷問(wèn)題一般不容易精確到具體的代碼行。

      關(guān)鍵字規(guī)則?

      針對(duì)每個(gè)關(guān)鍵字定義的檢查規(guī)則。由于關(guān)鍵字是C++語(yǔ)法中一種最普通的元素,單獨(dú)使用關(guān)鍵字規(guī)則的意義不大,一般情況需要和語(yǔ)句、表達(dá)式規(guī)則或者復(fù)雜語(yǔ)句規(guī)則配合使用。

      語(yǔ)句/表達(dá)式規(guī)則?

      針對(duì)基本語(yǔ)句類(lèi)型或基本表達(dá)式定義的規(guī)則,滿(mǎn)足對(duì)應(yīng)結(jié)構(gòu)的表達(dá)式,則可認(rèn)為符合了相應(yīng)的表達(dá)式規(guī)則。語(yǔ)句/表達(dá)式規(guī)則中可以包含多個(gè)關(guān)鍵字,在同一語(yǔ)句/表達(dá)式規(guī)則中包含的關(guān)鍵字地位是平等的,與檢查的先后次序無(wú)關(guān)。

      復(fù)雜語(yǔ)句塊規(guī)則?

      針對(duì)條件、開(kāi)關(guān)選擇等多分支語(yǔ)句定義的規(guī)則,通常由關(guān)鍵字、語(yǔ)句/表達(dá)式進(jìn)行組合來(lái)定義復(fù)雜語(yǔ)句塊,并在定義時(shí)可以進(jìn)行嵌套,在定義復(fù)雜語(yǔ)句塊規(guī)則加入語(yǔ)句或表達(dá)式和復(fù)雜語(yǔ)句時(shí)需要考慮檢查的先后次序。

      高級(jí)組合規(guī)則?

      關(guān)鍵字規(guī)則、語(yǔ)句/表達(dá)式規(guī)則和復(fù)雜語(yǔ)句塊規(guī)則合稱(chēng)為普通規(guī)則。

      對(duì)于難以使用普通規(guī)則定義方式定義的復(fù)雜語(yǔ)義,需要定義高級(jí)組合規(guī)則。定義高級(jí)組合規(guī)則可以使用上面幾種規(guī)則作為基本單元,也可以嵌套使用其它組合規(guī)則。

      圖6為一個(gè)由下至上、由多個(gè)缺陷代碼模式組合形成的組合規(guī)則結(jié)構(gòu)圖。其中{}表示某條缺陷代碼模式對(duì)應(yīng)的規(guī)則。

      圖6 組合規(guī)則結(jié)構(gòu)圖

      六、代碼分析方法

      1、靜態(tài)分析

      靜態(tài)分析主要對(duì)源代碼進(jìn)行詞法分析、語(yǔ)法分析,提取被分析程序的靜態(tài)信息,所提取的靜態(tài)信息是代碼缺陷檢測(cè)的基礎(chǔ)。靜態(tài)分析結(jié)果主要包括三部分信息:

      程序定義信息:程序定義信息包含了程序中所有的定義和聲明信息,如類(lèi)定義、方法和數(shù)據(jù)成員的定義、方法內(nèi)局部變量的定義等。

      程序結(jié)構(gòu)信息:主要指方法內(nèi)的控制流信息和方法間的調(diào)用關(guān)系。靜態(tài)分析器分析程序的語(yǔ)句分支、分支間的嵌套關(guān)系和方法調(diào)用,記錄方法的控制流信息和調(diào)用信息,構(gòu)造語(yǔ)法樹(shù)。

      分支內(nèi)的變量操作:以方法控制流程中的分支為基本單元,記錄每一分支中各語(yǔ)句對(duì)各變量施加的操作和操作序列。

      2、數(shù)據(jù)流分析

      數(shù)據(jù)流分析也是一種靜態(tài)代碼檢查方法。它是在不通過(guò)計(jì)算機(jī)運(yùn)行被測(cè)程序的條件下,利用預(yù)先進(jìn)行靜態(tài)分析后獲取的信息,檢測(cè)對(duì)變量的賦值與使用操作中,是否存在不合理情況,即找出被測(cè)程序中是否存在變量在使用前未被賦值;變量在兩次賦值之間未被使用;一個(gè)變量在被賦值后是否未被使用等異常情況。

      數(shù)據(jù)流分析目前的主要用途大多局限在編譯器的實(shí)現(xiàn)和優(yōu)化技術(shù)方面,而在代碼檢查系統(tǒng)中實(shí)用的數(shù)據(jù)流分析技術(shù)并不多見(jiàn),主要集中在某幾種缺陷檢測(cè)上,如賦值引用異常檢測(cè)以及內(nèi)存錯(cuò)誤檢測(cè),使用方式主要是定義數(shù)據(jù)流操作的符號(hào),使用該符號(hào)系統(tǒng)構(gòu)造數(shù)據(jù)流表達(dá)式(由數(shù)據(jù)操作符號(hào)構(gòu)成的符號(hào)串),再分析該符號(hào)串來(lái)確定是否存在代碼缺陷。

      數(shù)據(jù)流分析包括以下兩個(gè)步驟:一是分析程序的所有邏輯路徑;二是對(duì)所有邏輯路徑上的所有變量,分析其所有操作序列,然后將得到的操作序列輸入自動(dòng)機(jī)進(jìn)行分析。因此數(shù)據(jù)流分析方法不可避免的存在以下缺點(diǎn):

      1)信息量多,上面所述的數(shù)據(jù)流分析方法是一種窮舉法。事實(shí)上一個(gè)變量在大部分路徑上存在問(wèn)題的幾率并不高,因此窮舉每個(gè)變量的所有操作序列不可避免的要分析很多正確的信息,而且信息量巨大;

      2)組合爆炸,當(dāng)程序復(fù)雜度增長(zhǎng)時(shí),該分析方法的復(fù)雜度呈幾何級(jí)數(shù)增長(zhǎng),并且當(dāng)這種組合是建立在對(duì)所有邏輯路徑、所有變量的窮舉基礎(chǔ)上時(shí),如果不能找到一個(gè)非常高效的算法,數(shù)據(jù)流分析方法將是一個(gè)非常低效的方法;

      3)實(shí)用性低,上述兩點(diǎn)導(dǎo)致的數(shù)據(jù)流分析的實(shí)用性降低。

      為緩解這些的缺點(diǎn),數(shù)據(jù)流分析過(guò)程有許多改進(jìn)方法,但實(shí)現(xiàn)都具有一定難度。本系統(tǒng)中數(shù)據(jù)流分析不是重點(diǎn),采取的策略是盡可能簡(jiǎn)化數(shù)據(jù)流分析的過(guò)程,或者在可能的情況下盡量避免數(shù)據(jù)流分析。

      第三篇:JAVA代碼注釋規(guī)范

      JAVA代碼注釋規(guī)范

      一、規(guī)范存在的意義

      1.好的注釋規(guī)范可以讓人一眼看明白這是干什么的,特別是對(duì)于我們這種行業(yè);共同合作完成一個(gè)項(xiàng)目需要分工明確,所以也需要有明了的注釋規(guī)范。

      2.正確的應(yīng)用注釋規(guī)范可以增加代碼的可讀性、理解性。3.好的代碼規(guī)范可以提高團(tuán)隊(duì)的開(kāi)發(fā)效率,從而節(jié)省時(shí)間。4.長(zhǎng)期的堅(jiān)持代碼規(guī)范可以讓程序員養(yǎng)成一個(gè)良好的習(xí)慣,甚至鍛煉出思維。

      二、命名規(guī)范

      1.一般概念

      1)盡量使用完整的英文描述。2)采用相對(duì)好理解的術(shù)語(yǔ)。

      3)采用駱駝命名的規(guī)范使名字增加可讀性。4)盡量少用縮寫(xiě)提高可讀性。5)避免名字過(guò)長(zhǎng)。

      6)避免使用類(lèi)似的名字。7)避免使用特殊符號(hào)。2.主要的運(yùn)用

      1)類(lèi)(class)的命名

      2)接口(interface)的命名 +方法(method)的命名 3)參數(shù)(param)的命名

      三、注釋規(guī)范

      1.一般概念

      1)注釋?xiě)?yīng)該增加代碼的清晰度 2)保持代碼的整潔

      3)在寫(xiě)代碼之前或同時(shí)注意寫(xiě)上注釋

      4)注釋出為什么做這件事,做這件事的結(jié)果 2.注釋那些部分

      1)java文件:版權(quán)信息、創(chuàng)建時(shí)間、創(chuàng)建人 2)類(lèi):目的、所完成功能、版權(quán)信息、創(chuàng)建人 3)方法:參數(shù)含義、返回值 4)屬性:字段描述

      5)接口:目的、創(chuàng)建人、版本號(hào)、創(chuàng)建時(shí)間

      四、代碼格式規(guī)范

      1.單行注釋://注釋內(nèi)容,一般與代碼后空4-8格,注釋必須對(duì)齊 2.塊狀注釋?zhuān)?*注釋內(nèi)容*/,一般是注釋從以/*開(kāi)始,以*/結(jié)束中的所有內(nèi)容。3.文檔注釋?zhuān)?**......*/所以注釋文 檔必須書(shū)寫(xiě)在類(lèi)、域、構(gòu)造函數(shù)、方法,以及字段(field)定義之前.注釋文檔由兩部分組成——描述、塊標(biāo)記。4.javadoc注釋標(biāo)簽

      @author 對(duì)類(lèi)的說(shuō)明 標(biāo)明開(kāi)發(fā)該類(lèi)模塊的作者

      @version 對(duì)類(lèi)的說(shuō)明 標(biāo)明該類(lèi)模塊的版本

      @see 對(duì)類(lèi)、屬性、方法的說(shuō)明 參考轉(zhuǎn)向,也就是相關(guān)主題

      @param 對(duì)方法的說(shuō)明 對(duì)方法中某參數(shù)的說(shuō)明

      @return 對(duì)方法的說(shuō)明 對(duì)方法返回值的說(shuō)明

      @exception 對(duì)方法的說(shuō)明 對(duì)方法可能拋出的異常進(jìn)行說(shuō)明

      五、java注釋具體實(shí)現(xiàn)

      1.源文件注釋

      /** *文件名 *創(chuàng)建人 *創(chuàng)建時(shí)間 *修改人 *描述 *版本號(hào) */ 2.類(lèi)注釋

      /** *對(duì)此類(lèi)的描述信息 *創(chuàng)建人 *版本號(hào) *創(chuàng)建時(shí)間 */ 3.方法的注釋

      /** *方法的用處 *該方法的參數(shù)列 *該方法返回的值 */ 4.屬性的注釋

      /** *字段的描述 */ 5.接口注釋

      /** *對(duì)此接口的描述 *創(chuàng)建人 *創(chuàng)建時(shí)間 *版本號(hào) */ 6.構(gòu)造方法注釋

      /** *描述該構(gòu)造方法的用處 *該構(gòu)造方法的參數(shù)列 *參數(shù)的類(lèi)型 */

      六、Jsp代碼格式規(guī)范

      1.多行注釋:,一般是注釋從以結(jié)束中的所有內(nèi)容。

      2.文本注釋:<%--內(nèi)容--%>,主要是對(duì)該頁(yè)面的一些描述,目的、創(chuàng)建人、創(chuàng)建時(shí)間、版本號(hào)、文件名、備注、修改人等.例如: <%---創(chuàng)建人-創(chuàng)建時(shí)間-版本號(hào)-文件名-備注-修改人--%> 3.偽劣標(biāo)簽注釋:<% java語(yǔ)句塊 %> 例如: <% JAVA代碼塊 %> 4.單行注釋?zhuān)?/注釋內(nèi)容,一般與代碼后空4-8格,注釋必須對(duì)齊

      七、JS代碼格式規(guī)范

      1.文本注釋:/** 注釋內(nèi)容 **/,主要是對(duì)該頁(yè)面的一些描述,目的、創(chuàng)建人、創(chuàng)建時(shí)間、版本號(hào)、文件名、備注、修改人等.也可以用于注釋代碼塊。例如: /** *創(chuàng)建人 *創(chuàng)建時(shí)間 *版本號(hào) *文件名 *備注 *修改人 **/

      2.文本注釋:/** 內(nèi)容 */ ,主要是對(duì)該頁(yè)面的一些描述,目的、創(chuàng)建人、創(chuàng)建時(shí)間、版本號(hào)、文件名、備注、修改人等.也可以用于注釋代碼塊。例如: /** *創(chuàng)建人 *創(chuàng)建時(shí)間 *版本號(hào) *文件名 *備注 *修改人 */ 3.單行注釋: //注釋內(nèi)容,一般與代碼后空4-8格,注釋必須對(duì)齊 4.多行注釋: /* 注釋內(nèi)容 */,一般是注釋從以/* 開(kāi)始,以*/結(jié)束中的所有內(nèi)容。

      八、JS注釋具體實(shí)現(xiàn) 1.文件注釋

      /** *對(duì)此文件的描述信息 *創(chuàng)建人 *版本號(hào) *創(chuàng)建時(shí)間 */ 2.方法的注釋

      /** *方法的用處 *該方法的參數(shù)列 *該方法返回的值 */ 3.模塊的注釋

      /** *模塊名稱(chēng)

      *模塊的用處

      */

      第四篇:java流實(shí)驗(yàn)內(nèi)容及代碼

      實(shí)驗(yàn)7 流(2學(xué)時(shí))

      一、實(shí)驗(yàn)?zāi)康?.熟悉流類(lèi)庫(kù)中各種常用流的使用方法。

      2.能夠使用流類(lèi)實(shí)現(xiàn)基本的文件讀寫(xiě)。

      二、實(shí)驗(yàn)內(nèi)容

      1.編寫(xiě)程序,在控制臺(tái)窗口提示輸入兩個(gè)整數(shù),然后接收這兩個(gè)整數(shù),并輸出它們的和。(要求:鍵盤(pán)輸入通過(guò)流封裝System.in獲取,不要使用Scanner類(lèi))

      import java.io.*;System.out.println(x);System.out.println(“y”);public class Num1 {n=in.readLine();public static void main(String []args)y=Integer.parseInt(n);{System.out.println(y);int x=0,y=0;}catch(IOException e)BufferedReader in=new BufferedReader({

      newSystem.out.println(“error”);InputStreamReader(System.in));}

      String n;int s=x+y;

      try{System.out.println(s);System.out.println(“x”);}

      n=in.readLine();}

      x=Integer.parseInt(n);

      2.設(shè)計(jì)學(xué)生類(lèi)Student,屬性:編號(hào)(整型);姓名(字符串),成績(jī)(整型)。編寫(xiě)一個(gè)程序:要求:(1)輸入3個(gè)學(xué)生的姓名和成績(jī),將其姓名和成績(jī)保存到data.txt中;(2)然后從該文件中讀取數(shù)據(jù),求得這三個(gè)學(xué)生的平均成績(jī)。

      import java.io.*;DataOutputStream dout = newDataOutputStream(public class num2 {newpublic static void main(String[]args)FileOutputStream(“D:data.txt”));{String n;

      BufferedReader in=new BufferedReader(for(int i=0;i<5;i++)new{

      InputStreamReader(System.in));n=in.readLine();

      int num=Integer.parseInt(n);try{String name=in.readLine();

      n=in.readLine();int grade=Integer.parseInt(n);dout.writeBytes(num+“rn”);dout.writeBytes(name+“rn”);dout.writeBytes(grade+“rn”);}dout.close();}catch(IOException e1){int num=Integer.parseInt(n);

      n=din.readLine();String name=n;n=din.readLine();int grade=Integer.parseInt(n);ave+=grade;}System.out.println(“平均成績(jī)”+ave*1.0/5);System.out.println(“文件寫(xiě)入失敗”);}try{DataInputStream din =new DataInputStream(new FileInputStream(“D:data.txt”));int ave=0;String n;for(int i=0;i<5;i++){n=din.readLine();

      三、實(shí)驗(yàn)要求

      完成程序設(shè)計(jì)并提交實(shí)驗(yàn)報(bào)告。

      在“);失敗”);} }

      }catch(FileNotFoundException e){System.out.println(“文件不存}catch(IOException e2){System.out.println(”文件讀取}

      第五篇:ATM自助取款機(jī)系統(tǒng)java代碼

      public void actionPerformed(ActionEvent e)

      //界面顯示控制 {

      String IC_Number=“";

      String password=”“;String IC_No=”“;

      z30.setVisible(false);

      float

      leftmoney=0;

      float

      moneys=0;

      float mon=0;

      float money1=0;

      float money2=0;

      if(true)

      {int No_50=0,No_100=0;

      String strin=”select NO_50,NO_100 from ATM ATM_ID='123456789'“;ResultSetrsSQLSelect=executeQuery(strin);try{ if(rsSQLSelect.next())

      {

      No_50=Integer.parseInt(rsSQLSelect.getString(”NO_50“));

      No_100=Integer.parseInt(rsSQLSelect.getString(”NO_100“));

      where

      }

      }

      catch(Exception er){System.out.println(”查詢(xún)ATM機(jī)信息出錯(cuò)!“);}

      if(No_50==0&&No_100==0)

      {

      z1.setVisible(false);

      t1.setText(”對(duì)不起,本ATM自動(dòng)取款機(jī)暫停服務(wù)!“);cl.show(c,”1“);

      }

      }

      cl.show(c,”1“);

      if(e.getSource()==z1)

      {

      t3.setText(”“);

      text1.setText(”“);cl.show(c,”2“);

      }

      if(e.getSource()==z4||e.getSource()==z6||e.getSource()==z11||e.getSource()==z16||e.getSource()==z18||e.getSource()==z22)

      { closeDBConnection();cl.show(c,”1“);

      }

      if(e.getSource()==z2)

      { closeDBConnection();System.exit(0);

      }

      if(e.getSource()==z3){ IC_Number=text1.getText().trim();

      if(getname(IC_Number))

      {z5.setVisible(true);

      pw1.setVisible(true);

      t4.setVisible(true);

      pw1.setText(”“);

      t5.setText(”“);cl.show(c,”3“);

      }

      else

      {

      t3.setText(”您輸入的卡號(hào)不存在,請(qǐng)重新輸入!“);cl.show(c,”2“);

      }

      }

      if(e.getSource()==z5){

      password=pw1.getText().trim();IC_Number=text1.getText().trim();

      if(!login(IC_Number,password))

      {

      t5.setText(”您輸入的密碼錯(cuò)誤,請(qǐng)重新輸入!“);

      pw1.setText(”“);

      n--;cl.show(c,”3“);

      }

      else

      {

      t5.setText(”“);cl.show(c,”4“);

      }

      if(n<0)

      {

      n=2;

      t5.setText(”您已經(jīng)三次輸入錯(cuò)誤密碼,謝謝您的使用,歡迎下次光臨!“);

      z5.setVisible(false);

      pw1.setVisible(false);

      t4.setVisible(false);cl.show(c,”3“);

      }

      }

      if(e.getSource()==z7)

      {

      t33.setText(”“);cl.show(c,”5“);

      }

      if(e.getSource()==z8)

      //余額查詢(xún) { DBAccess d=new DBAccess();

      String str3=”“;

      String stri=”“;IC_Number=text1.getText().trim();

      t29.setText(IC_Number);leftmoney=getmoney(IC_Number);

      t30.setText(Float.toString(leftmoney));stri=”select bank_name from IC,bank where IC.bank_NO=bank.bank_NO and IC_ID='“+IC_Number+”'“;ResultSetrsSQLSelect=d.executeQuery(stri);try{

      if(rsSQLSelect.next())

      {

      str3=rsSQLSelect.getString(”bank_name“);

      //d.commit();

      }

      } catch(Exception er){}

      t32.setText(str3);cl.show(c,”10“);

      }

      if(e.getSource()==z9)

      {

      t23.setText(”“);cl.show(c,”9“);

      }

      if(e.getSource()==z10)

      {

      t28.setText(”“);cl.show(c,”11“);

      }

      if(e.getSource()==z12){ DBAccess d=new DBAccess();IC_Number=text1.getText().trim();fetchmoney=Integer.parseInt(text2.getText());

      if(fetchmoney<=0)

      {

      t9.setText(”取款金額非法!請(qǐng)重新輸入!“);

      text2.setText(”“);cl.show(c,”6“);

      return;

      }

      if(fetchmoney>1000)

      {

      t9.setText(”每次交易金額最大為1000元!“);

      text2.setText(”“);cl.show(c,”6“);return;

      }

      if(fetchmoney%50!=0)

      {

      t9.setText(”取款金額只能為50的倍數(shù)!“);

      text2.setText(”“);cl.show(c,”6“);return;

      } leftmoney=getmoney(IC_Number);

      if(fetchmoney>leftmoney)

      {

      t9.setText(”您的余額不足,請(qǐng)重新輸入取款金額!“);

      text2.setText(”“);cl.show(c,”6“);return;

      }

      int No_50=0,No_100=0,x_50=0,x_100=0,mo=0;

      String str1=”select NO_50,NO_100 from ATM where ATM_ID='123456789'“;ResultSetrsSQLSelect=d.executeQuery(str1);try{ if(rsSQLSelect.next())

      {

      No_50=Integer.parseInt(rsSQLSelect.getString(”NO_50“));

      No_100=Integer.parseInt(rsSQLSelect.getString(”NO_100“));

      }

      }

      catch(Exception er){System.out.println(”查詢(xún)ATM機(jī)信息出錯(cuò)!“);}

      x_100=fetchmoney/100;

      if(No_100

      { mo=fetchmoney-No_100*100;

      x_50=mo/50;

      if(x_50>No_50)

      {

      t9.setText(”取款機(jī)現(xiàn)鈔不足!“);

      text2.setText(”“);cl.show(c,”6“);

      return;

      }

      else

      {

      No_50=No_50-x_50;

      No_100=0;

      }

      }

      else

      {

      No_100=No_100-x_100;

      x_50=(fetchmoney-x_100*100)/50;

      if(x_50>No_50)

      {

      t9.setText(”取款機(jī)50面值現(xiàn)鈔不足!“);

      text2.setText(”“);cl.show(c,”6“);

      return;

      }

      else

      {No_50=No_50-x_50;}

      }

      String str2=”update ATM set NO_50=“+No_50+” where ATM_ID='“+ATM_id+”'“;

      String str3=”update ATM set NO_100=“+No_100+” where ATM_ID='“+ATM_id+”'“;d.executeUpdate(str2);d.executeUpdate(str3);

      setmoney(fetchmoney,IC_Number);

      t12.setText(Float.toString(fetchmoney));cl.show(c,”7“);

      text2.setText(”");

      下載有效檢查Java代碼的三個(gè)工具word格式文檔
      下載有效檢查Java代碼的三個(gè)工具.doc
      將本文檔下載到自己電腦,方便修改和收藏,請(qǐng)勿使用迅雷等下載。
      點(diǎn)此處下載文檔

      文檔為doc格式


      聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶(hù)自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),未作人工編輯處理,也不承擔(dān)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)有涉嫌版權(quán)的內(nèi)容,歡迎發(fā)送郵件至:645879355@qq.com 進(jìn)行舉報(bào),并提供相關(guān)證據(jù),工作人員會(huì)在5個(gè)工作日內(nèi)聯(lián)系你,一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

      相關(guān)范文推薦

        Java程序設(shè)計(jì)課程實(shí)驗(yàn)代碼及答案

        Java程序設(shè)計(jì)課程實(shí)驗(yàn) 上機(jī)實(shí)踐1 初識(shí)JAVA ................................................................................................................. 3 實(shí)......

        java教學(xué)計(jì)劃編制的全部代碼

        package curriculumProject; //非連通圖的深度優(yōu)先搜索遍歷和廣度優(yōu)先搜索遍歷 import linearList.Queue.SeqQueue; //順序循環(huán)隊(duì)列類(lèi) public abstract class AbstractG......

        三個(gè)工具助力年會(huì)籌辦

        500強(qiáng)HR推薦:三個(gè)工具助力年會(huì)籌辦 【年終HR火線(xiàn)救急】蛇年年底已至,HR們愈發(fā)忙碌。從年底招聘到反跳槽,從績(jī)效考核到年終獎(jiǎng)制定,從2013年工作總結(jié)到2014年工作計(jì)劃,老總與全公司......

        別了,格律檢查工具!

        別了,格律檢查工具! 中國(guó)青年文學(xué)網(wǎng)——國(guó)內(nèi)最大的青年文學(xué)交流平臺(tái) 《別了,格律檢查工具!》——詩(shī)詞規(guī)則及標(biāo)準(zhǔn)的討論! 終 于有人跟我有同樣的觀點(diǎn)了!其實(shí)想想都覺(jué)得可笑,一首詩(shī)詞......

        正版軟件檢查工具網(wǎng)絡(luò)版使用手冊(cè)

        正版軟件檢查工具網(wǎng)絡(luò)版 用戶(hù)使用手冊(cè) 正版軟件檢查工具網(wǎng)絡(luò)版 ...................................................................... 1 用戶(hù)使用手冊(cè) .....................

        三個(gè)規(guī)范檢查 文檔

        學(xué)生管理規(guī)范資料準(zhǔn)備 三系部 1、兩操 衛(wèi)生 遲到 文明班級(jí) 文明宿舍、雅室大賽檢查評(píng)比資料,宿舍晚間考勤表,周末點(diǎn)名表、請(qǐng)假條、出門(mén)條存根。 2、系部學(xué)生管理工作計(jì)劃、總......

        Java程序員面試寶典 - Java代碼查錯(cuò)(大全5篇)

        JAVA代碼查錯(cuò) 1.abstract class Name { private String name; public abstract boolean isStupidName(String name) {} }大俠們,這有何錯(cuò)誤?答案: 錯(cuò)。abstract method必須......

        java各個(gè)設(shè)計(jì)模式代碼實(shí)現(xiàn)總結(jié)

        第一章靜態(tài)工廠設(shè)計(jì)模式 默認(rèn)的包,只是包內(nèi)共享。Protected的是包內(nèi)和子類(lèi)供共享。 1、 要生產(chǎn)的產(chǎn)品,要設(shè)計(jì)成接口 (1)public interface IMusicBox { public void playBox();......