2007 年 06 月 的封存

Delphi & VCL For Web技術研討會

忙了2個多星期之後Delphi & VCL For Web技術研討會終於圓滿結束了,這次來參加研討會的朋友人數不少,反應也都不錯,我也玩得蠻愉快的,整個展示的過程沒什麼出錯,看來腦筋還可以。

在這次的研討會中除了VCL For Web本身令人驚嘆的功能之外,我個人認為這次研討會中最好玩的地方應該就是整合JavaScript的說明了,我也在現場做了一個整合Mootools的動態範例,效果真的不錯,希望參加研討會的朋友也能夠試試研討會中提及的兩個JavaScript函式庫,做出更有趣的應用。

下面是此次研討會的投影片和範例程式碼,有興趣的朋友可以自行下載。

投影片:

http://liwei.csdn.net/download/DelphiAjaX.pdf

 

範例程式碼:

http://liwei.csdn.net/download/DelphiajaxDemos.rar

3 則迴響

C++Builder 2007系列1-如何使用TDD For C/C++

現在不管開發人員是使用什麼程式語言,測試驅動開發(TDD)已經成為許多開發人員不二的選擇,在測試驅動開發框架JUnitJava開發界發行之後,xUnit系列很快的在各種不同的程式語言界中盛行,例如C#使用的NUnitDelphi使用的DUnit等。即使是如最近的新星Ruby也有著支援良好的測試驅動開發框架。但奇怪的是對於C/C++這樣老牌的程式語言,測試驅動開發框架的支援卻一直無法像JavaC#或是Delphi那樣的自然又能夠整合在IDE中讓C/C++的開發人員能夠很直覺又舒服的使用。

但別誤會是C/C++沒有測試驅動開發框架,反之,目前有數個被使用的C/C++測試驅動開發框架,例如CppUnitBoost.TestUnit++CxxTest等。筆者本身在BCB2007沒有推出之前就是使用CxxTest,雖然我個人覺得CxxTestC/C++測試驅動開發框架最好用的,但是CxxTest仍然不是C/C++開發人員First-Class型態的C/C++測試驅動開發框架,它需要開發人員使用Perl或是Python轉換,又無法充分整合在筆者使用的IDE 中,因此不管是再熟練使用CxxTest,由於不是First-Class型態的C/C++測試驅動開發框架的原因,因此或多或少都拖慢了使用TDD For C/C++的開發速度。

C++Builder 2007對於底層開發功能的強化之一就是它終於提供了TDD For C/C++的開發能力,C++Builder 2007藉由在DUnit之外提供了充分的C/C++ Wrapper類別和表頭檔而讓C/C++的開發人員能夠很自然的使用xUnit系列的標準測試驅動開發框架,而且又充分的整合在C++Builder 2007IDE(後文開始使用CUnit來代表C++Builder 2007提供的測試驅動開發框架),終於讓C/C++的開發人員擁有了First-Class型態的C/C++測試驅動開發框架,現在C++Builder的開發人員終於不必再屈就於不標準的C/C++測試驅動開發框架,也不必羨慕Java/C#/Delphi開發人員能夠擁有整合在IDE中的測試驅動開發框架,CUnit可以大幅增加C++Builder開發人員使用TDD方式開發軟體的速度。

在下文中筆者將以一個簡單的範例來說明如何使用CUnit

假設現在筆者需要撰寫一個C/C++類別來計算如下圖的汽車稅:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjkue4ukpLfG2PY9xwNf9I4s0wox9f8ZNcaylb-CWPCwyjE9bFi0QZF3

從上圖中我們可以看到汽車稅種類非常的繁雜,使用TDD開發方式可以幫助我們快速的測試我們的程式碼是否正確。

因此,首先我在C++Builder 2007中建立一個Package專案pkTDdDemo.bpl,並且在其中先建立一個TCarTax類別,其中TcarTax定義了一個Calculate方法,它最初的程式碼只提供上圖中『自用小客車』種類,1201CC1800CC級距中『燃料稅』的金額4800:

