?? pl005.asp
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>程式設(shè)計(jì)基礎(chǔ)講座(五) - 走過傳統(tǒng),邁向 OO</TITLE>
<META NAME="GENERATOR" CONTENT="Mozilla/3.01Gold (Win95; I) [Netscape]">
</HEAD>
<BODY BACKGROUND="back01.jpg">
<H3><FONT COLOR="#008000">程 式 設(shè) 計(jì) 基 礎(chǔ) 講 座 (五 )</FONT></H3>
<H2 ALIGN=CENTER><FONT COLOR="#0000FF"><FONT SIZE=+3>走 過 傳 統(tǒng) , 邁
向 O O </FONT></FONT></H2>
<P>
<HR WIDTH="100%"><A NAME="S0"></A><B><FONT COLOR="#0000FF"><FONT SIZE=+2>本
文 大 綱 </FONT></FONT></B></P>
<UL>
<TABLE WIDTH="80%" >
<TR VALIGN=TOP>
<TD VALIGN=TOP><FONT COLOR="#0000FF"><A HREF="#S1">從傳統(tǒng)程式語言到 OOP</A></FONT></TD>
<TD><FONT COLOR="#0000FF"><A HREF="#S3">再探軟體工程</A></FONT></TD>
</TR>
<TR>
<TD><B><FONT COLOR="#0000FF"><A HREF="#S2">軟體開發(fā)生態(tài)的改變</A></FONT></B></TD>
<TD><B><FONT COLOR="#0000FF"><A HREF="#S4">通往 OO 之路</A></FONT></B></TD>
</TR>
</TABLE>
<P>近 年 來 , 經(jīng) 過 報(bào) 章 雜 志 的 渲 染 、 廣 告 、 及 報(bào) 導(dǎo) ,「物 件
導(dǎo) 向」(Object Oriented, 以 下 簡 稱 OO) 已 不 再 是 個(gè) 陌 生 的 名
詞 了 , 有 人 說 這 種 技 術(shù) 將 造 成 本 世 紀(jì) 末 的 軟 體 革 命 , 市
面 上 諸 多 軟 體 開 發(fā) 工 具 亦 無 不 宣 稱 自 己 是 多 麼 的 OO, 讓
人 感 覺 一 股 新 的 OO 文 化 已 經(jīng) 侵 入 了 軟 體 開 發(fā) 世 界 , 然 而
當(dāng) 我 們 回 顧 軟 體 發(fā) 展 的 歷 史 , 卻 可 發(fā) 現(xiàn) 這 門 技 術(shù) 并 不 是
遽 然「革 命」( Revolution) 而 產(chǎn) 出 的 , 而 是 逐 漸「進(jìn) 化」(Evolution)
過 來 的 , 因 此 我 們 希 望 從 傳 統(tǒng) 程 式 語 言 如 何 過 渡 到 OO 程
式 語 言 (以 下 簡 稱 OOP) 的 緣 由 談 起 , 再 說 明 引 進(jìn) OO 技 術(shù)
之 後 軟 體 開 發(fā) 生 態(tài) 的 改 變 , 期 能 對 踏 入 OO 技 術(shù) 的 朋 友 有
所 助 益 。 </P>
</UL>
<H2><A NAME="S1"></A><FONT COLOR="#0000FF">從 傳 統(tǒng) 程 式 語 言 到 O O
P </FONT></H2>
<UL>
<P>傳 統(tǒng) 是 什 麼 ? 我 想 回 答 這 個(gè) 問 題 , 程 式 語 言 要 比 文 化
簡 單 多 了 , 傳 統(tǒng) 程 式 語 言 簡 要 地 說 是 由「變 數(shù)」及「副 程 式」所
組 成 的 , 其 中 變 數(shù) 就 像 是 制 作 軟 體 的 基 本 元 件 , 而 副 程
式 則 是 將 變 數(shù) 元 件 貫 穿 起 來 的 程 序 , 所 以 傳 統(tǒng) 程 式 的 撰
寫 總 是 把 重 心 放 在 副 程 式 的 邏 輯 及 演 算 法 上 面 , PASCAL 之
父 Niklaus Wirth 有 一 本 1976 的 鉅 著「Algorithm + Data Structures =
Programs」(演 算 法 + 資 料 結(jié) 構(gòu) = 程 式 ) , 書 名 即 能 表 達(dá) 當(dāng) 時(shí)
的 這 種 現(xiàn) 象 。 </P>
<P>除 了 副 程 式 的 演 算 法 之 外 , Wirth 還 強(qiáng) 調(diào) 另 一 件 重 要 的
事 情 : 單 純 的 資 料 (也 就 是 基 本 的 變 數(shù) , 例 如 整 數(shù) 、 字
串 等 ) 已 無 法 滿 足 程 式 撰 寫 上 的 需 求 , 真 正 的 程 式 還 要
再 善 用「Data Structures」(資 料 結(jié) 構(gòu) , 也 就 是 自 訂 的 復(fù) 合 式
資 料 型 態(tài) ) 的 功 能 。 如 果 說 基 本 變 數(shù) 是 程 式 語 言 最 基 礎(chǔ)
的 元 件 , 那 麼 資 料 結(jié) 構(gòu) 就 是 使 用 者 可 以 自 訂 的 高 階 元 件
, 當(dāng) 我 們 擁 有 越 多 高 階 的 元 件 時(shí) , 程 式 的 撰 寫 就 越 容 易
。 </P>
<P>資 料 結(jié) 構(gòu) 與 副 程 式 的 演 算 法 是「結(jié) 構(gòu) 化 程 式 設(shè) 計(jì)」最 強(qiáng)
調(diào) 的 地 方 , 它 亦 曾 獨(dú) 領(lǐng) 程 式 設(shè) 計(jì) 風(fēng) 騷 一 段 時(shí) 日 , 但 在 軟
體 趨 向 復(fù) 雜 的 情 況 下 , 卻 已 漸 漸 不 能 滿 足 開 發(fā) 上 的 需 求
。 </P>
</UL>
<P><B><FONT COLOR="#000080"><FONT SIZE=+1>從「資 料 結(jié) 構(gòu)」到「軟 體 I
C」</FONT></FONT></B></P>
<UL>
<P>其 實(shí) 我 在 前 面 不 應(yīng) 該 說 資 料 結(jié) 構(gòu) 是 一 種 元 件 , 為 什 麼
呢 ? 所 謂 元 件 大 抵 上 是 封 閉 型 的 東 西 , 更 明 白 地 說 我 們
看 不 到 元 件 內(nèi) 的 組 成 元 素 , 而 當(dāng) 我 們 想 用 它 時(shí) , 必 須 先
知 道 這 個(gè) 元 件 提 供 了 哪 些 使 用「方 法」, 舉 例 來 說 , 假 如
說 STACK(堆 疊) 是 一 個(gè) 元 件 , 它 應(yīng) 該 長 得 像 : </P>
</UL>
<CENTER><P><A HREF="pl05-1.gif">圖 -1 STACK 元 件 </A></P></CENTER>
<UL>
<P>上 圖 的 STACK 提 供 兩 個(gè) 操 作 它 的 方 法 ─ Push 及 Pop, 而 資
料 結(jié) 構(gòu) 是 被「 封 裝」起 來 的 , 使 用 者 只 能 透 過 Push 及 Pop 兩
種 方 法 來 操 作 STACK, 至 於 想 知 道 STACK 的 資 料 結(jié) 構(gòu) , 甚 至
直 接 對 它 進(jìn) 行 讀 寫 的 動 作 , 對 不 起 , 不 行 ! 這 就 好 像 硬
體 的 IC 一 樣 , 其 內(nèi) 部 線 路 被 實(shí) 實(shí) 在 在 地 封 起 來 , 想 使 用
它 得 先 查 一 查 cookbook(硬 體 的 使 用 說 明 書 ) , 瞭 解 使 用 的
方 法 才 行 。 </P>
<P>由 於 觀 念 與 IC 頗 為 類 似 , 所 以 有 人 把 上 述 的 軟 體 元 件
稱 為「軟 體 IC」 , 而 比 較 正 式 的 名 稱 則 是「可 再 用 軟 體 元 件」(Reusable
Software Components) , 不 過 最 通 俗 的 講 法 還 是「物 件」(Object)
。 </P>
<P>言 歸 正 傳 , 讓 我 們 來 看 為 什 麼 資 料 結(jié) 構(gòu) 不 是 軟 體 元 件
: 由 於 結(jié) 構(gòu) 化 程 式 語 言 并 未 提 供 如 圖 -1 的 封 裝 能 力 , 所
以 整 個(gè) STACK 的 資 料 結(jié) 構(gòu) 對 使 用 者 來 說 是 開 放 的 , 也 就 是
說 , 即 使 STACK 已 經(jīng) 具 備 Push 及 Pop 兩 種 操 作 方 法 , 使 用 者
仍 可 能 直 接 操 作 這 個(gè) 資 料 結(jié) 構(gòu) 。 示 意 圖 如 下 : </P>
</UL>
<CENTER><P><A HREF="pl05-2.gif">圖 -2 傳 統(tǒng) 程 式 之 下 的 STACK</A></P></CENTER>
<UL>
<P>類 似 上 圖 允 許 使 用 者 直 接 操 作 STACK 資 料 結(jié) 構(gòu) 可 能 衍 生
以 下 的 不 良 後 果 , 例 如 : </P>
<UL>
<P>· 由 於 這 個(gè) 資 料 結(jié) 構(gòu) 是 開 放 的 , 難 保 程 式 設(shè) 計(jì) 人 員 在
不 小 心 的 狀 況 下 , 破 壞 了 這 個(gè) 資 料 結(jié) 構(gòu) 的 內(nèi) 容 , 徒 增 偵
錯(cuò) 的 困 難 。 </P>
<P>· 您 把 這 份 資 料 結(jié) 構(gòu) (連 同 Push 及 Pop 兩 個(gè) 副 程 式 ) 提
供 給 同 事 做 為 軟 體 元 件 , 而 這 位 仁 兄 因 有 特 殊 需 求 , 自
己 加 了 一 段 操 作 這 個(gè) 資 料 結(jié) 構(gòu) 的 程 式 碼 , 後 來 你 為 了 加
強(qiáng) 功 能 , 改 了 這 個(gè) 資 料 結(jié) 構(gòu) , 但 Push 及 Pop 副 程 式 的 原 型
(prototype)并 沒 有 改 變 , 也 就 是 說 呼 叫 的 方 式 還 是 一 樣 的
, 所 以 Push 及 Pop 的 呼 叫 者 并 不 需 要 修 改 , 但 是 這 位 仁 兄
卻 享 受 不 到 這 個(gè) 好 處 , 因 為 他 直 接 操 作 了 這 個(gè) 資 料 結(jié) 構(gòu)
。 (如 果 角 色 易 位 , 換 成 別 人 提 供 資 料 結(jié) 構(gòu) , 這 位 仁 兄
可 能 就 是 你 了 ) </P>
</UL>
<P>以 上 所 討 論 的 是 直 接 操 作 資 料 結(jié) 構(gòu) 的 缺 點(diǎn) , 您 也 許 會
說 我 不 那 麼 作 就 好 了 , 沒 錯(cuò) ! 并 不 是 只 有 OOP 才 能 寫 得 出
有 OO 概 念 的 程 式 , 只 要 觀 念 正 確 , 程 式 管 理 得 宜 , 傳 統(tǒng)
程 式 也 可 以 很 OO, 反 過 來 說 , 不 能 瞭 解 OO 的 精 義 , 也 可
能 只 是 用 了 新 的 語 言 寫 出 原 本 的 爛 程 式 。 </P>
</UL>
<P><B><FONT COLOR="#000080"><FONT SIZE=+1>用「軟 體 IC」看「副 程 式」</FONT></FONT></B></P>
<UL>
<P>傳 統(tǒng) 程 式 語 言 的 另 一 個(gè) 重 心 是 副 程 式 , 相 信 大 家 都 已
耳 熟 能 詳 , 在 還 沒 引 進(jìn) 軟 體 IC 的 功 能 以 前 , 它 有 什 麼 缺
點(diǎn) 呢 ? 也 是 值 得 探 討 的 問 題 。 </P>
<P>有 位 朋 友 告 訴 我 說 :「副 程 式 也 是 軟 體 IC」, 以 下 是 他
的 推 論 : </P>
<UL>
<P>副 程 式 的 呼 叫 過 程 中 通 常 含 有 參 數(shù) 的 傳 遞 , 例 如 我 們
呼 叫 DrawLine() 副 程 式 畫 一 直 線 : </P>
<UL>
<P>call DrawLine( x1, y1, x2, y2, color )</P>
</UL>
</UL>
<P>如 果 采 用 結(jié) 構(gòu) 化 設(shè) 計(jì) 的 表 達(dá) 方 式 , 其 示 意 圖 如 下 : </P>
</UL>
<CENTER><P><A HREF="pl05-3.gif">圖 -3 呼 叫 DrawLine() 副 程 式 的 結(jié) 構(gòu)
圖 </A></P></CENTER>
<UL>
<P>就 上 圖 來 看 , DrawLine() 副 程 式 含 有 五 個(gè) 參 數(shù) , 其 功 用
就 像 是 IC 的 接 腳 一 樣 是 用 來 互 通 訊 號 的 , 而 這 樣 的 副 程
式 也 經(jīng) 常 被 再 用 於 程 式 設(shè) 計(jì) 中 , 所 以 說 副 程 式 也 是 軟 體
IC。 </P>
<P>這 是 一 個(gè) 有 趣 的 問 題 , 我 的 看 法 是 : 雖 然 說 DrawLine()
副 程 式 具 有 軟 體 IC 的「可 再 用」特 性 , 但 并 不 表 示 所 有 的
副 程 式 都 具 有 此 一 特 性 , 一 段 程 式 能 否 再 用 最 重 要 的 條
件 是 : 當(dāng) 我 們 再 用 這 段 程 式 碼 時(shí) , 是「直 接 再 用 」, 還 是
要 經(jīng) 過 作 一 些「檢 查」、「修 改」、「測 試」等 動 作 才 能 夠 再 用
, 如 果 說 必 須 經(jīng) 過 修 改 才 能 再 用 , 就 不 能 算 是「再 用」(reuse)
, 頂 多 只 能 算 是「回 收」(recycle) 。 </P>
<P>怎 麼 判 斷 副 程 式 是 否 可 直 接 再 用 呢 ? 判 斷 的 準(zhǔn) 則 是 它
不 可 以 與 其 他 副 程 式 有 過 大 的 關(guān) 連 性 (coupling) , 而 本 身
的 凝 聚 力 (cohesion) 則 越 強(qiáng) 越 好 (注 ) , 一 般 來 說 , 市 售
開 發(fā) 工 具 所 提 供 的 程 式 庫 其 副 程 式 都 具 有 此 特 性 , 所 以
算 是 可 再 用「程 式 碼」, 但 是 這 些 程 式 庫 之 所 以 能 夠 做 到「低
關(guān) 連 性」、「高 凝 聚 力」, 并 不 是 這 些 程 式 庫 特 別 厲 害 , 而
是 因 為 這 些 程 式 庫 所 提 供 的 副 程 式 通 常 只 是 一 些「低 階 、
明 確」的 功 能 , 但 自 己 開 發(fā) 的 程 式 通 常 沒 那 麼 幸 運(yùn) , 為 了
解 決 特 殊 的 需 ― , 往 往 必 須 藉 助 好 幾 個(gè) 副 程 式 才 能 夠 解
決 某 一 個(gè) 單 一 的 問 題 , 所 以 副 程 式 之 間 的 關(guān) 連 性 自 然 會
變 大 , 也 就 形 成 了 再 用 上 的 困 難 。 </P>
<P>有 關(guān)「關(guān) 連 性」及「凝 聚 力」的 說 明 請 參 考 <A HREF="pl003.htm">「為
您 的 程 式 作 體 檢」</A>, 其 中 還 討 論 副 程 式 撰 寫 不 良 時(shí) 所
出 現(xiàn) 的 缺 點(diǎn) 。 </P>
</UL>
<H2><A NAME="S2"></A><B><FONT COLOR="#0000FF">軟 體 開 發(fā) 生 態(tài) 的 改 變
</FONT></B></H2>
<UL>
<P>綜 觀 前 面 的 討 論 , 我 們 發(fā) 現(xiàn) 傳 統(tǒng) 程 式 語 言 的 封 裝 能 力
僅 局 限 於「副 程 式」 的 部 份 , 而 副 程 式 又 只 能 封 裝 功 能 低
階 且 明 確 的 程 式 碼 , 無 法 滿 足 較 復(fù) 雜 的 需 求 , 因 此 大 部
份 的 時(shí) 候 程 式 設(shè) 計(jì) 師 (如 圖 -4 之 虛 線 上 方 ) 只 能 利 用 少
得 可 憐 的 基 本 變 數(shù) , 以 及 有 限 的 程 式 庫 一 行 一 行 地「編 寫」程
式 , 在 這 傳 統(tǒng) 的 軟 體 發(fā) 展 生 態(tài) 中 , 與 程 式 設(shè) 計(jì) 師 有 密 切
關(guān) 系 的 依 序 是「程 式 語 言」 、「編 譯 器 供 應(yīng) 商」(提 供 編 譯 程
式 及 基 本 的 副 程 式 庫 ) 、 少 數(shù) 的「副 程 式 供 應(yīng) 商」(提 供 一
些 特 殊 的 副 程 式 , 但 不 多 ) 。 </P>
</UL>
<CENTER><P><A HREF="pl05-4.gif">圖 -4 從 傳 統(tǒng) 程 式 語 言 到 O O P
的「軟 體 開 發(fā) 生 態(tài)」的 改 變 </A></P></CENTER>
<UL>
<P>到 了 OOP 以 後 呢 ? 編 譯 器 除 了 具 備「物 件 封 裝」的 能 力 可
供 程 式 設(shè) 計(jì) 師 自 行 制 作 物 件 之 外 , 還 會 提 供 基 本 的 物 件
庫 , 例 如 Microsoft C++ 的 MFC(Microsoft Foundation Class) , 而 由
於 物 件 封 裝 能 力 的 提 升 , 許 多 程 式 開 發(fā) 的 成 果 都 能 夠 制
作 成 物 件 (軟 體 IC) , 因 此 物 件 的 供 應(yīng) 商 也 會 越 來 越 多 ,
程 式 設(shè) 計(jì) 師 的 選 擇 自 然 增 加 , 可 以 不 必 再 自 行 研 發(fā) 所 有
的 物 件 , 或 從 基 本 變 數(shù) 及 流 程 控 制 指 令 開 始 編 寫 程 式 碼
, 所 以 主 要 的 開 發(fā) 工 作 就 變 成 了 把 這 些 物 件「建 構(gòu)」起 來
, 以 完 成 軟 體 。 </P>
<P>從 傳 統(tǒng) 程 式 進(jìn) 化 到 OOP, 最 大 的 改 變 是 物 件 供 應(yīng) 商 的 增
加 , 而 且 這 個(gè) 已 經(jīng) 是 事 實(shí) , 例 如 我 們 經(jīng) 常 可 以 在 雜 志 看
到 販 賣 ActiveX 的 廣 告 , 而 這 些 物 件 包 含 文 書 處 理 、 圖 形
影 像 、 多 媒 體 展 示 、 資 料 庫 維 護(hù) 、 報(bào) 表 產(chǎn) 生 器 、 檔 案 壓
縮 、 數(shù) 據(jù) 通 訊 、 網(wǎng) 路 通 訊 … , 幾 乎 應(yīng) 有 盡 有 , 這 足 以 告
訴 我 們 以 物 件 來 建 構(gòu) 程 式 的 時(shí) 代 已 經(jīng) 來 臨 了 。 </P>
</UL>
<H2><A NAME="S3"></A><FONT COLOR="#0000FF">再 探 軟 體 工 程 </FONT></H2>
<UL>
<P>如 何 在 有 限 的 人 力 、 時(shí) 間 、 及 資 源 下 開 發(fā) 出 更 好 的 軟
體 , 以 及 如 何 維 護(hù) 既 有 的 軟 體 , 一 直 是 軟 體 開 發(fā) 中 十 分
重 要 的 課 題 , 然 而 這 并 不 是 一 個(gè) 容 易 應(yīng) 付 的 課 題 , 從 過
去 的 案 例 中 我 們 可 以 發(fā) 現(xiàn) 軟 體 普 遍 存 在 著 : </P>
<UL>
<P>·<B><FONT COLOR="#800000"> 系 統(tǒng) 不 穩(wěn) 定 </FONT></B>: 例 如 系 統(tǒng)
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -