軟件工程結對做業

1、項目GitHub地址

https://github.com/yifuhao/RuanGonggit

2、各個模塊耗費的時間

PSP2.1 Personal Software Process Stages 預估耗時(分鐘) 實際耗時(分鐘)
Planning 計劃 30  
· Estimate · 估計這個任務須要多少時間 30
20
Development 開發 1200 1300
· Analysis · 需求分析 (包括學習新技術) 120 140
· Design Spec · 生成設計文檔 30 40
· Design Review · 設計複審 (和同事審覈設計文檔) 5 5
· Coding Standard · 代碼規範 (爲目前的開發制定合適的規範) 20 5
· Design · 具體設計 60 120
· Coding · 具體編碼 720 480
· Code Review · 代碼複審 180 60
· Test · 測試(自我測試,修改代碼,提交修改) 180 300
Reporting 報告 150 60
· Test Report · 測試報告 60 30
· Size Measurement · 計算工做量 30 10
· Postmortem & Process Improvement Plan · 過後總結, 並提出過程改進計劃 60 20
  合計 1500 1380

3、接口設計

In computer science, information hiding is the principle of segregation of the design decisions in a computer program that are most likely to change, thus protecting other parts of the program from extensive modification if the design decision is changed. The protection involves providing a stable interface which protects the remainder of the program from the implementation (the details that are most likely to change).程序員

信息隱藏可以很好的保護程序和用戶信息的安全性,只給外部提供程序的使用接口而不讓他們瞭解程序的內部構造,這樣有利於咱們的編程。在做業中,直觀表現爲將不一樣程序封裝成同樣的接口,方便進行耦合。github

 

User interface design (UI) or user interface engineering is the design of user interfaces for machines and software, such as computers, home appliances, mobile devices, and other electronic devices, with the focus on maximizing usability and the user experience.算法

接口設計的目的在於將程序的使用方法展示出來,但又不將程序的構造暴露。就像是將一瓶水塑封而後留下一個開口,用戶能夠經過開口喝水,但他不須要知道咱們「造水」的過程。編程

 

In computing and systems design a loosely coupled system is one in which each of its components has, or makes use of, little or no knowledge of the definitions of other separate components. Subareas include the coupling of classes, interfaces, data, and services.[1] Loose coupling is the opposite of tight coupling.安全

鬆耦合是要求經過提供必要的接口來下降系統的耦合性。在本次做業中,你們的程序能夠相互調用,耦合性很低,很好。app

 

以上註解均來自維基百科。框架

 

4、接口設計與實現過程

public int gen_chain_char(string[] words, int len, string[] result, char head, char tail, bool enable_loop)electron

public int gen_chain_word(string[] words, int len, string[] result, char head, char tail, bool enable_loop)編程語言

接口主要就是做業要求的接口,爲了方便C#使用改動了一下。

 

主要使用的類:

public class WordChain { public List<Word> wordChain; private int weight; private static char word2end;

}

public class Word { private char head; private char tail; private string allWord; private static int weightChosen = 0;

}

使用單詞類來進行存儲string和相關參數,方便進行運算。使用WordChain也是一樣的理由。weight和word2end都讓個人程序有了必定的便捷性。算法的獨到之處是,我選擇了拓撲排序來進行無環圖的求解,但與常規拓撲序列不一樣的是,這一次的題目是容許自環的(即頭尾相同的單詞),雖然同一開頭的單詞只容許有一個自環,可是這個自環每每會影響到求解的過程。因爲拓撲排序是不容許走回頭路來修正以前的數據的,因此我將自環排在每一類單詞的最前面,這樣一開始就會使用掉它,也就不會影響以後的算法。

 

5、UML圖

 

6、性能改進

我所作的最大改進就是將一開始的深度優先遍歷算法改成後來的拓撲排序算法,因爲這二者沒有並存,沒有辦法進行性能分析。但複雜度從O(n^2)變爲O(V+E),優化了許多。

 

7、契約式編程

Design by contract (DbC), also known as contract programming, programming by contract and design-by-contract programming, is an approach for designing software.——Wikipedia.

契約式編程的核心思想是將軟件系統的各個元素比做商業生活中「客戶」和「供應商」,將其協做運行比做「合同」。該合同在語義上等同於Hoare三元組,該條款規定了義務。這能夠經過設計師必須在合同中重複回答的「三個問題」來歸納:

  • 合同指望什麼?

  • 合同保證什麼?

  • 合同維持什麼?

