java實驗二

課程:Java程序設計????????? 班級: 1352???????

姓名:黃衛  ??????????????? 學號:20135221

成績:???????????? 指導教師:婁嘉鵬?????? 實驗日期:2015.05.05

實驗密級:???????? 預習程度:???????????? 實驗時間:8:30~12:30

儀器組次:??????? 必修/選修:選修?????? 實驗序號:2

實驗名稱:Java面向對象程序設計?????????????????????????????????????????????????????????

實驗目的與要求:

一、實驗內容

1. 初步掌握單元測試和TDD

2. 理解并掌握面向對象三要素:封裝、繼承、多態

3. 初步掌握UML建模

4. 熟悉S.O.L.I.D原則

5. 了解設計模式

二、實驗要求

1.沒有Linux基礎的同學建議先學習《Linux基礎入門(新版)》《Vim編輯器》 課程

2.完成實驗、撰寫實驗報告,實驗報告以博客方式發表在博客園,注意實驗報告重點是運行結果,遇到的問題(工具查找,安裝,使用,程序的編輯,調試,運行等)、解決辦法(空洞的方法如“查網絡”、“問同學”、“看書”等一律得0分)以及分析(從中可以得到什么啟示,有什么收獲,教訓等)。報告可以參考范飛龍老師的指導

3. 嚴禁抄襲,有該行為者實驗成績歸零,并附加其他懲罰措施。

4. 請大家先在實驗樓中的~/Code目錄中用自己的學號建立一個目錄,代碼和UML圖要放到這個目錄中,截圖中沒有學號的會要求重做,然后跟著下面的步驟練習

三、實驗步驟

(一)單元測試

(1) 三種代碼

  • 偽代碼
  • 產品代碼
  • 測試代碼

我們通過一個例子說明如何寫這三種代碼。

需求:我們要在一個MyUtil類中解決一個百分制成績轉成“優、良、中、及格、不及格”五級制成績的功能。

//偽代碼:

百分制轉五分制:

如果成績小于60,轉成“不及格”

如果成績在60與70之間,轉成“及格”

如果成績在70與80之間,轉成“中等”

如果成績在80與90之間,轉成“良好”

如果成績在90與100之間,轉成“優秀”

其他,轉成“錯誤”

//產品代碼:

翻譯好的MyUtil.java如下:

public class MyUtil{

public static String percentage2fivegrade(int grade){

//如果成績小于60,轉成“不及格”

if (grade < 60)

return "不及格";

//如果成績在60與70之間,轉成“及格”

else if (grade < 70)

return "及格";

//如果成績在70與80之間,轉成“中等”

else if (grade < 80)

return "中等";

//如果成績在80與90之間,轉成“良好”

else if (grade < 90)

return "良好";

//如果成績在90與100之間,轉成“優秀”

else if (grade < 100)

return "優秀";

//其他,轉成“錯誤”

else

return "錯誤";

}

}

//測試代碼:

public class MyUtilTest {

public static void main(String[] args) {

// 百分制成績是50時應該返回五級制的“不及格”

if(MyUtil.percentage2fivegrade(50) != "不及格")

System.out.println("test failed!");

else

System.out.println("test passed!");

}

}

(2) TDD(Test Driven Devlopment, 測試驅動開發)

先寫測試代碼,然后再寫產品代碼的開發方法叫“測試驅動開發”(TDD)。TDD的一般步驟如下:

  • 明確當前要完成的功能,記錄成一個測試列表
  • 快速完成編寫針對此功能的測試用例
  • 測試代碼編譯不通過(沒產品代碼呢)
  • 編寫產品代碼
  • 測試通過
  • 對代碼進行重構,并保證測試通過(重構下次實驗練習)
  • 循環完成所有功能的開發

