結對項目
1.相關資訊
Q | A |
---|---|
這個作業屬于哪個課程 | 2020春季計算機學院軟體工程(羅傑 任健) |
這個作業的要求在哪裡 | 結對項目作業 |
我在這個課程的目标是 | 系統地學習軟體工程開發知識,掌握相關流程和技術,提升工程化開發的能力 |
這個作業在哪個具體方面幫助我實作目标 | 了解熟悉結對開發流程,為之後的組隊項目做好鋪墊 |
教學班級 | 005 |
項目位址 | https://github.com/NoSameRain/BUAA_SE_IntersectPrj_Pair.git |
2.PSP表格:
PSP2.1 | Personal Software Process Stages | 預估耗時(分鐘) | 實際耗時(分鐘) |
---|---|---|---|
Planning | 計劃 | ||
· Estimate | · 估計這個任務需要多少時間 | 20 | |
Development | 開發 | ||
· Analysis | · 需求分析 (包括學習新技術) | 200 | 240 |
· Design Spec | · 生成設計文檔 | 60 | |
· Design Review | · 設計複審 (和同僚稽核設計文檔) | ||
· Coding Standard | · 代碼規範 (為目前的開發制定合适的規範) | 30 | 40 |
· Design | · 具體設計 | ||
· Coding | · 具體編碼 | 300 | 350 |
· Code Review | · 代碼複審 | 150 | |
· Test | · 測試(自我測試,修改代碼,送出修改) | ||
Reporting | 報告 | ||
· Test Report | · 測試報告 | 120 | |
· Size Measurement | · 計算工作量 | ||
· Postmortem & Process Improvement Plan | · 事後總結, 并提出過程改進計劃 | ||
合計 | 1370 | 1530 |
3.看教科書和其它資料中關于 Information Hiding,Interface Design,Loose Coupling 的章節,說明你們在結對程式設計中是如何利用這些方法對接口進行設計的。
Information Hiding:1972年,David Parnas提出了資訊隐藏的想法。他認為關鍵的設計系統應該對客戶和前端使用者隐藏。他将資訊隐藏定義為一種可以保護用戶端免受内部程式影響的方法。換句話說,資訊隐藏是使用程式設計語言功能(如私有變量)或顯式導出政策來防止類或軟體元件的某些方面對其用戶端可通路的能力。例如,可以隐藏産生給定結果的計算。它遵循可以描述為一種資訊隐藏類型的功能模型。資訊隐藏的一個優點是具有靈活性,例如允許程式員更容易地修改程式。也可以通過将源代碼放置在子產品中以在将來随着程式的發展和發展輕松通路而完成。
在我們的設計中,每個類(Line,Point)并無私有屬性,因為它們的相關屬性是需要提供給外部函數進行計算的,是以在類裡資訊隐藏的展現并不明顯。但是對整個項目來說,計算和錯誤處理的功能實作封裝在了dll檔案裡,UI隻需要知道結果而不必關心計算過程,在這一點上展現了了資訊隐藏。感覺在這個過程中,資訊隐藏是原理,封裝是技術,通過将實作過程封裝到提供接口的方式來實作隐藏資訊。通過隐藏資訊,封裝 ,組合子產品可以建立更大的實體。同時確定了隐藏的功能的正确性後,可以專注于UI子產品的設計,而不必擔心隐藏的細節。
Interface Design:這裡的接口應該主要指的是API,即Application Programming Interface(應用程式接口),它是一些預先定義的函數,或指軟體系統不同組成部分銜接的約定。 目的是提供應用程式與開發人員基于某軟體或硬體得以通路一組例程的能力,而又無需通路原碼,或了解内部工作機制的細節。文章提到了關于優秀的API接口設計原則及方法,在設計原則方面,首先是考慮接口存在的必要性,即這個接口的存在是十分有意義和價值的;第二點是職責明确,一個接口隻負責一個業務功能;第三點是高内聚低耦合,一個接口要包含完整的業務功能,而不同接口之間的業務關聯要盡可能的小;除此之外還有分析角度明确、入參格式統一、提供狀态及回報等。
在我們的接口設計中,core是為UI和指令行程式提供計算和錯誤處理功能的,是以core的接口主要是從功能的角度來設計的,比如計算交點并傳回,錯誤審查并傳回錯誤資訊,從檔案讀入資料和寫入資料等,保證了資訊隐藏。在後文對接口會有詳細的介紹。
Loose Coupling:在程式設計中,耦合是指一個元件具有另一元件的直接知識程度,也就是軟體子產品之間的互相依賴程度。耦合通常與内聚形成對比,。低耦合通常與高内聚相關,反之亦然。低耦合通常是軟體結構良好和設計良好的标志,并且與高内聚性結合使用時,可以達到較高的可讀性和可維護性的總體目标。耦合強弱取決于子產品間接口的複雜程度、進入或通路一個子產品的點以及通過接口的資料。
在我們的設計中,使得子產品的功能化分盡可能的單一,避免直接調用其他子產品,但是在程式設計過程中不可避免的會使用public聲明方法以及全局變量的定義,導緻松耦合展現的效果不是那麼理想。在之後和其他小組的松耦合測試中,也因為接口的設計有點差異,是以需要做細微的修改。
4.計算子產品接口的設計與實作過程。設計包括代碼如何組織,比如會有幾個類,幾個函數,他們之間關系如何,關鍵函數是否需要畫出流程圖?說明你的算法的關鍵(不必列出源代碼),以及獨到之處。
本次作業裡有三個類(Point,Line,WFLine),Line是存儲計算交點所需的直接資訊,WFLine是為處理有無窮多交點即Line重合設計的類,包含3個參數a,b,c,即采用ax+by+c=0的直線表達式;a,b,c是由兩個點的坐标計算而來,故WFLine繼承自Point。關于Point和Line,WFLine的函數聲明都放置在assis.h中。
需要實作的重要函數有以下:1.确定直線參數;2.求直線交點;3.判斷交點是否線上段或者射線上;4.錯誤輸入處理;5.判斷是否有無窮多交點;6.set用于去重的運算符重載函數;
我們設計的接口如下:
DLL_API void readin(string FileName);//讀入資料
DLL_API void clear();//清空所有容器
DLL_API void cnt_coor_num(); //計算交點個數
DLL_API set<Point> getPoints();//傳回交點集合
DLL_API vector<line> getLine();//傳回直線集合
DLL_API void addLine(line l);//添加直線
DLL_API void delLine(line l);//删除直線
DLL_API void solve();//求解
DLL_API void write(string FileName);//寫入檔案
DLL_API string inputHandler(string FileName);
//從檔案讀入資料時進行錯誤處理 正常應傳回 "Everything is ok!"
DLL_API string InfinitePoints();
//判斷線之間是否重合 正常應傳回"NO InfinitePoints!"
DLL_API int getP_cnt();//獲得交點個數
DLL_API int getPointNum();//points size
程式開始時,各函數調用順序如下:

在addLine之後需要調用InfinitePoints()以判斷是否有無窮多交點,再調用交點計算子產品進行計算。
5.閱讀有關 UML 的内容:UML。畫出 UML 圖顯示計算子產品部分各個實體之間的關系(畫一個圖即可)。
由于此次作業中類與類之間的關系未做過多設計,故在starUML中畫出的圖比較簡略:
6.計算子產品接口部分的性能改進。記錄在改進計算子產品性能上所花費的時間,描述你改進的思路,并展示一張性能分析圖(由VS 2015/2017的性能分析工具自動生成),并展示你程式中消耗最大的函數。
性能改進:40min.
主要的性能改進是在存儲交點方面,一開始我們采用的是将節點的Xpoint和Ypoint轉化為string以達到去重的目的,并存儲在map容器中,經過性能分析發現to_string和insert函數開銷特别大,是以換成了直接存儲結點對象(含有兩個double屬性)到set容器中,同樣可以達到去重的目的。改進前性能分析圖如下:
可以看出to_string函數和map容器的insert函數開銷極大。改進後:
主要的CPU開銷是在set的insert操作。
7.看 Design by Contract,Code Contract 的内容:描述這些做法的優缺點,說明你是如何把它們融入結對作業中的。
Design by Contract未契約式程式設計,Code Contract是代碼契約,都指向一種軟體設計的方法,它規定軟體設計者應該為軟體元件定義正式的,精确的和可驗證的接口規範,該規範擴充了抽象資料類型的普通定義,包括前置條件,後置條件和不變量(來自wiki)。部落格給出了關于前提條件、後置條件和不變量的舉例介紹。簡單的說,契約作用于兩方,每一方都會完成一些任務,進而促成契約的達成,但同時,每一方也會接受一些義務,作為制定契約的前提,有任意一方無視了必盡的義務,則契約失敗。契約式程式設計要求我們在前提條件、後繼條件和不變量條件進行契約的檢查。契約所限制的,就是一個為了確定程式正常運作的條件。
Microsoft 在 .NET 4.0 中正式引入契約式程式設計庫。.NET4.0除了之前提到的三個概念之外,還增加 Assert(斷言),Assume(假設) 概念。部落格對.NET 4.0 中的契約式程式設計進行了較為詳細的分析。在.NET4.0中,對宏和條件編譯進行抽象封裝。這些成果大多集中在 System.Diagnostics.Contracts.Contract 靜态類中。該類中的大多數成員都是條件編譯。這樣,我們就不用再使用 #ifdef 和定義 CONTRACTS_FULL 之類的标記。更重要的是,這些行為被标準化,可以在多個項目中統一使用,并根據情況是否生成帶有契約的程式集。
-
優點:
1.使編譯器可以根據從契約中收集的資訊生成更好的代碼。
2.使開發人員的思維更清晰,有助于養成良好可互動的程式設計習慣,而且對于提高程式性能很有幫助。它對大多數程式設計都有很大的幫助。
3.契約式程式設計可以嚴格區分責任,大家都是平等的享有義務和權力,讓每個人都不必為了遷就他人的錯誤而進行艱難的編碼。
4.減少難以解釋的錯誤的機率,基本排除不可預知的參數群組合錯誤。
- 缺點:
A drawback of using these methods and Ensuring is that you can’t disable these checks in production.
也就是在生産中無法自由地把這些契約disable,真要引入這種風格到你的代碼時,得編寫一個子產品來随時關閉這種功能。
在我們的結對作業中,對接口的約定大概就是一個簡單的DbC,雙方開發完畢後通過接口實作子產品的對接,都需要按照契約完成任務,一定程度上展現了執行契約的義務在我,而核查契約的權力在對方。在單元測試的過程中,采用Assert斷言來檢測程式内部邏輯的正确性,它的使用也可以當作一種通過契約執行來測試設計的方式。
8.計算子產品部分單元測試展示。展示出項目部分單元測試代碼,并說明測試的函數,構造測試資料的思路。并将單元測試得到的測試覆寫率截圖,發表在部落格中。要求總體覆寫率到 90% 以上,否則單元測試部分視作無效。
單元測試部分,我們主要構造了L-L,L-S,L-R,S-S,S-R,S-L,R-R,R-S,R-L幾種情況下線相交、平行的測試,需要特殊處理的情況,比如斜率不存在,交點重合,S-S,S-R,R-R時可能出現交點不線上内部或者交點剛好是端點的情況,需要尤其注意。部分測試代碼如下:
//這個方法是對構造函數和直線相關計算功能的測試
TEST_METHOD(TestMethod2) {
line l1;
l1.store_coor("R 0 1 1 0");
Assert::AreEqual(l1.type, (string)"R");
Assert::AreEqual(l1.k, (double)-1);
Assert::AreEqual(l1.ulimited, false);
line l2;
l2.store_coor("S -1 -1 0 1");
Assert::AreEqual(l2.type, (string)"S");
Assert::AreEqual(l2.k, (double)2);
Assert::AreEqual(l2.ulimited, false);
}
//一般情況下的求取交點的測試
TEST_METHOD(TestMethod3) {
line l1;
l1.store_coor("L 0 0 1 1");
line l2;
l2.store_coor("L 1 0 0 1");
coor_4_line.push_back(l1);
coor_4_line.push_back(l2);
calcu_coor(0, 1);
Assert::AreEqual(intersection.size(), (size_t)1);
}
//交點在射線或線段的延長線上
TEST_METHOD(testMethod9) {
clear();
N = 4;
line l1, l2, l3, l4;
l1.store_coor("L -2 0 0 -2");
l2.store_coor("R 1 1 2 2");
l3.store_coor("R 1 0 0 2");
l4.store_coor("S -2 0 1 4");
coor_4_line.push_back(l1);
coor_4_line.push_back(l2);
coor_4_line.push_back(l3);
coor_4_line.push_back(l4);
cnt_coor_num();
Assert::AreEqual(intersection.size(), (size_t)2);
}
//斜率不存在且交點在端點處
TEST_METHOD(testMethod12) {
clear();
N = 3;
line l1, l2, l3;
l1.store_coor("S 3 2 3 1");
l2.store_coor("R 3 2 3 4");
l3.store_coor("S 3 -1 3 -2");
coor_4_line.push_back(l1);
coor_4_line.push_back(l2);
coor_4_line.push_back(l3);
cnt_coor_num();
Assert::AreEqual(intersection.size(), (size_t)1);
}
//重合交點
TEST_METHOD(testMethod14) {
clear();
N = 3;
line l1, l2, l3;
l1.store_coor("L 0 2 2 0");
l2.store_coor("R 0 0 1 1");
l3.store_coor("S 1 0 1 3");
coor_4_line.push_back(l1);
coor_4_line.push_back(l2);
coor_4_line.push_back(l3);
cnt_coor_num();
Assert::AreEqual(intersection.size(), (size_t)1);
}
//臨界資料
TEST_METHOD(testMethod15) {
clear();
N = 3;
line l1, l2, l3;
l1.store_coor("L 100000 100000 -3 19999");
l2.store_coor("L 99999 100000 4 8366");
l3.store_coor("L -6542 768 9999 -4");
coor_4_line.push_back(l1);
coor_4_line.push_back(l2);
coor_4_line.push_back(l3);
cnt_coor_num();
Assert::AreEqual(intersection.size(), (size_t)3);
}
//有斜率且斜率相同端點相交的SS
TEST_METHOD(testMethod21) {
clear();
N = 2;
line l1;
line l2;
l1.store_coor("S 0 0 1 1");
l2.store_coor("S 1 1 2 2");
coor_4_line.push_back(l1);
coor_4_line.push_back(l2);
cnt_coor_num();
Assert::AreEqual(intersection.size(), (size_t)1);
}
//其中一個垂直且假交點在垂直延伸線上的ss
TEST_METHOD(testMethod22) {
clear();
N = 2;
line l1;
line l2;
l1.store_coor("S 1 0 0 1");
l2.store_coor("S 1 1 1 2");
coor_4_line.push_back(l1);
coor_4_line.push_back(l2);
cnt_coor_num();
Assert::AreEqual(intersection.size(), (size_t)0);
}
//還有一部分關于圖形之間的位置關系:考慮L、R、S兩兩平行、相交的情況。從斜率角度出發,考慮任意兩個圖形,一個有斜率另一個斜率不存在,兩個斜率都存在(斜率相等、不相等),兩個斜率都不存在的情況以及上述情況的組合。
覆寫率和測試情況截圖:
9.計算子產品部分異常處理說明。在部落格中詳細介紹每種異常的設計目标。每種異常都要選擇一個單元測試樣例釋出在部落格中,并指明錯誤對應的場景。
錯誤類型 | 輸出 | 測試樣例 |
---|---|---|
類型不符合L S R | Please input line type as "L","S","R" at line | 2 K 1 2 4 5 a 0 0 1 1 |
‘-’後未緊跟數字 | Make sure ‘-’ is followed by number.Error at line | 3 L 0 0 1 1 R 3 2 0 5 S 9 - 7 8 |
坐标範圍超限 | Make sure that the range of points is(-100000,100000).Error at line | L 1000001 4 5 1 |
line中兩點重合 | Please input two different points.Error at line | L 1 4 5 1 R 3 2 0 3 S 7 8 7 8 |
輸入資料不完整 | TOO SHORT!Please input as "L\S\R int_x1 int_y1 int_x2 int_y2" for each line.at line | 4 L 6 4 3 2 S 9 7 5 |
輸入過多元素 | TOO LONG!Please input as "L\S\R int_x1 int_y1 int_x2 int_y2" for each line.Error at line | S 9 5 6 7 8 |
輸入非整數 | Please input integers.Error at line | S 9 5 6 7 R 4.45 6 7 6 |
找不到輸入檔案 | File is Not Found | input.txt移除 |
第一行不是整數 | Make sure the first line is an Integer that greater than or equal to 1. | a |
第一行小于1 | Make sure N is an integer greater than or equal to 1. | |
type和數字沒有空格 | Make sure there is a SPACE between number and letter at line | L0 0 1 1 3 |
N和直線數目不比對 | N does not match the number of lines. | L 0 1 1 3 R 0 0 1 1 |
出現以0開始的數字 | A number that begins with 0 at line | S 012 3 4 5 |
不止一個交點,即L\S\R 出現重合情況 | Infinitely intersections between line type-xx | L 1 0 2 1 L 0 -1 -1 -2 這一類的錯誤情況比較多,涉及到三種線兩兩組合以及斜率是否存在的問題,更多的測試資料可以在github位址的readme.md中看到。 |
以下是一部分運作截圖:
10.界面子產品的詳細設計過程。在部落格中詳細介紹界面子產品是如何設計的,并寫一些必要的代碼說明解釋實作過程。
本次界面子產品的實作用到了Qt插件.UI設計這一部分由于知識點比較繁雜,花費了非常多的時間,首先是閱讀官方文檔,對基本的類和函數有一個大緻的了解.比如信号槽機制以及一些繪圖控件.前期準備大概花了一兩天,實際寫代碼并沒有花費太久(主要還是負責封裝的同學接口寫的好,調用起來非常順暢,整體上功能的實作思路也就比較清晰)後期解決qt的各種報錯又花了很多時間,主要還是對lib,dll檔案的引用不夠了解,導緻在屬性設定上走了很多彎路.
現在回過頭來看代碼部分其實思路很簡單,功能也就那幾個.接下來講一下我的設計流程以及思路.
設計UI我是從功能的角度出發的,首先明确要實作那些功能:添加幾何對象,删除幾何對象,從檔案導入幾何對象的描述,繪制幾何對象,繪制幾何對象交點,顯示交點個數,抛出異常資訊,退出界面.
大緻明确了要實作這些功能後,我首先利用Qt Designer對窗體進行了大緻的可視化設計.
Designer(界面設計器)設計 ui 界面最終轉換為 C++ 代碼(ui_類名.h),和我們寫的 Qt 代碼是大同小異的,假如我們對某些部件操作不熟悉,不知道該如何用其相應函數,這時候我們通過 Designer(界面設計器)拖拽此部件,修改其所需屬性,接着編譯,看其自動轉換的 C++ 代碼如何實作,這樣可學習其相應函數的用法.
以上步驟完成後開始利用代碼進行具體的功能設計與實作.首先在源檔案中對幾個功能按鈕進行了信号槽設定,當butoon被按下後就會觸發相應的功能,這裡我學到了一點就是,按照qt的命名方法對函數進行命名可以省去connect部分的代碼,實作button與相應功能的直接連接配接.以下為幾個主要的功能,分别對應5個button(添加對象、删除對象、繪制幾何對象、繪制交點、添加檔案)
private slots:
void on_AddLine_clicked();
void on_DelLine_clicked();
void on_GenerateGraph_clicked();
void on_GeneratePoint_clicked();
void on_AddFile_clicked();
然後是幾個具體要實作的功能.添加幾何對象和删除幾何對象部分很簡單,就是調用了intersect子產品的addline和delline接口,并且進行了對輸入的資訊異常以及輸入的幾何對象有無窮交點進行了判斷,這裡展示部分代碼,一些細節部分都使用星号略去
void intersect_ui::on_AddLine_clicked()
{
*****
QString text = ui.InputStr->text();
if (text.size() == 0)
{
ui.error_messege->setText("please input text");
}
else
{
*****
addLine(l1);//添加直線
*****
if (message1 != "NO InfinitePoints!")
{
ui.error_messege->setText(qmessage1);
delLine(l1);//删除直線
}
}
ui.InputStr->clear();
}
void intersect_ui::on_DelLine_clicked()
{
*****
QString text = ui.InputStr->text();
if (text.size() == 0)
{
ui.error_messege->setText("please input text");
}
else
{
*****
delLine(l1);//删除直線
}
ui.InputStr->clear();
}
繪制幾何對象部分花費了比較長的時間.這裡用到了QT-Qcustomplot來實作基礎坐标軸功能以及圖像的繪制.其中直線,線段,射線的繪制我查閱了QCPAbstractItem官方文檔用到了QCPItemStraightLine以及QCPItemLine類來實作.這裡以繪制直線為例進行展示,射線和線段部分略去
void intersect_ui::on_GenerateGraph_clicked()
{
*****
vector<line> lines = getLine();//傳回直線集合
for (int i = 0;i < lines.size();i++)
{
if (lines[i].type == "L")
{
QCPItemStraightLine* l = new QCPItemStraightLine(ui.widget);//構造直線
ui.widget->addItem(l);//添加到圖中
l->setPen(QPen(Qt::blue)); //設定畫筆
l->point1->setCoords(lines[i].x1, lines[i].y1);
l->point2->setCoords(lines[i].x2, lines[i].y2);
ui.widget->replot();
}
else if (lines[i].type == "R")
{
*****
}
else if (lines[i].type == "S")
{
*****
}
}
//設定可拖拽 滾輪放大縮小 圖像可選擇
ui.widget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom | QCP::iSelectPlottables);
}
通過查閱資料我在坐标軸中實作了拖拽,滾輪放大縮小功能,便于檢視生成的幾何對象.
生成交點與這裡大同小異,就是調用了intersect子產品中的傳回交點坐标接口然後根據坐标點資訊進行繪制,這裡不再詳述.
輸入檔案部分調用核心子產品中的讀檔案接口和異常處理接口,實作也非常簡單.
void intersect_ui::on_AddFile_clicked()
{
QString text = ui.InputFileName->toPlainText();
string str = text.toStdString();
string message = inputHandler(str);
QString qmessage = QString::fromStdString(message);
if (message == "Everything is ok!")
{
string message1 = InfinitePoints();
QString qmessage1 = QString::fromStdString(message1);
if (message1 == "NO InfinitePoints!")
{
readin(str);//讀入資料
}
else
{
ui.error_messege->setText(qmessage1);
}
}
else
{
ui.error_messege->setText(qmessage);
}
11.界面子產品與計算子產品的對接。詳細地描述 UI 子產品的設計與兩個子產品的對接,并在部落格中截圖實作的功能。
子產品對接其實我在上一點中也已經提到了.我們的思路很簡單,實作什麼功能的槽函數就對接實作什麼功能的計算子產品的接口.
舉例來講,就是UI子產品的以下函數
private slots:
void on_AddLine_clicked(); //添加幾何對象
void on_DelLine_clicked(); //删除幾何對象
void on_GenerateGraph_clicked(); //繪制幾何對象圖形
void on_GeneratePoint_clicked(); //繪制交點
void on_AddFile_clicked(); //讀檔案
分别對應調用核心子產品中以下函數
DLL_API void addLine(line l);//添加幾何對象
DLL_API void delLine(line l);//删除幾何對象
DLL_API vector<line> getLine();//傳回幾何對象集合
DLL_API set<Point> getPoints();//傳回交點
DLL_API void readin(string FileName);//從檔案讀入資料
同時考慮到錯誤處理,還調用了用于檢查檔案格式,判斷是否有無窮交點等的函數.具體怎麼調用,在什麼時候調用,上面的代碼部分都進行了展示.從總體的邏輯上來看就是以下三步:
- 槽函數響應事件
- UI子產品中相應函數被執行
- UI子產品中函數調用核心子產品中函數來實作特定功能并更新核心子產品資料
功能展示截圖如下:
- 繪制幾何對象及交點,顯示交點個數,縮放大小
- 顯示異常資訊(這裡展示了輸入為空、找不到該檔案、某兩個幾何對象有無窮交點的錯誤資訊)
-
addLine和delLine
導入txt:(有可能部分線沒有出現在界面内,在其他象限,拖動一下坐标軸即可)
addLine:
結果:(有可能部分線沒有出現在界面内,在其他象限,拖動一下坐标軸即可)
delLine:
結果:
若addLine有誤,則會提示error message:
12.描述結對的過程,提供兩人在讨論的結對圖像資料(比如 Live Share 的截圖)。關于如何遠端進行結對參見作業最後的注意事項。
遠端結對感覺還是挺有挑戰的,在作業的第一個星期因為我和隊友都有其他任務,是以交流比較少,大家是分頭行動,比如增加功能和測試,各司其職;在第二個周開始共享螢幕,視訊交流,效率還是提升很多,對接口的設計和使用也更為快捷。螢幕共享截圖:
13.看教科書和其它參考書,網站中關于結對程式設計的章節,例如:部落格,說明結對程式設計的優點和缺點。同時描述結對的每一個人的優點和缺點在哪裡(要列出至少三個優點和一個缺點)。
在這次結對項目中,我和隊友駕駛員(Driver)和領航員(Navigator)的身份不是固定的,比如在錯誤處理階段和IU設計開發階段,我倆的身份就是互換的,在減小任務壓力上還是很有作用的。但是這次作業的不足是我倆對作業進度的掌握不好,前期進度緩慢,後期太靈活。沒有完成附加題也比較遺憾。這是在以後的作業中需要改進的地方。
1.結對程式設計能提供更好的設計品質和代碼品質,兩人合作能有更強的解決問題的能力。
2.對開發人員自身來說,結對工作能帶來更多的信心,高品質的産出能帶來更高的滿足感。
3.在心理上, 當有另一個人在你身邊和你緊密配合, 做同樣一件事情的時候, 你不好意思開小差, 也不好意思糊弄,提高責任感。
4.讓代碼不斷處于複審中,能及時地發現問題和解決問題,避免把問題拖到後面的階段。
1.在個人項目的基礎上增加了溝通成本,很幸運的是我有一個同理心很強也很負責的隊友。
2.兩個人系統或者軟體版本不比對帶來的子產品對接問題是真的心累...
優點 | 缺點 | |
---|---|---|
16005046 | 1.溝通能力強,在結對過程中有什麼問題都是很及時的解決。 2.學習新東西很快,效率很高(尤其是到後期哈哈哈),在一個晚上通過無數百度、谷歌、必應、csdn還有其他資料解決了計算子產品和UI子產品對接的問題。 3.心态平和,遇到問題不急躁,值得我學習。 | 有時候可能沒有注意到一些小細節。 |
17373532 | 1.還算比較負責,比較主動積極。 2.能夠仔細分析代碼解決bug。 3.比較細心。 | 遇到問題比較急躁;并且效率比較低。 |