2017-2018-2 20165207實驗二《Java面向對象程序設計》實驗報告

2017-2018-2 20165207實驗二《Java面向對象程序設計》實驗報告

課程:Java程序設計 班級:1652 姓名:李天林 學號:20165207
實驗日期:2018年4月16日 實驗序號:二java


實驗內容

單元測試

  1. 要求:需求是在一個名爲MyUtil的類中完成將百分制分數轉成「優、良、中、及格、不及格」五級製成績。在寫好產品代碼以後,我要寫測試代碼測試正常狀況、異常狀況以及邊界狀況,這個過程要用Junit來完成
  2. 按照需求寫僞代碼。用IDEA在新建的20165207exp2目錄下新建項目,而後新建一個類MyUtil,寫進去僞代碼:
  3. 根據我以前寫的僞代碼編寫產品代碼,以前寫好的僞代碼就是對這個產品代碼最好的註釋:
  4. 個人源代碼應放在src測試代碼在test目錄,因此寫測試代碼以前須要新建一個目錄,如下爲相關的操做。首先,右擊項目選擇new選擇directory:
    而後給新建好的test設置環境變量,也就是讓IDEA知道這裏存的是個人測試代碼。在test上右擊而後MakeDirectoryas以後選擇testSourceRoot,這樣就把這個文件夾設置成了存放測試代碼的源文件的文件夾:
  5. 在test目錄中編寫測試代碼MyUtilTest,其中的測試用例分爲測試正常testNormal測試邊界testBoundary測試異常testException三部分:
    而後編譯運行,獲得了以下的結果:
    看來在我手工編的測試代碼裏,這幾個測試用例都經過了。
  6. 而後用Junit輔助的TDD的方式重寫這個例子(生成測試代碼)。在這以前我先要安裝插件讓程序具有用Junit生成測試代碼的能力。首先,在設置(setting)的插件(plugins)選項卡中選擇左下角的Install JetBrains plugins:

    實際上我點的是它右邊的browse in ……才找到的JunitGenerator V2.0而後安裝完成是這樣的
    插件安裝完成以後,重啓個人IDEA,再在燈泡上選擇createTest建立測試代碼
    其間我也遇到了沒法解析關鍵字Junit的問題(記錄在下方問題記錄中),按照教程修改一下個人路徑再把junit.jar加進去以後,junit和testcase就再也不爲紅色了
  7. 編寫好三種狀況的測試代碼以後,運行,沒有紅條,經過了測試。完成了第一個提交點

以TDD的方式研究StringBuffer

  1. 輸入老師給的StringBufferDemo代碼,老師的代碼中調用了StringBuffer中的charAt、length、capcity這幾個方法,我天然應該把容量、實際長度、獲取相應位置的字符這幾方面寫進個人測試代碼裏。
  2. 按照StringBufferDemo中調用的方法,將其更改成個人產品代碼
  3. 寫測試代碼,測試我相應的產品代碼中對字符串追加結果、輸出長度、輸出實際容量、獲取相應位置的字符這幾個方法
    根據測試過程當中出現的幾個問題(寫在了下方問題記錄中)修改測試代碼爲下圖
    測試成功,完成了第二個提交點

在設計模式中添加代碼使之支持short類

根據要求,個人學號07%6=1,我須要對系統進行擴充使之支持Short類。
首先,經過閱讀,我對設計工廠模式,有了必定的理解,其中,Data類是抽象類規定了它的子類有顯示取值的功能,抽象類Factory規定它的子類要生成Data類,生成Data類過程當中經過對子類的上轉型操做來讓返回的子類類具備Data類的子類重寫的方法。
因此要支持Short的話,我應增長Data類的子類Short,再增長Factory類的子類shortFactory。這樣工廠就具有了建立Short類的上轉型對象使之得到顯示short型變量的值的能力。
最後爲了輸出short的值,我還須要在主類中修改使用上面那些類的語句。UML圖大體以下
在程序中添加代碼以下:
測試運行獲得輸出結果5207:設計模式

以TDD的方式開發複數類

題目要求的方法包括兩個重載的構造方法complex、四個分別爲加減乘除的方法、以及重寫的兩個方法:輸出複數的方法toString以及判斷是否與另外一個複數相等的方法Equals。按照要求編寫出以下的測試代碼,至關於爲個人complex類給出一個標準:
而後,在complex類中加入要求的這些屬性和方法(中間的調試錯誤的過程記錄在了下面的問題記錄裏):


在提交點4,運行complexTest測試其中的方法結果是否正確。單元測試