基于TDD,我們不會出現過度設計的情況,需求通過測試用例表達出來了,我們的產品代碼只要讓測試通過就可以了。 Java中有單元測試工具JUnit來輔助進行TDD,我們用TDD的方式把前面百分制轉五分制的例子重寫一次,體會一下有測試工具支持的開發的好處。 打開Eclipse,單擊File->New->Java Project新建一個TDDDemo的Java項目:我們在TDDDemo項目中,把鼠標放到項目名TDDDemo上,單擊右鍵,在彈出的菜單中選定New->Source Folder新建一個測試目錄test,我們把鼠標放到test目錄上,單擊右鍵,在彈出的菜單中選定New->JUnit Test Case新建一個測試用例類MyUtilTest,

我們增加第一個測試用例testNormal,注意測試用例前一定要有注解@Test,測試用例方法名任意,輸入以下代碼:

import org.junit.Test;

import junit.framework.TestCase;

public class MyUtilTest extends TestCase {

@Test

public void testNormal() {

assertEquals("不及格", MyUtil.percentage2fivegrade(55));

assertEquals("及格", MyUtil.percentage2fivegrade(65));

assertEquals("中等", MyUtil.percentage2fivegrade(75));

assertEquals("良好", MyUtil.percentage2fivegrade(85));

assertEquals("優秀", MyUtil.percentage2fivegrade(95));

}

}

輸入完畢

紅叉說明代碼存在語法錯誤,原因很簡單,MyUtil類還不存在,類中的percentage2fivegrade方法也不存在,我們在TDDDemo的src目錄中新建一個MyUtil的類,并實現percentage2fivegrade方法

現在測試代碼沒有語法錯誤了,我們把鼠標放到MyUtilTest.java上,單擊右鍵,選擇Run as->JUnit Test

測試結果出現了一個綠條(green bar),說明測試通過了。

TDD的編碼節奏是:

  • 增加測試代碼,JUnit出現紅條
  • 修改產品代碼
  • JUnit出現綠條,任務完成

(二)面向對象三要素

(1)抽象

(2)封裝、繼承與多態

(三)設計模式初步

(1)S.O.L.I.D原則

面向對象三要素是“封裝、繼承、多態”,任何面向對象編程語言都會在語法上支持這三要素。如何借助抽象思維用好三要素特別是多態還是非常困難的,S.O.L.I.D類設計原則是一個很好的指導:

  • SRP(Single Responsibility Principle,單一職責原則)
  • OCP(Open-Closed Principle,開放-封閉原則)
  • LSP(Liskov Substitusion Principle,Liskov替換原則)
  • ISP(Interface Segregation Principle,接口分離原則)
  • DIP(Dependency Inversion Principle,依賴倒置原則)

(四)練習

1使用TDD的方式設計關實現復數類Complex。

2.實驗報告中統計自己的PSP(Personal Software Process)時間

??????

??

步驟

??
??

耗時

??
??

百分比

??

需求分析

30min

12.5%

設計

60min

25%

代碼實現

60min

25%

測試

60min

25%

分析總結

30min

12.5%

3. 實現要有偽代碼,產品代碼,測試代碼。

4.總結單元測試的好處

實驗截圖

?

?

?

?

?

?

(三)設計模式初步

S.O.L.I.D原則

?

面向對象三要素是“封裝、繼承、多態”,任何面向對象編程語言都會在語法上支持這三要素。如何借助抽象思維用好三要素特別是多態還是非常困難的,S.O.L.I.D類設計原則是一個很好的指導:

SRP(Single Responsibility Principle,單一職責原則)

OCP(Open-Closed Principle,開放-封閉原則)

LSP(Liskov Substitusion Principle,Liskov替換原則)

ISP(Interface Segregation Principle,接口分離原則)

DIP(Dependency Inversion Principle,依賴倒置原則)

OCP是OOD中最重要的一個原則,OCP的內容是:

software entities (class, modules, function, etc.) should open for extension,but closed for modification.

軟件實體(類,模塊,函數等)應該對擴充開放,對修改封閉。

三、遇到的問題及解決方法

出現的問題:

1.在單元測試的編寫中,由于網絡信號不穩定,而且虛擬機運行非常慢,以致這次實驗非常耗費時間,只能慢慢一步一步截圖

2.這次實驗中由于得知實驗樓截圖只能截4張,因此選擇用自己的截圖工具進行截圖

