?? pl003.asp
字號:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<TITLE>程式設計基礎講座(三) - 為您的程式作體檢</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>為 您 的 程 式 作
體 檢</FONT></FONT></H2>
<P>
<HR WIDTH="100%"><A NAME="S0"></A><B><FONT COLOR="#0000FF"><FONT SIZE=+2>本文大綱</FONT></FONT></B></P>
<UL>
<TABLE>
<TR VALIGN=TOP>
<TD VALIGN=TOP WIDTH="280"><A HREF="#S1">評估副程式的兩大原則<BR>
─ 關連性及凝聚力</A></TD>
<TD><A HREF="#S3">幾種副程式的凝聚力</A></TD>
</TR>
<TR>
<TD><A HREF="#S2">幾種副程式的關連性</A></TD>
<TD><A HREF="#S4">物件導向的解決方案</A></TD>
</TR>
</TABLE>
</UL>
<H1 ALIGN=CENTER>
<HR WIDTH="100%"></H1>
<TABLE WIDTH="95%" >
<TR>
<TD>
<UL>
<P>凱 撒 大 帝 有 句 名 言 : 「<FONT COLOR="#000080"> </FONT><FONT COLOR="#0000FF">先
分 化 , 再 征 服 </FONT>」 (divide and conquer), 講 的 是 侵 略 他 國
的 方 法 , 不 過 對 於 大 型 程 式 的 撰 寫 , 這 句 話 卻 也 行 得 通
, 其 實 先 分 化 再 征 服 的 道 理 是 一 件 很 自 然 的 事 情 , 例 如
我 們 在 程 式 的 撰 寫 過 程 中 , 會 把 程 式 分 成 多 個 副 程 式 ,
用 的 就 是 「 分 化 」 , 而 把 每 一 個 副 程 式 寫 好 則 是 「 征 服
」 。 但 凱 撒 大 帝 這 句 話 應 用 在 程 式 設 計 上 似 乎 還 稍 嫌 不
足 , 少 了 什 麼 呢 ? 我 想 是 「 整 合 」 吧 ! 副 程 式 所 提 供 的
只 是 個 別 的 功 能 需 求 , 唯 有 整 合 才 能 使 程 式 完 整 地 運 作
。 </P>
<P>筆 者 過 去 的 工 作 期 間 接 觸 過 許 多 軟 體 工 作 人 員 , 他 們
都 有 旺 盛 的 「 征 服 」 企 圖 想 把 程 式 寫 好 , 而 且 也 曉 得 該
把 大 程 式 切 割 成 比 較 小 的 程 式 單 位 , 再 連 結 起 來 , 但 往
往 不 知 道 每 一 個 程 式 單 位 是 否 「 分 化 」 得 宜 , 也 連 帶 影
響 「 整 合 」 的 結 果 , 然 而 分 化 與 整 合 卻 是 程 式 好 壞 的 關
鍵 , 因 為<FONT COLOR="#0000FF"> 分 化 是 否 得 宜 將 決 定 這 些 程 式
單 位 的 「 可 再 用 性 」 , 而 如 何 整 合 這 些 程 式 單 位 則 會 影
響 整 體 程 式 的 「 可 維 護 性 」</FONT> 。 但 如 何 評 估 程 式 的 分
化 是 否 得 宜 , 以 及 整 合 是 否 成 功 呢 ? </P>
<P>經 分 化 後 的 程 式 單 位 可 能 是 副 程 式 、 物 件 類 別 、 或 模
組 , 其 中 以 副 程 式 為 最 小 的 單 位 , 因 此 我 們 將 以 副 程 式
作 為 評 估 的 基 礎 , 重 點 在 於 個 別 副 程 式 (即 分 化 之 後 )的
「 凝 聚 力 」 (cohesion)是 否 堅 強 , 以 及 副 程 式 之 間 ( 即 整 合
後 )的 「 關 連 性 」 (coupling)是 否 松 散 。 (注 : 凝 聚 力 及 關 連
性 的 意 義 我 們 將 在 稍 後 解 說 )</P>
<P>「 關 連 性 」 與 「 凝 聚 力 」 是 評 估 副 程 式 好 壞 的 兩 大 準
則 , 在 介 紹 它 們 的 觀 念 後 , 我 們 將 利 用 它 們 來 評 估 程 式
的 好 壞 , 并 且 教 您 依 此 準 則 檢 視 自 己 所 寫 得 副 程 式 , 而
最 後 則 要 針 對 比 較 不 好 的 副 程 式 提 出 改 善 的 建 議 。 </P>
</UL>
<H2><A NAME="S1"></A><FONT COLOR="#0000FF">評估副程式的兩大原則─</FONT><FONT COLOR="#FF0000">關連性</FONT><FONT COLOR="#0000FF">及</FONT><FONT COLOR="#FF0000">凝聚力</FONT></H2>
<UL>
<P>「 關 連 性 」 及 「 凝 聚 力 」 這 兩 個 詞 不 是 我 發 明 的 , 它
們 分 別 來 自 早 期 「 結 構 化 分 析 」 的 coupling 及 cohesion, 目
前 已 經 是 十 分 普 遍 的 術 語 , 由 於 這 兩 個 字 用 得 十 分 貼 切
, 所 以 讓 我 先 針 對 它 們 來 個 「 每 日 一 字 」 。 </P>
<P>首 先 來 看 <B><FONT COLOR="#800000"><FONT SIZE=+1>coupling</FONT></FONT>
</B>這 個 字 , 它 來 自 couple, couple 當 名 詞 是 「 一 對 」 、 「
情 侶 」 、 「 夫 妻 」 等 意 思 , 當 動 詞 則 是 「 栓 在 一 起 」 的
意 思 , 我 覺 得 臺 語 有 句 話 叫 做 「 <FONT COLOR="#FF0000">結 相 粘</FONT>
」 , 最 足 以 形 容 這 個 英 文 字 , 「 結 相 粘 」 用 來 形 容 兩 個
人 的 感 情 很 好 , 好 得 就 像 把 兩 條 繩 子 打 個 「 <FONT COLOR="#FF0000">結</FONT>
」 一 樣 , 而 且 除 了 打 結 還 不 夠 , 還 要 用 膠 把 他 們 「 <FONT COLOR="#FF0000">粘
</FONT>」 在 一 起 。 而 coupling 是 couple 的 動 名 詞 , 意 譯 是 「
關 連 性 」 , 用 在 副 程 式 上 表 示 兩 個 副 程 式 之 間 的 關 連 性
。 </P>
<P>關 連 性 的 「 強 弱 」 是 評 估 程 式 好 壞 的 一 種 準 則 , <FONT COLOR="#0000FF">關
連 性 越 弱 表 示 程 式 越 好</FONT><FONT COLOR="#800000"> </FONT>, 怎
麼 說 呢 ? 假 設 您 是 公 司 的 老 板 , 公 司 里 有 兩 個 員 工 感 情
好 的 要 命 , 有 一 天 您 想 派 其 中 一 位 出 差 一 個 月 , 那 遭 了
, 另 一 位 員 工 這 個 月 大 概 是 心 不 在 焉 了 , 這 就 是 coupling
太 緊 所 衍 生 的 的 問 題 。 同 樣 的 , 當 兩 個 副 程 式 之 間 的 關
連 性 太 強 時 , 也 會 潛 在 一 些 問 題 , 例 如 當 我 們 想 修 改 其
中 一 個 副 程 式 時 , 另 一 個 副 程 式 也 可 能 要 同 時 修 改 , 使
得 程 式 的 維 護 變 得 比 較 復 雜 。 至 於 如 何 判 別 關 連 性 的 強
弱 , 稍 後 將 有 詳 盡 的 解 說 。 </P>
<P><FONT SIZE=+1><B><FONT COLOR="#800000">Cohesion</FONT></B> </FONT>直
譯 就 是 「 凝 聚 力 」 的 意 思 , 例 如 水 銀 的 凝 聚 力 強 , 水 的
凝 聚 力 弱 , 如 果 說 某 個 團 體 的 凝 聚 力 很 強 , 表 示 團 體 內
的 成 員 彼 此 共 識 程 度 很 高 , 愿 意 為 一 致 的 目 標 共 同 來 努
力 , 其 實 這 正 是 副 程 式 的 寫 照 , 當 我 們 把 一 段 程 式 碼 寫
成 一 個 副 程 式 , 大 抵 是 因 為 這 段 程 式 碼 可 以 用 來 執 行 某
個 明 確 的 功 能 , 因 此 我 們 可 以 說 副 程 式 內 部 的 成 員 都 是
為 了 這 個 明 確 的 功 能 而 聚 在 一 起 的 , 舉 個 例 子 來 說 , 以
下 的 副 程 式 Swap() 是 用 來 互 換 兩 個 變 數 的 值 : </P>
<CENTER><TABLE BORDER=1 CELLSPACING=0 CELLPADDING=3 WIDTH="80%" >
<TR>
<TD>
<ADDRESS>Sub Swap( x, y )</ADDRESS>
<UL>
<ADDRESS>Dim temp</ADDRESS>
<ADDRESS>temp = x</ADDRESS>
<ADDRESS>x = y</ADDRESS>
<ADDRESS>y = temp</ADDRESS>
</UL>
<ADDRESS>End Sub</ADDRESS>
</TD>
</TR>
</TABLE></CENTER>
<P>Swap() 內 的 幾 個 敘 述 句 很 明 確 的 都 是 為 了 同 一 個 目 的 (互
換 變 數 的 數 值 ) 而 聚 在 一 起 的 , 類 似 上 述 的 Swap() 副 程 式
, 我 們 就 說 它 的 凝 聚 力 很 強 。 </P>
<P>但 并 不 是 所 有 副 程 式 的 凝 聚 力 都 很 強 , 由 於 我 們 撰 寫
副 程 式 的 時 候 , 只 要 遵 照 程 式 語 言 的 語 法 , 就 可 以 通 過
編 譯 器 的 檢 查 , 因 此 一 不 小 心 就 會 寫 出 一 個 凝 聚 力 很 弱
的 副 程 式 , 舉 例 來 說 , 當 主 程 式 越 寫 越 大 時 , 我 們 會 把
某 段 程 式 碼 分 出 來 使 它 變 成 一 個 副 程 式 , 如 果 這 個 分 出
來 的 動 作 沒 有 經 過 仔 細 的 規 畫 , 極 可 能 造 成 副 程 式 里 面
的 成 員 沒 有 共 同 的 目 的 , 而 只 是 代 替 主 程 式 執 行 某 一 段
程 式 碼 罷 了 , 類 似 這 樣 的 副 程 式 , 我 們 就 說 它 的 凝 聚 力
很 弱 。 </P>
<P><FONT COLOR="#0000FF">凝 聚 力 的 強 弱 也 是 評 估 程 式 好 壞 的 另
一 個 準 則 , 凝 聚 力 越 強 的 副 程 式 越 好 , 原 因 是 凝 聚 力 強
的 副 程 式 其 再 用 性 比 較 高 </FONT>, 例 如 一 些 程 式 庫 所 提 供
的 副 程 式 。 至 於 怎 麼 判 斷 自 己 所 寫 的 副 程 式 其 凝 聚 力 的
高 低 , 這 也 是 本 期 討 論 的 要 點 之 一 , 當 然 我 們 還 會 為 凝
聚 力 較 弱 的 副 程 式 提 出 改 進 的 建 議 。 </P>
</UL>
</TD>
</TR>
</TABLE>
<TABLE CELLSPACING=0 CELLPADDING=0 WIDTH="95%" >
<TR>
<TD>
<H2><A NAME="S2"></A><FONT COLOR="#0000FF">幾 種 副 程 式 的 關 連 性 </FONT></H2>
<UL>
<P>我 們 前 面 已 經 討 論 過 , 副 程 式 之 間 的 關 連 性 以 較 弱 者
為 佳 , 如 果 副 程 式 之 間 的 關 連 性 過 強 , 可 能 會 有 以 下 兩
個 問 題 : </P>
<UL>
<P>· 當 某 一 個 副 程 式 發 生 錯 誤 時 , 可 能 引 起 另 一 個 副 程
式 的 連 鎖 反 應 , 使 得 偵 錯 的 工 作 變 的 更 困 難 。 </P>
<P>· 當 我 們 想 修 改 某 一 個 副 程 式 時 , 可 能 也 必 須 同 時 修
改 另 一 個 副 程 式 , 使 得 維 護 的 工 作 變 的 更 復 雜 。 </P>
</UL>
<P>因 此 我 們 應 該 盡 量 降 低 副 程 式 之 間 的 關 連 性 , 但 怎 樣
降 低 副 程 式 之 間 的 關 連 性 呢 ? 不 妨 先 從 寫 好 的 副 程 式 開
始 , 判 別 其 關 連 性 的 強 弱 , 再 嘗 試 降 低 其 強 度 。 </P>
<P>要 判 別 副 程 式 之 間 的 關 連 性 并 不 困 難 , 只 要 想 一 想 到
底 是 「 什 麼 東 西 」 使 兩 個 副 程 式 發 生 關 系 的 , 首 先 我 們
想 到 的 是 副 程 式 呼 叫 時 , 「 參 數 」 的 傳 遞 及 函 數 的 「 傳
回 值 」 , 類 似 這 種 在 呼 叫 時 因 為 傳 遞 資 料 所 發 生 的 關 連
, 我 們 叫 它 做 「 傳 遞 性 關 連 」 , 傳 遞 性 關 連 依 傳 遞 資 料
的 性 質 (資 料 性 質 及 控 制 性 質 )又 可 區 分 成 「 資 料 關 連 」
及 「 控 制 關 連 」 兩 種 , 它 們 的 差 異 請 見 稍 後 說 明 。 </P>
<P>呼 叫 是 最 常 見 的 關 連 , 除 此 之 外 , 「 共 用 變 數 」 (或 稱
全 域 變 數 )也 是 使 得 兩 個 副 程 式 發 生 關 連 的 媒 介 , 如 果 說
兩 個 副 程 式 使 用 了 共 用 變 數 , 我 們 就 稱 它 們 是 「 共 用 關
連 」 。 </P>
<P>最 後 一 類 的 關 連 則 是 發 生 在 「 程 式 碼 」 的 共 用 上 面 ,
更 明 確 地 說 , 如 果 某 一 個 副 程 式 在 執 行 的 過 程 中 , 可 以
跳 到 另 一 個 副 程 式 內 部 的 某 一 行 執 行 , 就 稱 它 們 是 「 內
容 關 連 」 。 </P>
<P>就 以 上 「 關 連 標 的 物 」 (參 數 及 傳 回 值 、 共 用 變 數 、 程
式 碼 )來 看 , 副 程 式 之 間 的 關 連 性 可 分 成 : </P>
<TABLE BORDER=1 CELLSPACING=0 CELLPADDING=4 >
<TR BGCOLOR="#00FFFF">
<TD>關 連 標 的 物</TD>
<TD>副 程 式 之 間 的 關 連 性</TD>
</TR>
<TR>
<TD>
<ADDRESS>(1) 參 數 及 傳 回 值</ADDRESS>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -