1. 程式人生 > >2017-2018-2 20165228 實驗三《敏捷開發與XP實踐》實驗報告

2017-2018-2 20165228 實驗三《敏捷開發與XP實踐》實驗報告

們的 person pla 顯示器 乘除 執行 可靠 鍵盤輸入 ava

2017-2018-2 20165228 實驗三《敏捷開發與XP實踐》實驗報告

相關知識點

(一)敏捷開發與XP

  • 通過 XP準則來表達:
  • 溝通 :XP認為項目成員之間的溝通是項目成功的關鍵,並把溝通看作項目中間協調與合作的主要推動因素。
  • 簡單 :XP假定未來不能可靠地預測,在現在考慮它從經濟上是不明智的,所以不應該過多考慮未來的問題而是應該集中力量解決燃眉之急。
  • 反饋 :XP認為系統本身及其代碼是報告系統開發進度和狀態的可靠依據。系統開發狀態的反饋可以作為一種確定系統開發進度和決定系統下一步開發方向的手段。
  • 勇氣:代表了XP認為人是軟件開發中最重要的一個方面的觀點。在一個軟件產品的開發中人的參與貫穿其整個生命周期,是人的勇氣來排除困境,讓團隊把局部的最優拋之腦後,達到更重大的目標。表明了XP對“人讓項目取得成功”的基本信任態度。
  • 一項實踐在XP環境中成功使用的依據通過XP的法則呈現,包括:快速反饋、假設簡單性、遞增更改、提倡更改、優質工作。
  • XP軟件開發的基石是XP的活動,包括:編碼、測試、傾聽、設計。

    (二)編碼標準

  • 編程標準使代碼更容易閱讀和理解,甚至可以保證其中的錯誤更少。編程標準包含:具有說明性的名字、清晰的表達式、直截了當的控制流、可讀的代碼和註釋,以及在追求這些內容時一致地使用某些規則和慣用法的重要性。
  • 代碼標準中很重要的一項是如何給包、類、變量、方法等標識符命名,能很好的命名可以讓自己的代碼立馬上升一個檔次。Java中的一般的命名規則有:
  • 要體現各自的含義
  • 包、類、變量用名詞
  • 方法名用動賓
  • 包名全部小寫,如:io,awt
  • 類名第一個字母要大寫,如:HelloWorldApp
  • 變量名第一個字母要小寫,如:userName
  • 方法名第一個字母要小寫:setName
  • 標識符的長度遵循“min-length && max-information”的原則

    (三)結對編程

  • 結對編程是XP中的重要實踐。在結對編程模式下,一對程序員肩並肩、平等地、互補地進行開發工作。他們並排坐在一臺電腦前,面對同一個顯示器,使用同一個鍵盤、同一個鼠標一起工作。他們一起分析,一起設計,一起寫測試用例,一起編碼,一起做單元測試,一起做集成測試,一起寫文檔等。
  • 結對編程中有兩個角色:
  • 駕駛員(Driver)是控制鍵盤輸入的人。
  • 領航員(Navigator)起到領航、提醒的作用。
  • 如何結對編程,為何要結對編程,大家參考一下結對編程和兩人合作 ,重點是:
  • 駕駛員:寫設計文檔,進行編碼和單元測試等XP開發流程。
  • 領航員:審閱駕駛員的文檔、駕駛員對編碼等開發流程的執行;考慮單元測試的覆蓋率;思考是否需要和如何重構;幫助駕駛員解決具體的技術問題。
  • 駕駛員和領航員不斷輪換角色,不要連續工作超過一小時,每工作一小時休息15分鐘。領航員要控制時間。
  • 主動參與。任何一個任務都首先是兩個人的責任,也是所有人的責任。沒有“我的代碼”、“你的代碼”或“他/她的代碼”,只有“我們的代碼”。
  • 只有水平上的差距,沒有級別上的差異。兩人結對,盡管可能大家的級別資歷不同,但不管在分析、設計或編碼上,雙方都擁有平等的決策權利。

    版本控制

    四)版本控制
  • XP的集體所有制意味著每個人都對所有的代碼負責;這一點,反過來又意味著每個人都可以更改代碼的任意部分。結對編程對這一實踐貢獻良多:借由在不同的結對中工作,所有的程序員都能看到完全的代碼。集體所有制的一個主要優勢是提升了開發程序的速度,因為一旦代碼中出現錯誤,任何程序員都能修正它。
  • 這意味著代碼要放到一個大家都能方便獲取的地方,我們叫代碼倉庫。這引出另外一個話題叫版本控制(Version Control)。

  • 不論是對於團隊還是個體,版本控制都提供了很多好處。

  • 版本控制提供項目級的 undo(撤銷) 功能: 沒有什麽事情是終結版本, 任何錯誤必須很容易回滾。 假設你在使用世界上最復雜的文字處理系統。 它具備了所有的能想到的功能,就是沒有支持 DELETE(刪除) 鍵。想象你打字的時候得多麽的謹慎和緩慢吧, 特別是一篇超大的文檔的快臨近末尾的時候, 一個不小心就要重頭再來(試想你選中所有的文字, 不小心按了 DELETE 鍵, 因為沒有撤銷功能,只好重新錄入)。編輯文字和版本控制相同,任何時候都需要回滾,無論是一個小時, 一天, 還是一周, 這讓你的團隊工作自由快速的工作, 而且對於修正錯誤也非常自信。
  • 版本控制允許多人在同一代碼上工作, 只要遵守一定的控制原則就行。 再也不會發生諸如一個人覆蓋了另一個人編輯的代碼,導致那個人的修改無效這樣的情況。
  • 版本控制系統保存了過去所作的修改的歷史記錄。如果你遭遇到一些驚訝的代碼,通過版本控制系統可以很容易找出是誰幹的, 修改了什麽, 修改的時間, 如果幸運的話,還能找出原因。
  • 版本控制系統還支持在主線上開發的同時發布多個軟件版本。在軟件發布的時候也不需要整個團隊的停止工作,不需要凍結代碼。
  • 版本控制也是項目級的時間機器,你可以選擇任何一個時間, 精確地查看項目在當時的情況。 這對研究非常有用, 也是重現以前某個有問題的發布版本的基礎。
  • git使用
  • 先用

    git status

    查看一下代碼狀態,顯示有未跟蹤的代碼,並建議用

    git add <file>
    添加
  • 如果想把代碼保存到遠程托管服務器中,需要使用

    git push

    (五)重構

  • 重構(Refactor),就是在不改變軟件外部行為的基礎上,改變軟件內部的結構,使其更加易於閱讀、易於維護和易於變更 。
  • 重構中一個非常關鍵的前提就是“不改變軟件外部行為”,它保證了我們在重構原有系統的同時,不會為原系統帶來新的BUG,以確保重構的安全。如何保證不改變軟件外部行為?重構後的代碼要能通過單元測試。如何使其更加易於閱讀、易於維護和易於變更 ?設計模式給出了重構的目標
  • 增加新功能;
  • 原有功能有BUG;
  • 改善原有程序的結構;
  • 優化原有系統的性能 。
  • 最單純的Duplicated Code就是[同一個class內的兩個方法含有相同表達式(expression)]。這時候你需要做的就是采用Extract Method提煉出重復的代碼,然後讓這兩個地點都調用被提煉出來的那一段代碼。
  • 另一種常見情況就是[兩個互為兄弟(sibling)的subclasses內含有相同表達式]。要避免這種情況,只需要對兩個classes都使用Extract Method,然後再對被提煉出的代碼使用Pull Up Method,將它推入superclass內。
  • 如果代碼之間只是類似,並非完全相同,那麽就得運用Extract Method將相似部分和差異部分割開,構成單獨一個方法。然後你可能發現或許可以運用Form Template Method獲得一個Template Method設計模式。
  • 如果有些方法以不同的算法做相同的事,你可以擇定其中較清晰的一個,並使用Substitute Algorithm將其它方法的算法替換掉。
  • 如果兩個毫不相關的classes內出現Duplicaded Code,你應該考慮對其中一個使用Extract Class,將重復代碼提煉到一個獨立class中,然後在另一個class內使用這個新class。但是,重復代碼所在的方法也可能的確只應該屬於某個class,另一個class只能調用它,抑或- 這個方法可能屬於第三個class,而另兩個classes應該引用這第三個class。你必須決定這個方法放在哪兒最合適,並確保它被安置後就不會再在其它任何地方出現。
  • 給類、包、方法、變量改名字

    Rename
  • 當出現代碼重復問題時,正常的重構可以使用Extract Method

    Extract Method

    -專門的tostring()方法:

    Generate toString()

    實驗內容

    (一)敏捷開發與XP實踐-1

    檢查點要求:
  • 參考 http://www.cnblogs.com/rocedu/p/6371315.html#SECCODESTANDARD 安裝alibaba 插件,解決代碼中的規範問題。
  • 在IDEA中使用工具(Code->Reformate Code)把下面代碼重新格式化,再研究一下Code菜單,找出一項讓自己感覺最好用的功能。提交截圖,加上自己學號水印。

    public class CodeStandard {
    public static void main(String [] args){
    StringBuffer buffer = new StringBuffer();
    buffer.append(‘S‘);
    buffer.append("tringBuffer");
    System.out.println(buffer.charAt(1));
    System.out.println(buffer.capacity());
    System.out.println(buffer.indexOf("tring"));
    System.out.println("buffer = " + buffer.toString());
    if(buffer.capacity()<20)
    buffer.append("1234567");
    for(int i=0; i<buffer.length();i++)
    System.out.println(buffer.charAt(i));
    }
    }
    相關截圖:

    鼠標選擇code——>Reformat Code
    技術分享圖片

(二)敏捷開發與XP實踐-2

檢查點要求:
  • 在碼雲上把自己的學習搭檔加入自己的項目中,確認搭檔的項目加入自己後,下載搭檔實驗二的Complex代碼,加入不少於三個JUnit單元測試用例,測試成功後git add .; git commit -m "自己學號 添加內容";git push;

  • 提交搭檔項目git log的截圖,包含上面git commit的信息,並加上自己的學號水印信息。

    相關截圖:

    加入加減乘除的測試
    技術分享圖片

技術分享圖片

(三)敏捷開發與XP實踐-3

檢查點要求:
  • 參考實驗三 敏捷開發與XP實踐 http://www.cnblogs.com/rocedu/p/4795776.html, Eclipse的內容替換成IDEA

  • 完成重構內容的練習,下載搭檔的代碼,至少進行三項重構,提交重構後代碼的截圖,加上自己的學號水印。提交搭檔的碼雲項目鏈接。

    相關截圖:
    標識符可以使用Refactor-->`Rename來修改
  • 實現部分無意義變量名的替換以及省略了一些多余的變量以節省內存空間。
  • 將print內容通過extract method新建private static String方法來實現
    技術分享圖片

技術分享圖片

(四)敏捷開發與XP實踐-4

檢查點要求:
  • 參考 http://www.cnblogs.com/rocedu/p/6683948.html,以結對的方式完成Java密碼學相關內容的學習,結合重構,git,代碼標準。

  • 提交學習成果碼雲鏈接和代表性成果截圖,要有學號水印。

    相關截圖:

    技術分享圖片

PSP(Personal Software Process)時間

步驟 耗時 百分比
需求分析 50 17%
設計 60 20%
代碼實現 120 40%
測試 40 13%
分析總結 30 10%

2017-2018-2 20165228 實驗三《敏捷開發與XP實踐》實驗報告