3測試代碼的編寫過程中因為不太熟悉程序,編寫所以測試代碼出現了很多問題,花費了很多時間去修改。

四、實驗收獲

本次實驗讓我更進一步的了解了java這一門課程的難度,對于我這種“差生”可能學習起來還是有一點吃力的。

這次實驗讓我體會到了面向對象的編程工具和面向對象的編程工具之間的區別,面向對象我們通過封裝對象,可以通過建模的方式進行代碼編寫,這樣可以使我們將更大的精力用在類的設計而非代碼編寫上。

(三)設計模式初步

S.O.L.I.D原則

面向對象三要素是“封裝、繼承、多態”,任何面向對象編程語言都會在語法上支持這三要素。如何借助抽象思維用好三要素特別是多態還是非常困難的,S.O.L.I.D類設計原則是一個很好的指導:

SRP(Single Responsibility Principle,單一職責原則)

OCP(Open-Closed Principle,開放-封閉原則)

LSP(Liskov Substitusion Principle,Liskov替換原則)

ISP(Interface Segregation Principle,接口分離原則)

DIP(Dependency Inversion Principle,依賴倒置原則)

OCP是OOD中最重要的一個原則,OCP的內容是:

software entities (class, modules, function, etc.) should open for extension,but closed for modification.

軟件實體(類,模塊,函數等)應該對擴充開放,對修改封閉。

三、遇到的問題及解決方法

出現的問題:

1.在單元測試的編寫中,由于網絡信號不穩定,而且虛擬機運行非常慢,以致這次實驗非常耗費時間,只能慢慢一步一步截圖

2.這次實驗中由于得知實驗樓截圖只能截4張,因此選擇用自己的截圖工具進行截圖

3測試代碼的編寫過程中因為不太熟悉程序,編寫所以測試代碼出現了很多問題,花費了很多時間去修改。

四、實驗收獲

本次實驗讓我更進一步的了解了java這一門課程的難度,對于我這種“差生”可能學習起來還是有一點吃力的。

這次實驗讓我體會到了面向對象的編程工具和面向對象的編程工具之間的區別,面向對象我們通過封裝對象,可以通過建模的方式進行代碼編寫,這樣可以使我們將更大的精力用在類的設計而非代碼編寫上。

(三)設計模式初步

S.O.L.I.D原則

面向對象三要素是“封裝、繼承、多態”,任何面向對象編程語言都會在語法上支持這三要素。如何借助抽象思維用好三要素特別是多態還是非常困難的,S.O.L.I.D類設計原則是一個很好的指導:

SRP(Single Responsibility Principle,單一職責原則)

OCP(Open-Closed Principle,開放-封閉原則)

LSP(Liskov Substitusion Principle,Liskov替換原則)

ISP(Interface Segregation Principle,接口分離原則)

DIP(Dependency Inversion Principle,依賴倒置原則)

OCP是OOD中最重要的一個原則,OCP的內容是:

software entities (class, modules, function, etc.) should open for extension,but closed for modification.

軟件實體(類,模塊,函數等)應該對擴充開放,對修改封閉。

三、遇到的問題及解決方法

出現的問題:

1.在單元測試的編寫中,由于網絡信號不穩定,而且虛擬機運行非常慢,以致這次實驗非常耗費時間,只能慢慢一步一步截圖

2.這次實驗中由于得知實驗樓截圖只能截4張,因此選擇用自己的截圖工具進行截圖

3測試代碼的編寫過程中因為不太熟悉程序,編寫所以測試代碼出現了很多問題,花費了很多時間去修改。

四、實驗收獲

本次實驗讓我更進一步的了解了java這一門課程的難度,對于我這種“差生”可能學習起來還是有一點吃力的。

這次實驗讓我體會到了面向對象的編程工具和面向對象的編程工具之間的區別,面向對象我們通過封裝對象,可以通過建模的方式進行代碼編寫,這樣可以使我們將更大的精力用在類的設計而非代碼編寫上。

轉載于:https://www.cnblogs.com/hw00332012/p/4485785.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/375994.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/375994.shtml
英文地址,請注明出處:http://en.pswp.cn/news/375994.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

