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