使用UML圖對程序進行建模

以前我在工廠模式中添加short類時,對其用UML圖進行建模
而後下面是實驗二教程中用來講明多態的例子,Dog和Cat分別是抽象類Animal的子類,各自實現了Animal的「叫」的方法測試

問題記錄

  1. 最開始編寫個人MyUtilTest代碼時,測試代碼是本身手工編的,這裏程序提示有錯誤:
    提示不可以從靜態的上下文中引用非靜態方法,按照這個提示我回到以前寫的MyUtil中在方法前的修飾語句中加入static,程序再也不報告錯誤。這個問題提示我基礎中的漏洞之後應當注意。
  2. 找不到JunitGenerator:
    ,我後來點上一級的browse Repository找到的。
    可是解決了安裝問題以後在生成的MyUtilTest2的代碼中關鍵字Junit和Testcase是沒法解析的,都是顯示紅顏色(找到正確的方法以前忘記截圖了,故沒有圖片)。當時比較焦急,我沒有繼續看老師的教程,我以爲是缺乏了某幾個包文件因而就在本身的電腦上重裝了一遍IDEA,但重裝以後這幾個關鍵字仍是紅色的。而後,我又在網上搜索這種狀況,但基本上都不能解決個人問題。浪費好一段時間以後我發現老師在博客下面就寫了要導入Junit.jar包的狀況只是個人路徑略有不一樣
  3. 在使用TDD的方式研究SringBuffer時,我在測試charAt方法時遇到了問題。程序報告中actual部分是S,except部分也是S,看起來是同樣的可是不能經過
    ,後來我意識到charAt方法返回的是一個字符型變量也就是說它匹配的是單引號括起來的字符S,而不是我寫的"S"
  4. 下面的問題出如今對複數類complex進行除法測試中。到提交剛結束時我纔想明白問題出在哪裏。最開始我讓測試程序調用除法方法計算(1+2i)/(3+3i),可是程序計算出來的結果和我在紙上計算出來的正確結果不同,測試結果一直是紅色的,就是……這樣子:
    多是當時有些慌張,分析程序分析的特別蠢,我覺得是0.5被程序讀成了0。想了一會以後,我以爲在complex類的除法方法里加一條輸出語句可讓我更接近事實一些
    而後在運行一次complexTest程序好像有一個了不起的事情
    計算複數除法時,有相似於多項式分式或者無理數分式分母有理化的技巧。比方說複數被除數是a+bi,複數除數是c+di,計算結果就等於分式
(a+bi)/(c+di)

這個分式分子分母同乘(c-di)就可以獲得除法的結果插件

(ac-bd)/(c^2+d^2)+(ad+bc)i/(c^2+d^2)

在程序中我建立了一個新的複數對象b來表示上面分子分母同乘的(c-di)。
在個人測試用例(1+2i)/(3+3i)中,複數對象b就應該表明的是(3-3i)。在上面截下來的運行結果裏能夠看到,第二次assertEquals時,這個b對象就不對了,算出來的結果天然就不是1/6而是0.5。設計

看來還得回去分析程序,在提交剛結束的時候,我以爲問題就出如今我建立新複數對象b的方式上:
我但願b的實部與被除數的實部相等,b的虛部與被除數的虛部相反。因而先把被除數a的引用賦給了b,而後再把b的虛部取相反數。但這種操做其實就是把a當成b操做,a不是在和一個能給本身「有理化」的另外一個和本身不同的複數b相乘,而是在和本身乘。3d

我意識到了操做引用不當給我帶來的問題,再也不使用這種方法建立對象b:
單獨測試了除法,輸出正確,測試也經過了:調試


而後,這是個人與雲班課無緣的提交點4和5的截圖



code

總結

此次影響我實驗完成時間主要有幾個問題,在static的環境裏調用非static的方法,由於新的對象沒有建立時只能經過類名調用static方法,調用非stati是非法的;對對象的引用進行不當的賦值操做致使個人程序沒法正確進行計算;還有就是博客裏面的要求讀的不認真。這幾個問題大多涉及基礎,我對前面幾章的內容自己就掌握不牢或者有些淡忘,提示我要常常複習。另外除了調錯的能力以外,此次實驗我還有一些我認爲有用的收穫,好比用TDD的方式設計程序先給出一個標準,與直接設計程序相比能夠避免設計力度過分或者不夠,以及「工廠」的設計模式來知足S.O.L.I.D的原則orm

相關文章
相關標籤/搜索