結對編程收穫

      前先後後耗時兩週的結對編程做業,我經歷了不少,收穫了不少,真是感受本身從一個什麼都不懂的菜狗到一個偉大的程序員又進了一步啊!因爲收穫很是之多,下面我將一一列出。c++

  • c++學習

因爲本人以前實在太菜,因此首先惡補了C++知識,具體以下:git

  1. 類和對象

C++ 在 C 語言的基礎上增長了面向對象編程,C++ 支持面向對象程序設計。類是 C++ 的核心特性,一般被稱爲用戶定義的類型。程序員

類用於指定對象的形式,它包含了數據表示法和用於處理數據的方法。類中的數據和方法稱爲類的成員。函數在一個類中被稱爲類的成員。數據庫

定義一個類,本質上是定義一個數據類型的藍圖。這實際上並無定義任何數據,但它定義了類的名稱意味着什麼,也就是說,它定義了類的對象包括了什麼,以及能夠在這個對象上執行哪些操做。類定義是以關鍵字 class 開頭,後跟類的名稱。類的主體是包含在一對花括號中。類定義後必須跟着一個分號或一個聲明列表。例如,咱們使用關鍵字 class 定義 Box 數據類型,以下所示:編程

class Box
{
   public:
      double length;   // 盒子的長度
      double breadth;  // 盒子的寬度
      double height;   // 盒子的高度
};

關鍵字 public 肯定了類成員的訪問屬性。在類對象做用域內,公共成員在類的外部是可訪的。另外還有private 或 protected。他們的區別好像在繼承中有所體現。api

2.繼承數組

面向對象程序設計中最重要的一個概念是繼承。繼承容許咱們依據另外一個類來定義一個類,這使得建立和維護一個應用程序變得更容易。這樣作,也達到了重用代碼功能和提升執行時間的效果。當建立一個類時,咱們不須要從新編寫新的數據成員和成員函數,只需指定新建的類繼承了一個已有的類的成員便可。這個已有的類稱爲基類,新建的類稱爲派生類。繼承表明了 is a 關係。網絡

一個類能夠派生自多個類,這意味着,它能夠從多個基類繼承數據和函數。定義一個派生類,咱們使用一個類派生列表來指定基類。類派生列表以一個或多個基類命名,形式以下:app

class derived-class: access-specifier base-class

 

其中,訪問修飾符 access-specifier 是 public、protectedprivate 其中的一個,base-class 是以前定義過的某個類的名稱。若是未使用訪問修飾符 access-specifier,則默認爲 private。框架

當一個類派生自基類,該基類能夠被繼承爲 public、protected private 幾種類型。繼承類型是經過上面講解的訪問修飾符 access-specifier 來指定的。咱們幾乎不使用 protected private 繼承,一般使用 public 繼承。當使用不一樣類型的繼承時,遵循如下幾個規則:

    • 公有繼承(public):當一個類派生自公有基類時,基類的公有成員也是派生類的公有成員,基類的保護成員也是派生類的保護成員,基類的私有成員不能直接被派生類訪問,可是能夠經過調用基類的公有保護成員來訪問。
    • 保護繼承(protected): 當一個類派生自保護基類時,基類的公有保護成員將成爲派生類的保護成員。
    • 私有繼承(private):當一個類派生自私有基類時,基類的公有保護成員將成爲派生類的私有成員。

多繼承即一個子類能夠有多個父類,它繼承了多個父類的特性。

好,有了上面這些東西,雖然也不是很懂,可是用於現學現賣的快開發是夠用了。下面咱們來具體看看Qt。

  • QT概觀

首先我並不知道qt是什麼東西,因而我上網查了下:

Qt是桌面,嵌入式和移動的跨平臺應用開發框架。支持的平臺包括Linux,OS X,Windows,VxWorks,QNX,Android,iOS,BlackBerry,Sailfish OS等。

Qt自己不是一種編程語言。它是一個用C ++編寫的框架。但它不只僅只是一個GUI工具包,它提供了在網絡,數據庫,OpenGL,Web技術,傳感器,通訊協議(藍牙,串行端口,NFC),XML和JSON處理,打印,PDF生成等領域的跨平臺開發的模塊。

