使用 XML 當作單元測試中的測試資料來源

在 MSDN 對單元測試的介紹中, 對單元測試的做了基本的介紹。站在我這個 former QA 的角度來看, 一般人如果只是照著上面的簡單介紹去做單元測試, 然後就以為單元測試只不過是這樣而已的話, 未免把單元測試看得太單純。事實上「使用資料驅動的單元測試」才是真正實用的。怎麼說呢? 因為, 如果我們不是餵給測試單元很多預先知道結果的測試資料去進行測試的話, 所謂的「自動化測試」只是空談罷了。為什麼團隊裡面必須有 QA 存在? 就是因為我們需要 QA 站在開發者的對立面, 試圖去找出開發者沒注意或甚至沒想到的弱點; 有攻有防, 才能確保產品的品質...

...繼續閱讀 »

使用 Decorator 樣式實現輸入裝置的 IoC 概念

對傳統程式設計師而言, XNA 可以算是一個面臨多種適用狀況的開發環境。為什麼呢? 因為你所開發的程式, 只要經過小小的修改, 就可以移轉到 PC、XBOX 與 WP7 裝置上面。而它的輸入裝置也很多樣, 包括鍵盤、滑鼠、XBOX 搖桿、觸控輸入, 甚至其它。到目前為止, 我手頭上可以運用的輸入裝置除了鍵盤、滑鼠, 還有 XBOX 搖桿 (這東西花了我一千多塊錢), 但是事實上 XNA 可以接受更多的輸入裝置, 例如 WP7 的(多點)觸控輸入、加速感應裝置, 甚至未來的語音輸入裝置, 還有 Kinect 等等。如果我們希望在程式裡同時支援這些裝置, 無可避免的, 我們都必須為每一項撰寫對應的程式...

...繼續閱讀 »

.Net Interoperation 入門

Interoperation是工程界普遍使用的字眼, 專指在不同系統中搭起的簡易或臨時的元件, 藉由製訂某些共通的協定, 以便這些系統可以共同作業。由於這個溝通界面可能並非非常嚴謹, 所以當其運作時, 必須特別有人從旁監督、隨時調整和修改。在.Net 中, Interoperation 專指從.Net 應用程式中存取unmanaged 程式元件的行為。我們知道, 當我們撰寫.Net 應用程式或元件時, 這些元件都是managed (受.Net 執行環境所管理的)。但是如果是使用VB6/C/C++ 所撰寫的非.Net 程式或元件, 對.Net 而言, 都算是unmanaged。如果我們企圖在.Net 程式中存取那些unmanaged 程式或資源, 就必須透過Interoperation 技巧與COM 介接。此外, 許多Windows API 並沒有.Net 的對應函式。換句話說, 如果我們要撰寫Windows 應用程式, 而且我們必須使用到Windows API 的話, 我們沒辦法從.Net Framework 執行環境中找到對應的方法, 而必須透過Interoperation 去呼叫W

...繼續閱讀 »

.Net 集合型別的效率探討

我要在這裡說明的所謂「集合型別」指的並不是泛指 System.Collections 命名空間下的各種型別, 而是特別指自從 .Net 3.5 之後才出現的 Sets (集合) 型別, 特別是 System.Collections.Generic.HashSet 與 System.Collections.Generic.SortedSet 這兩個實作 ISet 介面的類別。ISet 介面是專門針對集合作業而設計的, 它提供了幾個特別的方法...

...繼續閱讀 »

[入門] .Net 非同步處理與同步機制全解析 (一)

不管你學的是何種程式語言, 非同步及平行處理總是最令人費解的部份之一。如果你沒有過人的邏輯觀念, 那麼要把非同步程式寫好, 恐怕有一定的困難度。不過最難的部份不在技術上, 而是到底在何種場合下可以採用非同步或平行處理。在日常生活中, 我們採用的邏輯大多是循序進行的, 也就是說, 等到前一件事情完成之後, 才去進行下一件。但是在某些情況下, 非同步處理是比較合乎情理的做法...

...繼續閱讀 »

[Winform] 觀察者樣式之應用

Design Pattern 通常都是由許多人推薦的軟體架構模式, 而且有其固定的規則可循。我們可以把一些素有口碑的設計樣式拿來套用在某種情境之下, 但是我十分反對為套用 Design Pattern 而套用 Design Pattern。應該是反過來, 我們最好事先評估自己的情境適合應用何種 Design Pattern, 再來決定是否套用某種 Design Pattern, 不然就會流於削足適履...

...繼續閱讀 »

[Regex] 值得注意的 Regular Expression 樣式的潛在風險

Regex 本身已經十分複雜, 但不知道大家有沒有想過, 它的解析引擎和處理機制又是如何實作的呢? 一般來講, Regular Expression 的解析引擎可以分為三種, 一種叫做 DFA (Deterministic Finite Automation, 決定性有限自動機制), 另一種叫做 NFA (Nondeterministic Finite Automation, 非決定性有限自動機制), 還有一種叫做 POSIX NFA。.Net 採用了傳統的 NFA 引擎, 使得它既能兼顧速度與功能, 但缺點就是由於傳統 NFA 只接受它找到的第一個相符比對,它也可能讓其它比對無法被找到 (POSIX NFA 雖然可以找到, 但速度緩慢)...

...繼續閱讀 »

[Winform] 在 Windows Form 中讓背景流動的方法

首先我必須聲明一下, 以下我要介紹的方法雖然並不是百無一用, 而且看起來還算酷炫, 但是我必須承認這可以算是「無用技術」的一項。因為讓背景圖片不斷流動除了無端耗費 CPU 資源之外, 如果設定得不好, 還會讓你的使用者眼花瞭亂, 甚至可能會產生暈車的症狀, 所以小朋友不要亂學, 叔叔有練過才敢這樣做...

...繼續閱讀 »

使用 new FontFamily 時因字型不存在或非 TrueType 而造成 Exception 的問題

當我們要使用某種字型, 必須採用以下的方式進行: new Font(new FontFamily(fontName), 14f, FontStyle.Regular); 上面 fontName 是指輸入的字型, 例如 Arial。但是當你把程式部署到客戶端之後, 會有一個你可能想像不到的問題, 那就是, 如果對方機器上並未安裝此字型, 這時會產生一個 runtime 的 Argument Exception...

...繼續閱讀 »

[入門] .NET 自訂型別

我可以理解為什麼我老婆開了十年的同樣一部車, 都不知道原來在 N 檔和 D 檔之間切換可以不必去按那個安全鈕; 但是我卻無法理解為什麼有一個已經寫了好幾年 .NET 程式的人, 在這輩子中竟然沒有寫過任何一個自訂型別...

...繼續閱讀 »

[Regex] 進階群組建構

當你可以掌握 Regex 的基本原則之後, 如果你真的把它運用在生活中或工作上, 我相信你很快就會發現那些基本技巧的不足之處。舉個例子, 你可能已經寫好一個樣式 (如 "(?\b\d{7,8}\b)" ) 來從 "12341234 1111222" 字串中擷取出電話號碼。然而, 你可能在某天發現來源字串出現了奇怪的字: "12341234 (02)12345678", 此時, 你就非得修改原本的樣式...

...繼續閱讀 »

讀寫 INI 檔案

ASP.NET 寫久了, 早就習慣使用 Resource 檔案或一般 XML 檔案儲存設定, 反而不會考慮使用古早的 INI 檔案。但最近被問到一個問題: 「如果以前的程式都使用 INI 檔, 要如何跟人家一樣呢?」...

...繼續閱讀 »