int TCarTax::Calculate(const int iCC)

{

int iResult
= 0;

if (iCC
>= 1201 && iCC <= 1800)

iResult =
4800;

return
iResult;

}

一旦有了這個類別之後,我們可以立刻開始建立TDD專案,並且在TDD專案中建立測試案例(Test Case)來測試TCarTax::Calculate方法是否正確,如果一旦正確的話,那麼當我們繼續的加入更多的程式碼時,我們可以不斷的再執行測試案例以確保稍後加入的程式碼並沒有影響以前程式碼的正確性,也可以持續的增加新的測試案例以測試新加入的程式碼。

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjl5_scY5zSYelXDWoi9k6ZcGE9tcw0Uo1KFCMX2VR8gjB-Jhd0-B9-_

要建立TDD專案,讓我們先點選專案管理員中的專案群組節點,再點選滑鼠右鍵,選擇在專案群組中建立新的專案:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjmAt7XFHRAMNbaLro1bhrKLa-h6Vy3N-vYUUvOSkLGB42OSB2YIaAMG

再選擇建立Unit Test|Test Project圖像建立TDD專案:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjn8KwkD_HtgDLVTQTyFlHXY_homIXbHqztwHtyymxlyw7TPg1UdBqZ_

C++Builder 2007便會顯示如下的精靈詢問您有關TDD專案的細節,它會要求您建立TDD專案的名稱,例如在下面的精靈中我設定TDD專案的名稱為pkTDDDemoTestTCarTax。在Location中您可以選擇TDD專案儲存的目錄以及是否要把這個TDD專案加入目前的專案群組中:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjkJIQhNDikGui5g4XjK9VK4FlEWbDm7cHJadHbnr5mwJl7_OXs0gbJa

點選Next之後,接著C++Builder 2007會詢問您使用的TDD測試界面為何,xUnit系列通常提供2種界面,GUIConsole模式,筆者習慣使用GUI模式,因此在下面的精靈中選擇GUI:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjkVb1YB10dZm7iWfwlFT2k7-wZCtpO9LfRGNi5ETYGDrIom8NAtbHCA

最後點選Finish即可在產生如下的專案群組:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjntXyynGfCCI6n7bPvg5jsRjajcl4I9TVgj5SzN7SW6SEMCc2h_PPiF

有了TDD專案之後,現在我們就可以繼續在其中建立測試案例了。在pkTDDDemoTestTCarTax專案中點選File|New|Other…功能表,在Unit Test中現在便會出現Test Case圖像,選擇它:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjmSDgDvr1IJP_FuZgEwKqRyNEmJGkUJubd86QjZS8r1RSSeZOU2H15S

再於下一個對話盒中選擇我們要測試的C/C++類別TCarTax.h,此時精靈便會掃瞄整個表頭檔中定義在public的函式,這時它只找到Calculate,因此精靈便自動選擇要為這個函式產生測試案例。如果表頭檔中定義了許多的public函式,精靈會全部顯示出來並且讓開發人員選擇要為那些函式產生測試案例:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjnCSwnuLPydwBh5bXIZluUhRsDpLe_-Nh7UEq8qHYxUbpBWLPnqOwLE

點選Finish之後,C++Builder便會產生如下的骨架測試類別和程式碼。由於本文目的不是教導TDD,因此不再解釋TDD基本的觀念:

#include <vcl.h>

#pragma hdrstop

#include <TestFramework.hpp>

class TTestTCarTax : public TTestCase

{

public:

__fastcall
virtual TTestTCarTax(AnsiString name) : TTestCase(name) {}

virtual
void __fastcall SetUp();

virtual
void __fastcall TearDown();

__published:

void __fastcall
TestCalculate();

};

void __fastcall TTestTCarTax::SetUp()

{

}

void __fastcall TTestTCarTax::TearDown()

{

}

void __fastcall TTestTCarTax::TestCalculate()

{

// int
Calculate(const int iCC)

}

static void registerTests()

{


_di_ITestSuite iSuite;

TTestSuite*
testSuite = new TTestSuite("Testing TCarTax.h");

if
(testSuite->GetInterface(iSuite)) {

testSuite->AddTests(__classid(TTestTCarTax));

Testframework::RegisterTest(iSuite);

} else {

delete
testSuite;

}

}

現在先include TCarTax的表頭檔定義在TTestTCarTax:

#include "..TCarTax.h"

再於private中宣告一個物件變數:

private:

TCarTax
*pTax;

再於SetUpTearDown中分別建立和刪除物件變數:

void __fastcall TTestTCarTax::SetUp()

{

pTax = new
TCarTax();

}

void __fastcall TTestTCarTax::TearDown()

{

delete
pTax;

}

最後就是在TTestTCarTax::TestCalculate()中撰寫測試程式碼了,例如首先我們可以撰寫如下的程式碼:

void __fastcall TTestTCarTax::TestCalculate()

{

// int
Calculate(const int iCC)


CheckEquals(6120, pTax->Calculate(2000));

}

我們根據圖1測試TCarTax物件是否能夠正確的計算2000CC汽車的燃料稅是6120元。

這時準備編譯pkTDDDemoTestTCarTax專案,先在專案管理員中加入TCarTax.cpp檔案以便可以連結到這個C/C++類別, 接著在IDE中執行它。我們就可以看到下面的TDD GUI程式出現中,點選上方綠色箭頭按鈕以執行測試TTestTCarTax::TestCalculate()的測試案例:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjmjJwbuJzciTY7vmCun2QgAvE93lYlT8Q_CC2z6UcVBSO5deOPdkPBR

很快我們發現測試案例出錯了,它告訴我們TestCalculate期望回傳值是6120,但是實際的回傳值是0,所以這個測試案例不正確。為什麼? 原來我們還沒有撰寫2000CC汽車燃料稅的程式碼,目前只實作了1201~1800的汽車燃料稅,因此我們可以修改TestCalculate如下,:

void __fastcall TTestTCarTax::TestCalculate()

{

// int
Calculate(const int iCC)


CheckEquals(4800, pTax->Calculate(1600));

}

再次執行測試:

http://tkfiles.storage.msn.com/y1pPKnBvkPtOjndCRZ_L08w3mUN8qU6cXYaeKTOv4kCe3IdouyFv4QwB-dXWW7Hk36R

測試案例就正確了。

現在我們可以回到TCarTax類別的Calculate方法,再加入更多的實作程式碼,例如:

int TCarTax::Calculate(const int iCC)

{

int iResult
= 0;

if (iCC
>= 1201 && iCC <= 1800)

iResult =
4800;

else

if (iCC
>= 1801 && iCC <= 2400)

iResult
= 6212;

return
iResult;

}

然後在TTestTCarTax::TestCalculate()加入測試1801~2400CC的汽車燃料稅有沒有錯誤:

void __fastcall TTestTCarTax::TestCalculate()

{

// int Calculate(const
int iCC)


CheckEquals(4800, pTax->Calculate(1600));


CheckEquals(6210, pTax->Calculate(2000));

}

如此一直使用撰寫實作程式碼,撰寫測試案例周而復始下去,我們可以一直測試後加入的程式碼是否有影響到以前程式碼的正確性。

好了,介紹到這裡我相信C++Builder的開發人員就瞭解如何使用C++Builder 2007中的TDD了。事實上如果讀者執行上照著上面步驟執行最後的TTestTCarTax::TestCalculate()測試案例是會產生失敗的,為什麼?
呵呵,因為我故意把實作程式碼寫錯了,留給讀者去改正好了,Have Fun!

6 則迴響

許多的CodeGear線上活動

最近CodeGear將在線上舉行許多重要的活動,邀請各位參加。下面是這些活動的訊息URL :

DelphiC++的發展路線資訊

http://dn.codegear.com/article/36620

