需要用 C++(MFC/OWL) 或是 C(WIN32 API) 來寫 Windows 程式嗎?

到底什麼時候需要用 C (WIN32 API) 或是 C++ (MFC/OWL) 來寫 Windows 應用程式呢? 好多人在講說用 Visual Basic 或是 Delphi 來寫 Windows 應用程式有多好寫, 多方便, 多快速.... 好處一籮筐耶! 是什麼樣的應用還需要用 C / C++ 來寫呢? 又慢, Bugs 又多...

其實現在在市場上看到的產品很多都是 VB / Delphi 開發出來的, 尤其是資訊系統, 資料庫應用等等, 其實使用哪一種工具完全看你要做 什麼樣的應用, VB / Delphi 對於表單、資料庫與標準的網路界面 都有適當的支援, 對於表單資訊系統的應用非常適合, 你不需要去 管 Windows 系統的細節, 讓 VB / Delphi 的元件幫你操心就好了, 把全副精神放在資訊系統流程的設計與開發就可以了, 究竟系統的 流程與正確性和方便性是資訊系統的最重要部份, 那麼開發哪些產品需要 C/C++ 呢? 基本上是你覺得 VB / Delphi 的元件功能不能滿足你的需求時, 或是 RAD (Rapid Application Development) 所使用的 PME (Property/ method/ event) 模型無法滿足你物件導向系統開發的需求時, 例如你不滿意標準的檔案開啟對話盒而想直接修改它時, 或是你需要做一些低階界面的控制時, 或是你需要做特殊的圖形輸出時, 你需要直接透過 Windows 系統提供的 API 來完成 (例如: Direct Draw, Direct 3D, OpenGL...), 另外當你需要擴充作業系統的某項功能, 例如你不滿意檔案系統的功能時你可以修改驅動程式(VXD), 增加新的硬體驅動程式(device driver), 微軟提供的各項附加功能例如 MMAPI, MAPI, TAPI 等等 基本上也都是 C/C++ 的格式 ..., 因此在這些狀況下 C/C++ 就是一個比較好的選擇了; 另外還有一種情況就是你用標準的 OO 開發流程來發展你的系統, 包括 OOA / OOD, 然後你只需選擇一種標準的物件導向語言來運用, (甚至你的 CASE 工具都已經幫你產生 C++ 的骨幹程式了), 那麼 C++ 當然是一個很好的選擇, 它有完整的物件模型再加上前面所提到的好處, 應該可以打動你的心才對; 還有就是從元件軟體 (Componentware) 的角度來看, 運用 C++ 來實作在觀念上與 COM 模型的相似度可以讓你靈活地製作 ActiveX 元件。

很抱歉不太容易用一種語言或是一套系統就可以打遍天下的, 當然你可以說只要會 Assembly 就可以寫出所有的程式來, 在 Windows 世界中你只要會 C (WIN32 API) 理論上就可以 寫出所有的應用程式了, 但是這也太愚公心態了, 在適當的時候選用正確的工具才是好的, 資訊系的學生本來就有掌控系統的能力, 學習 WIN32 API / MFC 會讓你暸解 Windows 運作的基本 原理, 學會基本的功夫後, 其它的工具自然可以深入的暸解 與運用而不至於操縱在工具的設計者上。

另外一個重點其實是在"物件"式的程式設計上,基本上視窗系統 或是作業系統本身都是物件導向觀念孕育的溫床,在視窗系統上 尤其更為明顯,現在不管是 VB / Delphi / MFC / OWL 甚至是 直接用 C(SDK) 來寫 Windows 應用程式,你都要不斷地運用 "事件驅動"概念, 也要有操作物件的概念, 不過說實在的, VB 不是一個完整的物件導向語言,不要以為會用 VB 提供的物件就 算會寫出物件導向的系統, 就能得到物件導向軟體的許多好處了, 這與實際有很大的出入, Delphi 是 Object Pascal, MFC/OWL 是 C++, 資訊系學生在物件導向的概念要很清楚, 不要太偷懶, 簡單好學 的東西通常生命期也都很短, 不是嗎!

那麼用 JAVA 好不好呢? 有"相當"完整的圖形界面類別庫供你使用, 有跨平台可任意移植的好處, 有 Internet 的舞台, 沒有 C++ 裡 好多有的沒有的語法與陷阱。 是不錯啦! 不過它在物件導向的功能上 基本上並沒有修改 C++, 你會 C++ 的話, 我不相信你稍加努力後不會用 JAVA, 你會 MFC 的話我不相信你不會覺得 JAVA 的 AWT, Object Serialization 很面熟, 你會 Win32 的多緒程式的話, 我不相信你不會覺得 JAVA 裡的 Thread/synchronize monitor 很單純! 還有 JAVA 因為考慮跨平台所以有很多圖形界面上的限制, 比方說 1.0 中不能更改 Cursor, 有很多應用程式如果可以更改 Cursor 的話 程式的使用會變得很直覺, 不是嗎? 另外舉一個例子, JDBC 到了 1.1 時還不能完整支援中文..., 這個麻煩了吧! 唉! (你有一點可以感覺到這一節開始時"相當"兩個字的意思了嗎??) 還有還有,JAVA 1.1 的類別庫很多地方不能與 JAVA 1.0 相容, 哇!怎麼會這樣!物件導向不是可以延伸擴充、以舊的程式碼呼叫 新的程式碼嗎?喔!這些好處都是當你已經對系統功能做了完整的 物件導向分析與設計才會享有的好處,而且系統最好是已經運行了 一段時間很穩定了的系統,JAVA 的視窗界面 AWT 出來得算是很晚, 照理說應該不會一直在修正,但是由於各家視窗界面都各有優缺點, 想必它也是為了跨平台平衡效率等問題傷透腦筋才會在 1.1 中 就修改了 1.0 中的許多地方。總之,好處是簡單,壞處還是簡單, 自己要傷腦筋衡量了。

現實面

讓我們看一看這一兩年相關的求才廣告吧!

  1. JOB 01 8701
  2. JOB 02 8701 InfoValue Computing, Inc.
  3. JOB 03 8705 Intertop Corporation
  4. JOB 04 8510 ACEO Technology Inc.
  5. JOB 05 8511 Numerical Technologies, Inc. (NumeriTech)
  6. JOB 06 8601 Lean Software Corporation
  7. JOB 07 8603 Siemens Telecommunication Systems Limited
  8. JOB 08 8607 Alacrity Communication, Inc.
  9. JOB 09 8702 Advanced Hi-Tech Corporation (AHT)
  10. JOB 10 8705 Unisys
  11. JOB 11 8707 Divio Inc.
  12. JOB 12 8707 Knights Technology
  13. JOB 13 8709 Intertop Co.
軟體工程師中兩種人是大家搶著要的: 一是能夠分析顧客的需求,抓牢顧客 的人,二是能夠深入暸解軟體系統與應用程式 相互關係,能夠掌握軟體潮流與方向的人。 通常簡單、好學、流行的東西,其生命期短, 競爭的人多, 應用到的知識也少,如果你把學習 Windows 系統程式製作看成你學習一套完整系統的 開始,注重學習的方法,我想你不會怕 軟體系統快速的更新,你的知識與經驗 就能夠慢慢地累積下來成為你個人的資產。

視窗系統程式設計課程 首頁
by Pei-yih Ting
E-mail: pyting@cs.ntou.edu.tw