用編程語言來說,就是「前提條件」是什麼(expect);「中間保證」是什麼(guarantee);「後期實現」是什麼(maintain)。契約式設計有三個關鍵詞:前置條件(precondition),後置條件(postcondition), 類不變項(class invariant)。爲了調用函數,須要保證必須爲真的條件,在其違反時,函數堅定不調用;函數會有一個完成的狀態,不會無休止的進行下去;永爲真的條件,在函數內部過程當中,不變項能夠改變,但在函數結束以後,不變項必定不會改變。這樣的編程模式保證了程序的獨立性和健壯性,當前置條件和後置條件不知足時,程序將會拋出相應的異常,這在保證程序不崩潰的同時很好的反饋了錯誤的信息。

在這次編程中,我負責的部分有處理命令這一項,好比說,我將對head和tail的命令對應爲'a'-'z'和'#',在輸入其它字母的狀況下便會拋出異常。可是,爲了讓程序有必定的容錯性,我將'A'-'Z'設定成拋出異常但會轉成對應的小寫字母。這一點與我查到的契約式編程不盡相同,不過我認爲應該是可行的。

 

8、計算模塊

 

[TestMethod()] public void gen_chain_wordTest3() { string filePath = ("test3.txt"); char head = 'a', tail = 'r'; string[] words = Read_file(filePath); coreBuild core = new coreBuild(); int result=6; try { result = core.gen_chain_word(words, 0, words, head, tail, true); } catch (Exception e) { Console.WriteLine(e); }

        Assert.AreEqual(result, 5);
  }

 

舉一個例子,測試程序是r, rr, rrr, rrrr, rrrr, rt, ar。這裏是判斷其可否接受自環,可否在指定的尾部結束程序。

 

9、計算模塊異常處理

我處理的主要異常有:

  • 文件不存在

  • 命令不規範

  • -h和-t的指定字母爲大寫英文字母

[TestMethod()] public void gen_chain_wordTest2() //有-r。-w { string filePath = ("testNull.txt"); char head = 'A', tail = 't'; string[] words = Read_file(filePath); coreBuild core = new coreBuild(); int result = core.gen_chain_word(words, 0, words, head, tail, true); Assert.AreEqual(result, 6); }

 

10、GUI設計

 

 

功能: · 讀入指定路徑文件中的內容(單行) · 輸入自定義的內容(多行) · 提供計算方式的選擇:-w 或者 -c · 提供是否指定首尾字符的多項選擇(當輸入框中不僅包含一個字符時,取第一位字符) · 提供是否容許包含隱含環的選項 · 單擊生成後即時於輸出框顯示結果 · 可經過圖形化界面選擇導出文件位置 該界面經過 Windows Form 框架和可視化控件實現。

 

11、界面接口

GUI對外提供建立GUI界面的接口:

public static void showGUI()
{
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);
  GUI g = new GUI();
  Application.Run(g);
}

GUI經過調用計算模塊的get_chainByLine函數獲取處理以後的單詞鏈,並予以顯示:

coreBuild core = new coreBuild();
WordChain wc = core.get_chainByLine(textInput, char_h, char_t, b_r, c_wc);
foreach(Word word in wc.GetWordChain())
{
  textOutput += word.Get_allWord();
}
//輸出指結果框
textBox5.Text = textOutput;

 

12、結對過程

因爲結對過程的特殊性以及本身是第一次接觸的緣由,咱們小隊在最後幾晚基本上是一塊兒度過的。圖中爲在隊友的宿舍一塊兒探討學習。

 

十3、結對編程的優缺點

結對編程(英語:Pair programming)是一種敏捷軟件開發的方法,兩個程序員在一個計算機上共同工做。一我的輸入代碼,而另外一我的審查他輸入的每一行代碼。輸入代碼的人稱做駕駛員,審查代碼的人稱做觀察員(或導航員)。兩個程序員常常互換角色。

結對編程的優勢:

  • 兩個程序員,他們在編程的優點和短板都不盡相同,能夠互幫互助,兩我的同時出現盲點的機率較低;

  • 結對編程的過程當中,能夠學習到對方所掌握的一些知識;

  • 在學習的過程當中,遇到麻煩的時候,有些人選擇暫時性的迴避,在結對編程中將會有相互督促的效果;

結對編程的缺點:

  • 有些人習慣單獨編程,參與結對編程可能對本身和同伴都不是好事;

  • 私下關係不錯時,不免會在工做中討論起其他的話題;

  • 因爲是兩我的的小團隊,一方脾氣暴躁的話,有可能形成不愉快,畢竟沒有與其餘同事交流的選項;

我的的優勢:

  • 寫代碼負責,不會拖延團隊的進程;

  • 願意交流,不會形成溝通上的不及時等情況;

  • 會督促團隊進程,相似於團隊項目中的PM;

我的的缺點:

  • 對結對項目不太理解,以爲彼此獨立工做或許效率更高。

 

在生成鏈算法中,要求head和tail只能是'a'-'z'和'#',若是有大寫字母則化爲小寫並報錯,但仍會執行,其餘則報錯並返回

相關文章
相關標籤/搜索