📄 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 + -