Qt擁有本身的集成開發環境(IDE),名爲Qt Creator。它運行在Linux,OS X和Windows上,提供智能代碼完成,語法高亮,集成幫助系統,調試器和分析器集成以及全部主要版本控制系統(例如git,Bazaar)的集成。

看完這些後我對qt仍是一頭霧水,可是這並不妨礙我現學現賣。

首先,咱們來看看界面:

                東西不少,組件更多。看到了這些東西后,我終於能大概看懂例程了

               

                這就是主程序。固然了,我是基本看不懂的。可是這並不妨礙我編程,由於我發現了竟然能夠拖部件編輯UI。

               首先咱們來建立工程

 

 

 

 

好了,經過以上步驟,咱們就成功創建了一個窗口工程。當時以爲很開心,但其實這玩意兒其實已經給之後的爆炸埋下了伏筆。沒有資料參考,沒人給出解釋,咱們兩我的就這樣肝了一天一晚上。最後只知道多是編譯器不支持,而後對接也變得異常麻煩。

回到正題,工程建好後,也知道拖拽,可是仍是不會寫程序。爲啥呢?不知道程序怎麼運行的。不知道各個槽函數運行完了會回到哪裏,也不知道各個按鈕,layout。。。到底怎麼設置,有哪些參數,窗口cpp裏到底該寫啥。最後咱們一頓亂寫,漸漸找出的辦法。

反正都要用的變量就寫全局,槽函數就當中斷,main裏啥都不用管。

嗯,而後就一通亂寫,就把程序寫完了。

  • 結對編程

                寫的過程當中,我倆輪流主刀,另外一人就在旁邊看着。常常會有想搶過鍵盤的衝動。咱們發現,關於實現的細節,兩人討論過多反而會拖慢進度。一段時間後,迫於時間課業壓力,我倆分模塊編程,速度大爲提升。

1.結對編程並不適用於簡單的寫代碼的工做,結對編程更適用於解決一些方向性的問題

2.結對編程中,雙方的互動目的在於開啓思路,避免單獨編程時思惟容易阻塞的狀況。

3.對於本身不徹底理解的任務,以及耦合度較高的任務,結對編程能夠大大縮短調試及測試的時間。

4.結對編程可讓別人迅速地審查本身寫的代碼,避免了不少的陷阱和缺陷。

5.結對編程可讓同組的人分享關於系統細節的知識,而且互相學習編程技巧。

 

  可是結對編程也有一些缺點。雖然它必定程度地縮短了開發時間,並且對代碼質量產生了正的邊際效益,可是它同時增長了開發人員的工做時間,也就是說與單獨編程相比花費增長了。因此我以爲在開發過程當中,應該先儘可能將任務分解成獨立的模塊,各幹各活,在模塊之間發生耦合的時候再進行結對編程,這樣可讓效率最大化。

 

 

 

到此爲止,原本覺得就能這樣結束軟工做業。可是,噩夢纔剛剛開始

  • 對接

 

                原本覺得直接用.h就好,可是老師要求要用dll。這確實有好處。因而咱們又開始上網查資料對接,在這過程當中又學到了好多好多東西。下面詳細給出:

                總共有三種方法:

    1. 使用Win32 API
      在顯式連接下,應用程序必須進行函數 調用以在運行時顯式加載 DLL。爲顯式連接到 DLL,應用程序必須:
      調用 LoadLibrary(或類似的函 數)以加載 DLL 和獲取模塊句柄。
       調用 GetProcAddress,以獲 取指向應用程序要調用的每一個導出函數的函數指針。因爲應用程序是經過指針調用 DLL 的函數,編譯器不生成外部引 用,故無需與導入庫連接。
      使用完 DLL 後調用 FreeLibrary。可是咱們用的Qt,因此固然不用他啦。
    2. #include <QApplication>  
      #include <QDebug>  
      extern "C"    //因爲是C版的dll文件,在C++中引入其頭文件要加extern "C" {},注意  
      {  
              #include "dll.h"  
      } 
       int main(int argv ,char **argv)  
      {  
             QApplication app(argv,argv);  
             HelloWordl();          //調用Win32 API 彈出helloworld對話框  
             qDebug()<<add(5,6);    // dll 中我本身寫的一個加法函數  
             return 0;  //完成使命後,直接退出,不讓它進入事件循環  
      }  

隱式調用

    這個時候咱們須要三個文件,頭文件(.h)、導入庫文件(.lib)、動態連接庫(.dll),具體步驟以下:

一、首先咱們把 .h 與 .lib/.a 文件複製到程序當前目錄下,而後再把dll文件複製到程序的輸出目錄,

二、下面咱們在pro文件中,添加 .lib 文件的位置: LIBS+= -L D:/hitempt/api/ -l myDLL

         -L 參數指定 .lib/.a 文件的位置

         -l  參數指定導入庫文件名(不要加擴展名) 

         另外,導入庫文件的路徑中,反斜槓用的是向右傾斜的 

三、在程序中include頭文件(我試驗用的dll是用C寫的,所以要用 extern "C" { #include "dll.h" } )

 上面是隱式調用的實例代碼。

隱式調用至關簡潔,可是咱們嘗試了一天,用盡各類辦法以後,就是有問題。最終咱們得知,咱們的編譯器不支持。咱們以不知道這是什麼鬼畜緣由,而後就只能嘗試最麻煩的顯示調用

3.顯示調用

#include <QApplication>  
#include <QLibrary>  
#include <QDebug>  
#include <QMessageBox>  
#include "dll.h"             //引入頭文件  
typedef int (*Fun)(int,int); //定義函數指針,以備調用  
int main(int argc,char **argv)  
{  
    QApplication app(argc,argv);  
    QLibrary mylib("myDLL.dll");   //聲明所用到的dll文件  
    int result;  
    if (mylib.load())              //判斷是否正確加載  
    {  
        QMessageBox::information(NULL,"OK","DLL load is OK!");  
        Fun open=(Fun)mylib.resolve("add");    //援引 add() 函數  
        if (open)                  //是否成功鏈接上 add() 函數  
        {  
            QMessageBox::information(NULL,"OK","Link to Function is OK!");  
            result=open(5,6);      //這裏函數指針調用dll中的 add() 函數  
            qDebug()<<result;  
        }  
        else  
            QMessageBox::information(NULL,"NO","Linke to Function is not OK!!!!");  
    }  
    else  
        QMessageBox::information(NULL,"NO","DLL is not loaded!");  
        return 0;  //加載失敗則退出28}  

如上,每一個函數都要改,能夠說是至關麻煩了。並且每一個組的函數名還不同,因此對接是一項很是單調有無聊的工做。

這並不算完。

因爲採用了顯式調用,函數名是必需要知道的。可是我也不知到爲何反正core組的函數名就是否是簡簡單單看到的那樣,而是還要加上各類亂七八糟的東西。沒有經驗的咱們又卡了老半天。最後用了個什麼depend看了函數名,最後才終於能夠用了。

而後就是對接操做。前兩組設置和調用方式差很少,都是結構體設置+數組存儲,對接起來稍快。後來有的組參數稍多,設置方式不一樣,存取模式也不同,有的又是文件讀取,修改複雜度很大。不一樣編譯器又時不時的叫錯,至關繁瑣。值得高興的是,大部分組的魯棒性都很好,極少出現崩潰的狀況。

對接收穫:

 

  1. 接口應該一開始就商量好,不然每一組都會改,至關麻煩。
  2. 沒事別一開始就搞後果教育,我並非非要栽跟頭才能聽進去。

 

 

 

 

小結:

說了這麼多,以上都是次要的。此次結對做業最最重要的收穫固然是磨練了個人意志品質,培養了我細緻耐心的性格,自我情緒管理以及欠多少做業都不慌的淡定。

相關文章
相關標籤/搜索