DelphiC++的發展路線線上研討會

http://dn.codegear.com/article/36655

CodeGear線上開發者日

http://dn.codegear.com/article/36647

 

歡迎各位網友踴躍參加,謝謝。

10 則迴響

2007/06 Delphi&VCL For Web程式設計研討會

忙完了C++Builder 2007產品發表之後,馬上就要準備6月底的VCL For Web程式設計研討會。自從CodeGear在台灣成立運作之後,工作簡直太忙了,把我一個人當3個人用,以前我們在Borland舉辦技術研討會至少要3個星期的準備時間,從研討會主題的確定,Marketing的準備,相關網上報名的相關作業,到我們技術人員開始抓頭騷腦構想內容和範例程式,都需要一定的時間。但是到了CodeGear之後所有的工作時間都大幅的壓縮,讓我喘不過氣來。例如在C++Builder
2007
產品發表之後,扣掉所有的假日和端午節假期以及其他的CodeGear內部的工作,Delphi&VCL For Web程式設計研討會居然只剩不到5天的時間讓我構想內容和準備投影片/範例,搞得我終日眉頭深鎖,因為時間真的太少了。還好7月就要到了,也到了我每年一次開車環島之旅,算算今年應該已經是連續第5年了,我又可以去我最喜歡的花蓮了。

目前我大致整理了我想要講下面的內容,不過我不知道有沒有時間準備所有的東西,也不確定有足夠的時間能夠講所有我想講的內容,我只能盡力了。

  • VCL For Web程式設計
  • VCL For Web開發示範
    • 1VCL For
      Web
      應用程式

    • 步驟1 – 建立VCL For
      Web
      應用程式

    • 步驟2 – 加入資料庫功能
    • 步驟3 – 加入使用Template

    • 步驟4 – 結合JavaScript
  • 休息
  • Delphi AJAX程式設計
    • 結合資料庫和Ajax
  • 結合AJAXECO開發豐富的Web解決方案
    • 示範
  • VCL For Web, ECORoR

在焦頭爛額忙於準備這個研討會的同時,我只能催眠自己『7月要休假了』,『7月要環島了』。

『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』,『我要去花蓮』…………………

12 則迴響

C++Builder 2007產品發表會

6月初結束了C++Builder 2007產品發表會之後,又要馬上開始準備月月下旬台灣3場的Delphi技術研討會以及月底的C++ Builder 2007線上研討會。瞭解外商的朋友也會知道6月是Q2的最後一個月,壓力也是隨著每一天而愈來愈大,因此工作也愈來愈繁忙。

由於這次大陸和台灣安排的C++Builder 2007產品發表會行程有所衝突,因此我只能支援大陸在深圳的C++Builder
2007
產品發表會,之後立刻趕回台灣在台北,台中和高雄進行3場的C++Builder 2007產品發表會。這次台灣的C++Builder 2007產品發表會算是相當成功,台北的C++Builder 2007產品發表會來了大90人,在當日雨勢盛大的情形下能夠有這麼多人出席讓我們相當的高興和興奮,只可惜由於那段時間我在台灣,香港和大陸飛來飛去可能飛的頭的昏了,因此在最後展示C++Builder時出了一個錯誤,在此向現場參加的朋友致歉,不過我在台中,高雄進行展示卻非常的順暢,沒有出錯。我想可能是在台北時由於前一晚才匆忙從大陸飛回,一大早又出門迎接CodeGear的亞太副總裁Nick Jackson先生,所以頭昏眼花了吧,看來我是老了。

下面是C++Builder 2007產品發表會的投影片,有需要的朋友可以自行下載,同時上傳一些台北現場的照片供各位稍加欣賞,一同分享一下當天熱絡的氣氛。

http://liwei.csdn.net/down/070604_07Q2__BCB_TW_Seminar_TC.ppt   繁體版

http://liwei.csdn.net/down/070604_07Q2__BCB_TW_Seminar_SC.ppt  體版

13 則迴響