兩數之和c語言實現

題目描述&#xff1a;給定一個整數數組和一個目標值&#xff0c;找出數組中和為目標值的兩個數。你可以假設每個輸入只對應一種答案&#xff0c;且同樣的元素不能被重復利用。示例:給定 nums [2, 7, 11, 15], target 9因為 nums[0] nums[1] 2 7 9 所以返回 [0, 1]解題思路…

【Linux】正確的關機方法

1&#xff09;shutdown命令 我們較常使用的是shutdown這個命令&#xff0c;這個命令可以安全地關閉或重啟Linux系統&#xff0c;它在系統關閉之前給系統上的所有登錄用戶提示一條警告信息。該命令還允許用戶指定一個時間參數&#xff0c;可以是一個精確的時間&#xff0c;也可以…

oracle 存儲過程寫文件,Oracle寫本地文件

Oracle寫本地文件是指寫到運行Oracle的主機上&#xff0c;而不是運行該腳本的機器上。說起來有點拗口&#xff0c;實際上就是無論在哪里執行這個過程&#xff0c;生成的文件始終都是在服務器上的。下面過程實現了這個功能&#xff1a;logdir是指文件存放路徑。有Oracle的direct…

兩數相加c語言實現

給定兩個非空鏈表來表示兩個非負整數。位數按照逆序方式存儲&#xff0c;它們的每個節點只存儲單個數字。將兩數相加返回一個新的鏈表。你可以假設除了數字 0 之外&#xff0c;這兩個數字都不會以零開頭。示例&#xff1a;輸入&#xff1a;(2 -> 4 -> 3) (5 -> 6 -&g…

jQuery獲取Select選擇的Text和Value

一、 jQuery獲取Select選擇的Text和Value:語法解釋&#xff1a; $("#select_id").change(function(){//code...}); //為Select添加事件&#xff0c;當選擇其中一項時觸發varcheckText$("#select_id").find("option:selected").tex…

jquery實現導航欄鼠標點擊后實行背景高亮,點擊離開恢復(超級簡單!!!!)...

昨天才寫了一個方法&#xff0c;今天發現一個更簡單的。 html&#xff1a; <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title></title> </head> <body> <div class"dianji&qu…

Linux怎么處理binray文件,Linux下如何反匯編arm raw binary文件

有一個arm elf文件經過objcopy -O binary 命令處理生成bin文件進行反匯編:指令1&#xff1a;arm_v5t_le-objdump -b binary -m armv5te -D u-boot.bin|head指令2&#xff1a;arm-linux-objdump -D -b binary test.bin --architecturearm > /tmp/raw.txthttp://linux.chi…

putty連虛擬機中Linux出現Access Denied

環境&#xff1a;VMwarekali Linux出現這個問題&#xff0c;肯定是你想嘗試直接通過使用root賬戶連接你的linux&#xff0c;這樣肯定是不行的&#xff0c;why&#xff1f;為了保證服務器安全&#xff0c;幾乎所有的服務器都禁止了超級用戶直接登錄系統&#xff0c;而是通過普通…

Floyd算法應用-醫院選址問題

1)問題描述 n個村莊之間的交通圖可以用有向網圖來表示&#xff0c;圖中邊<vi, vj>上的權值表示從村莊i到村莊j的道路長度。現在要從這n個村莊中選擇一個村莊新建一所醫院&#xff0c;問這所醫院應建在哪個村莊&#xff0c;才能使所有的村莊離醫院都比較近&#xff1f; 2)…

linux ls 命令排序,如何在Linux中使用ls命令按大小對所有文件進行排序

ls命令是列出目錄內容的最流行且非常有用的命令。 在本文中&#xff0c;我們將解釋如何使用ls sort選項按大小列出目錄內容。1)按大小列出目錄中的文件(排序)要列出具有大小排序的特定目錄的內容&#xff0c;我們將使用-lS選項和ls命令。 它將在頂部顯示最大的文件。[linuxidcl…

C?#?獲?取?當?前?時?間?的?各?種?格?式

C#獲取當前時間的各種格式 DateTime.Now.ToShortTimeString() DateTime dt DateTime.Now; dt.ToString();//2005-11-5 13:21:25 dt.ToFileTime().ToString();//127756416859912816 dt.ToFileTimeUtc().ToString();//127756704859912816 dt.ToLocalTime().ToString(…

基于tcp connect的端口掃描程序

原理&#xff1a;connect()函數用于對于每一個感興趣的目標計算機的端口進行連接&#xff0c;如果該端口處于偵聽狀態&#xff0c;那么connect()就會成功&#xff0c;即沒有提供服務。如果對于每一個目標端口以串行的方式使用單獨的connect()調用&#xff0c;需要較長的時間&am…

UIScrollView

一、UIScrollView 1.常見屬性 property(nonatomic) CGPoint contentOffset; // 記錄UIScrollView滾動的位置 property(nonatomic) CGSize contentSize; // 內容尺寸&#xff08;能滾動的范圍&#xff09; property(nonatomic) UIEdgeInsets contentInset; // 額外增加的滾動區域…

linux如何運行多個硬盤,一個硬盤如何裝兩個Linux

1個硬盤已安裝Fedora 8 Linux系統&#xff0c;并安裝grub引導管理程序&#xff0c;現要在這個硬盤的空閑分區中安裝Fedora 9&#xff0c;操作如下&#xff1a;1.將Fedora-9-i386-DVD.iso文件放到一個Windows Fat32分區((hd0,4))的根目錄&#xff0c;將這個iso文件中的isolinux目…

APIO2015 醬油記

Day 0 昨天CTSC才比完&#xff0c;當然是要浪啦&#xff01; 于是浪了一天。。。午飯都沒吃。。。 晚飯。。。貌似也沒吃。。。 晚上的時候覺得這樣子浪不太好&#xff0c;還是要認真一下&#xff0c;打開bzoj&#xff0c;棄療了。。。還是浪吧。。。 Day 1 今天要講課&#xf…

宏定義 #define 和常量 const 的區別

學習筆記&#xff01;參考鏈接 一、類型和安全檢查不同宏定義是字符替換&#xff0c;沒有數據類型的區別&#xff0c;同時這種替換沒有類型安全檢查&#xff0c;可能產生邊際效應等錯誤&#xff1b;const常量是常量的聲明&#xff0c;有類型區別&#xff0c;需要在編譯階段進行…

【ibus】設置ibus輸入法(pinyin sunpinyin)

設置ibus-pinyin 在終端中運行 /usr/lib/ibus-pinyin/ibus-setup-pinyin命令可以調出ibus的完整設置對話框 設置ibus-sunpinyin 可以執行ibus-sunpinyin自帶的python設置腳本ibus-setup-sunpinyin來全面設置它 : $ /usr/lib/ibus-sunpinyin/ibus-setup-sunpinyin 如果執行此腳…

linux 進程 釋放內存,Linux 釋放內存方法和原理

今天驚愕地發現&#xff0c;主節點上8G內存被不知道什么進程吃掉了整整6G有余&#xff0c;正常的計算快要維持不下去了&#xff0c;遂處理之。先看看內存使用狀況[rootnode1 ~]# free -mtotal used free shared buffers cachedMem: 8004 6557 1446 0 163 5630-/ buffers/cache:…

玩轉Win32開發(2):完整的開發流程

上一篇中我給各位說了一般人認為C中較為難的東西——指針。其實對于C&#xff0c;難點當然不局限在指針這玩意兒上&#xff0c;還有一些有趣的概念&#xff0c;如模板類、虛基類、純虛函數等&#xff0c;這些都是概念性的東西&#xff0c;幾乎每一本C書上都會介紹&#xff0c;而…

c++函數傳參:值傳遞、指針傳遞、引用傳遞

1、將變量名作為實參和形參&#xff1a; 這時傳給形參的是變量的值&#xff0c;傳遞是單向的。如果在執行函數期間形參的值發生變化&#xff0c;并不傳回實參。應為在調用函數時&#xff0c;形參和實參不是同一個存儲單元。 2、傳遞變量的指針&#xff1a; 形參是指針變量&a…