小菜编程成长记



Similar documents
评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

I

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单


修改版-操作手册.doc

2006年顺德区高中阶段学校招生录取分数线

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

深圳市新亚电子制程股份有限公司

名 称 生 命 科 学 学 院 环 境 科 学 1 生 物 学 仅 接 收 院 内 调 剂, 初 试 分 数 满 足 我 院 生 物 学 复 试 最 低 分 数 线 生 命 科 学 学 院 生 态 学 5 生 态 学 或 生 物 学 生 命 科 学 学 院

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

一 从 分 封 制 到 郡 县 制 一 从 打 虎 亭 汉 墓 说 起


( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )

《C语言基础入门》课程教学大纲

ETF、分级基金规模、份额变化统计

国债回购交易业务指引


HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语

中 中 中 中 部 中 岗 位 条 件 历 其 它 历 史 师 地 理 师 生 物 师 体 与 健 康 师 从 事 中 历 史 工 从 事 中 地 理 工 从 事 中 生 物 工 从 事 中 体 与 健 康 工 2. 课 程 与 论 ( 历 史 ); 2. 科 ( 历 史 )

<433A5C C6B73625C B746F705CB9FABCCAD6D0D2BDD2A9D7A8D2B5B8DFBCB6BCBCCAF5D6B0B3C6C6C0C9F3C9EAC7EBD6B8C4CFA3A CDA8D3C3B0E6A3A92E646F63>

课程类 别

( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

Microsoft Word - 第7章 图表反转形态.doc

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

Microsoft Word - 文件汇编.doc

全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %

证券代码: 证券简称:长城电脑 公告编号:

2014年中央财经大学研究生招生录取工作简报

21 业 余 制 -- 高 起 专 (12 级 ) 75 元 / 学 分 网 络 学 院 学 生 沪 教 委 财 (2005)49 号 江 西 化 校 工 科 22 业 余 制 -- 高 起 专 (12 级 ) 70 元 / 学 分 网 络 学 院 学 生 沪 教 委 财 (2005)49 号 吉

教师上报成绩流程图


收 入 支 出 项 目 2016 年 预 算 项 目 2016 年 预 算 预 算 01 表 单 位 : 万 元 ( 保 留 两 位 小 数 ) 一 公 共 财 政 预 算 拨 款 一 人 员 经 费 一 般 财 力 人 员 支 出 成 品

3 月 30 日 在 中 国 证 券 报 上 海 证 券 报 证 券 时 报 证 券 日 报 和 上 海 证 券 交 易 所 网 站 上 发 出 召 开 本 次 股 东 大 会 公 告, 该 公 告 中 载 明 了 召 开 股 东 大 会 的 日 期 网 络 投 票 的 方 式 时 间 以 及 审


<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

2. 本 次 修 改 后, 投 资 者 申 购 新 股 的 持 有 市 值 要 求 市 值 计 算 规 则 及 证 券 账 户 使 用 的 相 关 规 定 是 否 发 生 了 变 化? 答 : 未 发 生 变 化 投 资 者 申 购 新 股 的 持 有 市 值 是 指, 以 投 资 者 为 单 位

学 年 第 二 学 期 集 中 考 试 安 排 (18 周 ) 考 试 日 期 :6 月 27 日 星 期 一 8:10-9:50 第 二 公 共 教 学 楼 A 区 A 高 等 数 学 ( 理 二 2) 复 材 材 料 科 学 与 工 程

关于修订《沪市股票上网发行资金申购

黄 金 原 油 总 持 仓 增 长, 同 比 增 幅 分 别 为 4.2% 和 4.1% 而 铜 白 银 以 及 玉 米 则 出 现 减 持, 减 持 同 比 减 少 分 别 为 9.4%,9.4% 以 及 6.5% 大 豆, 豆 粕 结 束 连 续 4 周 总 持 仓 量 增 长, 出 现 小 幅


一 公 共 卫 生 硕 士 专 业 学 位 论 文 的 概 述 学 位 论 文 是 对 研 究 生 进 行 科 学 研 究 或 承 担 专 门 技 术 工 作 的 全 面 训 练, 是 培 养 研 究 生 创 新 能 力, 综 合 运 用 所 学 知 识 发 现 问 题, 分 析 问 题 和 解 决

随着执业中医师资格考试制度的不断完善,本着为我校中医学专业认证服务的目的,本文通过对我校中医类毕业生参加2012年和2013年的中医执业医师考试成绩及通过率、掌握率进行分析,并与全国的平均水平进行差异比较分析,以此了解我校执业中医师考试的现状,进而反映我校中医类课程总体教学水平,发现考核知识模块教学中存在的不足,反馈给相关学院和教学管理部门,以此提高教学和管理水平。


GONGZUO JUJIAO 宝 山 区 领 军 人 才 名 单 宝 山 区 第 七 批 拔 尖 人 才 名 单 2

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

珠江钢琴股东大会

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

中 国 软 科 学 年 第 期!!!

上证指数

2 熟 悉 Visual Basic 的 集 成 开 发 环 境 3 了 解 可 视 化 面 向 对 象 编 程 事 件 驱 动 交 互 式 开 发 等 基 本 概 念 4 了 解 Visual Basic 的 特 点 环 境 要 求 与 安 装 方 法 1 Visual Basic 开 发 应 用

上海证券交易所会议纪要

工 程 勘 察 资 质 标 准 根 据 建 设 工 程 勘 察 设 计 管 理 条 例 和 建 设 工 程 勘 察 设 计 资 质 管 理 规 定, 制 定 本 标 准 一 总 则 ( 一 ) 本 标 准 包 括 工 程 勘 察 相 应 专 业 类 型 主 要 专 业 技 术 人 员 配 备 技 术

一、资质申请

目 录 一 系 统 访 问... 1 二 门 户 首 页 申 报 用 户 审 核 用 户... 2 三 系 统 登 录 用 户 名 密 码 登 录 新 用 户 注 册 用 户 登 录 已 注 册 用


抗 日 战 争 研 究 年 第 期 % & ( # #

新, 各 地 各 部 门 ( 单 位 ) 各 文 化 事 业 单 位 要 高 度 重 视, 切 实 加 强 领 导, 精 心 组 织 实 施 要 根 据 事 业 单 位 岗 位 设 置 管 理 的 规 定 和 要 求, 在 深 入 调 查 研 究 广 泛 听 取 意 见 的 基 础 上, 研 究 提

上海证券交易所会议纪要

第二讲 数列

untitled

 编号:

公 开 刊 物 须 有 国 内 统 一 刊 (CN), 发 表 文 章 的 刊 物 需 要 在 国 家 新 闻 出 版 广 电 总 局 ( 办 事 服 务 便 民 查 询 新 闻 出 版 机 构 查 询 ) 上 能 够 查 到 刊 凡 在 有 中 国 标 准 书 公 开

Microsoft Word - 第3章.doc

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

第 六 章 债 券 股 票 价 值 评 估 1 考 点 一 : 债 券 价 值 的 影 响 因 素 2

证监会行政审批事项目录

三门峡市质量技术监督局清单公示

《深圳市场首次公开发行股票网上按市值申购实施办法》.doc

一 开 放 性 的 政 策 与 法 规 二 两 岸 共 同 的 文 化 传 承 三 两 岸 高 校 各 自 具 有 专 业 优 势 远 见 杂 志 年 月 日

登录、注册功能的测试用例设计.doc

2016年山东省民主党派办公大楼管理处

世华财讯模拟操作手册

抗 日 战 争 研 究 年 第 期

!!!!!

境 外 上 市 外 资 股 股 东 持 有 股 份 总 数 (H 股 ) 489,157,907 3 出 席 会 议 的 股 东 所 持 有 表 决 权 股 份 数 占 公 司 有 表 决 权 股 份 总 数 的 其 中 :A 股 股 东 持 股 占 股 份 总 数 的

2016 年 荔 湾 区 财 政 核 定 支 出 汇 总 表 表 二 单 位 名 称 : 广 州 文 化 公 园 基 本 支 出 项 目 支 出 科 目 编 码 预 算 科 目 名 称 一 般 公 共 预 算 5, , , , ,

四川省卫生厅关于开展医疗美容主诊医师资格考试及换证工作的通知

·岗位设置管理流程

Microsoft Word - 资料分析练习题09.doc

2.5 选 举 陈 晓 非 女 士 为 第 六 届 董 事 会 董 事 候 选 人 的 议 案 ; 2.6 选 举 卢 婕 女 士 为 第 六 届 董 事 会 董 事 候 选 人 的 议 案 ; 2.7 选 举 张 文 君 先 生 为 第 六 届 董 事 会 独 立 董 事 候 选 人 的 议 案

附 件 : 上 海 市 建 筑 施 工 企 业 施 工 现 场 项 目 管 理 机 构 关 键 岗 位 人 员 配 备 指 南 二 一 四 年 九 月 十 一 日 2

合 并 计 算 配 售 对 象 持 有 多 个 证 券 账 户 的, 多 个 证 券 账 户 市 值 合 并 计 算 确 认 多 个 证 券 账 户 为 同 一 配 售 对 象 持 有 的 原 则 为 证 券 账 户 注 册 资 料 中 的 账 户 持 有 人 名 称 有 效 身 份 证 明 文 件

目 录 第 一 章 博 星 卓 越 电 子 商 务 营 销 策 划 实 践 平 台 硬 件 使 用 介 绍... 3 第 二 章 博 星 卓 越 电 子 商 务 营 销 策 划 实 践 平 台 管 理 员 端 功 能 使 用 介 绍 系 统 管 理 员 登 陆 班

Microsoft Word - 工业品封面.doc

<4D F736F F D20B3D6B2D6CFDEB6EEB1EDB8F1D7EED6D52E646F63>

小 学 语 文 是 小 学 语 文 是 小 学 语 文 是 小 学 语 文

抗 日 战 争 研 究! 年 第 期 # # # # #!!!!!!!! #!!

自 服 务 按 钮 无 法 访 问 新 系 统 的 自 服 务 页 面 因 此 建 议 用 户 从 信 网 中 心 ( 主 页, 右 下 角 位 置 的 常 用 下 载, 或 校 园 网 用 户 自 服 务 ( 首 页

微软用户

<4D F736F F D20B9D8D3DA BDECB1CFD2B5C9FAC5C9C7B2B1A8B5BDB5C8D3D0B9D8B9A4D7F7B5C4CDA8D6AAA3A E362E38A3A92E646F63>

三武一宗灭佛研究

Transcription:

作 者 : 伍 迷 http://cj723.cnblogs.com http://www.cnblogs.com/cj723/archive/2007/04/02/697431.html 整 理 : 秦 韶 华 作 者 : 伍 迷 戏 说 面 向 对 象 程 序 设 计 C# 版 目 录 代 序... 四 大 发 明 之 活 字 印 刷 面 向 对 象 思 想 的 胜 利 第 一 章... 面 试 受 挫 代 码 无 错 就 是 好? 第 二 章... 代 码 规 范 重 构 第 三 章... 复 制 VS 复 用 第 四 章... 业 务 的 封 装 第 五 章... 体 会 简 单 工 厂 模 式 的 美 妙 第 六 章... 工 厂 不 好 用 了? 第 七 章... 用 策 略 模 式 是 一 种 好 策 略 第 八 章... 反 射 程 序 员 的 快 乐! 第 九 章... 会 修 电 脑 不 会 修 收 音 机? 聊 设 计 模 式 原 则 第 十 章... 三 层 架 构, 分 层 开 发 第 十 一 章... 无 熟 人 难 办 事? 聊 设 计 模 式 迪 米 特 法 则 第 十 二 章... 有 了 门 面, 程 序 员 的 程 序 会 更 加 体 面 第 十 三 章... 设 计 模 式 不 能 戏 说! 设 计 模 式 怎 就 不 能 戏 说? 1

四 大 发 明 之 活 字 印 刷 面 向 对 象 思 想 的 胜 利 话 说 三 国 时 期, 曹 操 带 领 百 万 大 军 攻 打 东 吴, 大 军 在 长 江 赤 壁 驻 扎, 军 船 连 成 一 片, 眼 看 就 要 灭 掉 东 吴, 统 一 天 下, 曹 操 大 悦, 于 是 大 宴 众 文 武, 在 酒 席 间, 曹 操 诗 性 大 发, 不 觉 吟 道 : 喝 酒 唱 歌, 人 生 真 爽 众 文 武 齐 呼 : 丞 相 好 诗! 于 是 一 臣 子 速 命 印 刷 工 匠 刻 版 印 刷, 以 便 流 传 天 下 样 张 出 来 给 曹 操 一 看, 曹 操 感 觉 不 妥, 说 道 : 喝 与 唱, 此 话 过 俗, 应 改 为 对 酒 当 歌 较 好!, 于 是 此 臣 就 命 工 匠 重 新 来 过 工 匠 眼 看 连 夜 刻 版 之 工, 彻 底 白 费, 心 中 叫 苦 不 喋 只 得 照 办 样 张 再 次 出 来 请 曹 操 过 目, 曹 操 细 细 一 品, 觉 得 还 是 不 好, 说 : 人 生 真 爽 太 过 直 接, 应 改 问 语 才 够 意 境, 因 此 应 改 为 对 酒 当 歌, 人 生 几 何?! 当 臣 转 告 工 匠 之 时, 工 匠 晕 倒! 可 惜 三 国 时 期 活 字 印 刷 还 未 发 明, 所 以 类 似 事 情 应 该 时 有 发 生, 如 果 是 有 了 活 字 印 刷 则 只 需 更 改 四 个 字 就 可, 其 余 工 作 都 未 白 做 实 在 妙 哉 2

第 一, 要 改, 只 需 更 改 要 改 之 字, 此 为 可 维 护 ; 第 二, 这 些 字 并 非 用 完 这 次 就 无 用, 完 全 可 以 在 后 来 的 印 刷 中 重 复 使 用, 此 乃 可 复 用 ; 第 三, 此 诗 若 要 加 字, 只 需 另 刻 字 加 入 即 可, 这 是 可 扩 展 ; 第 四, 字 的 排 列 其 实 有 可 能 是 竖 有 可 能 是 横 排, 此 时 只 需 将 活 字 移 动 就 可 做 到 满 足 排 列 需 求, 此 是 灵 活 性 好 而 在 活 字 印 刷 术 之 前, 上 面 的 四 种 特 性 都 无 法 满 足, 要 修 改, 必 须 重 刻, 要 加 字, 必 须 重 刻, 要 重 新 排 列, 必 须 重 刻, 印 完 这 本 书 后, 此 版 已 无 任 何 可 再 利 用 价 值 小 时 候, 我 一 直 奇 怪, 为 何 火 药 指 南 针 造 纸 术 都 是 从 无 到 有, 从 未 知 到 发 现 的 伟 大 发 明, 而 活 字 印 刷 仅 仅 是 从 刻 版 印 刷 到 活 字 印 刷 的 一 次 技 术 上 的 进 步, 为 何 不 是 评 印 刷 术 为 四 大 发 明 之 一 呢? 做 了 软 件 开 发 几 年 后, 经 历 了 太 多 的 客 户 ( 曹 操 ) 改 变 需 求, 更 改 最 初 想 法 的 事 件, 才 逐 渐 明 白 当 中 的 道 理 其 实 客 观 的 说, 客 户 的 要 求 也 并 不 过 分 ( 改 几 个 字 而 已 ), 但 面 对 已 完 成 的 程 序 代 码, 却 是 需 要 几 乎 重 头 来 过 的 尴 尬, 这 实 在 是 痛 苦 不 堪 说 白 了, 原 因 就 是 因 为 我 们 原 先 所 写 的 程 序, 不 容 易 维 护, 灵 活 性 差, 不 容 易 扩 展, 更 谈 不 上 复 用, 因 此 面 对 需 求 变 化, 加 班 加 点, 对 程 序 动 大 手 术 的 那 种 无 耐 也 就 非 常 正 常 的 事 了 之 后 当 我 学 习 了 面 向 对 象 分 析 设 计 编 程 思 想, 开 始 考 虑 通 过 封 装 继 承 多 态 把 程 序 的 耦 合 度 降 低 ( 传 统 印 刷 术 的 问 题 就 在 于 所 有 的 字 都 刻 在 同 一 版 面 上 造 成 耦 合 度 太 高 所 制 ), 开 始 用 设 计 模 式 使 得 程 序 更 加 的 灵 活, 容 易 修 改, 并 且 易 于 复 用 体 会 到 面 向 对 象 带 来 的 好 处, 那 种 感 觉 应 该 就 如 同 是 一 中 国 酒 鬼 第 一 次 喝 到 了 茅 台, 西 洋 酒 鬼 第 一 次 喝 到 了 XO 一 样, 怎 个 爽 字 可 形 容 呀 再 次 回 顾 中 国 古 代 的 四 大 发 明, 另 三 种 应 该 都 是 科 技 的 进 步, 伟 大 的 创 造 或 发 现 而 唯 有 活 字 印 刷, 实 在 是 思 想 的 成 功, 面 向 对 象 的 胜 利 不 知 您 是 否 也 有 所 感 呢? 3

第 一 章 面 试 受 挫 代 码 无 错 就 是 好? 小 菜 今 年 计 算 机 专 业 大 四 了, 学 了 不 少 软 件 开 发 方 面 的 东 西, 也 学 着 编 了 些 小 程 序, 踌 躇 满 志, 一 心 要 找 一 个 好 单 位 当 投 递 了 无 数 份 简 历 后, 终 于 收 到 了 一 个 单 位 的 面 试 通 知, 小 菜 欣 喜 若 狂 到 了 人 家 单 位, 前 台 小 姐 给 了 他 一 份 题 目, 上 面 写 着, 请 用 C++ Java C# 或 VB.NET 任 意 一 种 面 向 对 象 语 言 实 现 一 个 计 算 器 控 制 台 程 序, 要 求 输 入 两 个 数 和 运 算 符 号, 得 到 结 果 小 菜 一 看, 这 个 还 不 简 单, 三 下 五 除 二,10 分 钟 不 到, 小 菜 写 完 了, 感 觉 也 没 错 误 交 卷 后, 单 位 说 一 周 内 等 通 知 吧 于 是 小 菜 只 得 耐 心 等 待 可 是 半 个 月 过 去 了, 什 么 消 息 也 没 有, 小 菜 很 纳 闷, 我 的 代 码 实 现 了 呀, 为 什 么 不 给 我 机 会 呢 小 菜 找 到 工 作 三 年 的 师 哥 大 鸟, 请 教 原 因, 大 鸟 问 了 题 目 和 了 解 了 小 菜 代 码 的 细 节 以 后, 哈 哈 大 笑, 说 道 : 小 菜 呀 小 菜, 你 上 当 了, 人 家 单 位 出 题 的 意 思, 你 完 全 都 没 明 白, 当 然 不 会 再 联 系 你 了 小 菜 说 : 我 的 代 码 有 错 吗? 单 位 题 目 不 就 是 要 我 实 现 一 个 计 算 器 的 代 码 吗, 我 这 样 写 有 什 么 问 题 class Program static void Main(string[] args) Console.Write(" 请 输 入 数 字 A:"); string A = Console.ReadLine(); Console.Write(" 请 选 择 运 算 符 号 (+ - * /):"); string B = Console.ReadLine(); Console.Write(" 请 输 入 数 字 B:"); string C = Console.ReadLine(); string D = ""; if (B == "+") D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C)); if (B == "-") D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C)); if (B == "*") D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C)); if (O == "/") D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C)); Console.WriteLine(" 结 果 是 :" + D); 小 菜 的 代 码 有 什 么 问 题 呢? 4

第 二 章 代 码 规 范 重 构 大 鸟 说 : 且 先 不 说 出 题 人 的 意 思, 单 就 你 现 在 的 代 码, 就 有 很 多 不 足 的 地 方 需 要 改 进 比 如 变 量 命 名, 你 的 命 名 就 是 ABCD, 变 量 不 带 有 任 何 具 体 含 义, 这 是 非 常 不 规 范 的 ; 判 断 分 支, 你 这 样 的 写 法, 意 味 着 每 个 条 件 都 要 做 判 断, 等 于 计 算 机 做 了 三 次 无 用 功 ; 数 据 输 入 有 效 性 判 断 等, 如 果 用 户 输 入 的 是 字 符 符 号 而 不 是 数 字 怎 么 办? 如 果 除 数 时, 客 户 输 入 了 0 怎 么 办? 这 些 都 是 可 以 改 进 的 地 方 哦, 说 得 没 错, 这 个 我 以 前 听 老 师 说 过, 可 是 从 来 没 有 在 意 过, 我 马 上 改, 改 完 再 给 你 看 看 class Program static void Main(string[] args) try Console.Write(" 请 输 入 数 字 A:"); string strnumbera = Console.ReadLine(); Console.Write(" 请 选 择 运 算 符 号 (+ - * /):"); string stroperate = Console.ReadLine(); Console.Write(" 请 输 入 数 字 B:"); string strnumberb = Console.ReadLine(); string strresult = ""; switch (stroperate) case "+": strresult = Convert.ToString (Convert.ToDouble(strNumberA) + Convert.ToDouble(strNumberB)); break; case "-": strresult = Convert.ToString (Convert.ToDouble(strNumberA) - Convert.ToDouble(strNumberB)); break; case "*": strresult = Convert.ToString (Convert.ToDouble(strNumberA) * Convert.ToDouble(strNumberB)); break; case "/": if (strnumberb!= "0") strresult = Convert.ToString (Convert.ToDouble(strNumberA) / Convert.ToDouble(strNumberB)); else strresult = " 除 数 不 能 为 0"; break; 5

Console.WriteLine(" 结 果 是 :" + strresult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(" 您 的 输 入 有 错 :" + ex.message); 大 鸟 : 吼 吼, 不 错, 不 错, 改 得 很 快 吗? 至 在 目 前 代 码 来 说, 实 现 计 算 器 是 没 有 问 题 了, 但 这 样 写 出 的 代 码 是 否 合 出 题 人 的 意 思 呢? 小 菜 : 你 的 意 思 是 面 向 对 象? 大 鸟 : 哈, 小 菜 非 小 菜 也! 6

第 三 章 复 制 VS 复 用 小 菜 : 我 明 白 了, 他 说 用 任 意 一 种 面 向 对 象 语 言 实 现, 那 意 思 就 是 要 用 面 向 对 象 的 编 程 方 法 去 实 现, 对 吗?OK, 这 个 我 学 过, 只 不 过 当 时 我 没 想 到 而 已 大 鸟 : 所 有 编 程 初 学 者 都 会 有 这 样 的 问 题, 就 是 碰 到 问 题 就 直 觉 的 用 计 算 机 能 够 理 解 的 逻 辑 来 描 述 和 表 达 待 解 决 的 问 题 及 具 体 的 求 解 过 程 这 其 实 是 用 计 算 机 的 方 式 去 思 考, 比 如 计 算 器 这 个 程 序, 先 要 求 输 入 两 个 数 和 运 算 符 号, 然 后 根 据 运 算 符 号 判 断 选 择 如 何 运 算, 得 到 结 果, 这 本 身 没 有 错, 但 这 样 的 思 维 却 使 得 我 们 的 程 序 只 为 满 足 实 现 当 前 的 需 求, 程 序 不 容 易 维 护, 不 容 易 扩 展, 更 不 容 易 复 用 从 而 达 不 到 高 质 量 代 码 的 要 求 小 菜 : 鸟 哥 呀, 我 有 点 糊 涂 了, 如 何 才 能 容 易 维 护, 容 易 扩 展, 又 容 易 复 用 呢, 能 不 能 具 体 点? 大 鸟 : 比 如 说, 我 现 在 要 求 你 再 写 一 个 windows 的 计 算 器, 你 现 在 的 代 码 能 不 能 复 用 呢? 小 菜 : 那 还 不 简 单, 把 代 码 复 制 过 去 不 就 行 了 吗? 改 动 又 不 大, 不 算 麻 烦 大 鸟 : 小 菜 看 来 还 是 小 菜 呀, 有 人 说 初 级 程 序 员 的 工 作 就 是 Ctrl+C 和 Ctrl+V, 这 其 实 是 非 常 不 好 的 编 码 习 惯, 因 为 当 你 的 代 码 中 重 复 的 代 码 多 到 一 定 程 度, 维 护 的 时 候, 可 能 就 是 一 场 灾 难 越 大 的 系 统, 这 种 方 式 带 来 的 问 题 越 严 重, 编 程 有 一 原 则, 就 是 用 尽 可 能 的 办 法 去 避 免 重 复 想 想 看, 你 写 的 这 段 代 码, 有 哪 些 是 和 控 制 台 无 关 的, 而 只 是 和 计 算 器 有 关 的? 7

第 四 章 业 务 的 封 装 小 菜 : 你 的 意 思 是 分 一 个 类 出 来? 哦, 对 的, 让 计 算 和 显 示 分 开 大 鸟 : 准 确 的 说, 就 是 让 业 务 逻 辑 与 界 面 逻 辑 分 开, 让 它 们 之 间 的 耦 合 度 下 降 只 有 分 离 开, 才 容 易 达 到 容 易 维 护 或 扩 展 小 菜 : 让 我 来 试 试 看 class Program static void Main(string[] args) try Console.Write(" 请 输 入 数 字 A:"); string strnumbera = Console.ReadLine(); Console.Write(" 请 选 择 运 算 符 号 (+ - * /):"); string stroperate = Console.ReadLine(); Console.Write(" 请 输 入 数 字 B:"); string strnumberb = Console.ReadLine(); string strresult = ""; strresult = Convert.ToString( Operation.GetResult(Convert.ToDouble(strNumberA), Convert.ToDouble(strNumberB), stroperate)); Console.WriteLine(" 结 果 是 :" + strresult); Console.ReadLine(); catch (Exception ex) Console.WriteLine(" 您 的 输 入 有 错 :" + ex.message); public class Operation public static double GetResult(double numbera, double numberb, string operate) double result = 0d; 8

switch (operate) case "+": result = numbera + numberb; break; case "-": result = numbera - numberb; break; case "*": result = numbera * numberb; break; case "/": result = numbera / numberb; break; return result; 小 菜 : 鸟 哥, 我 写 好 了, 你 看 看! 大 鸟 : 哈, 孺 鸟 可 教 也,:), 写 得 不 错, 这 样 就 完 全 把 业 务 和 界 面 分 离 了 小 菜 心 中 暗 骂 : 你 才 是 鸟 呢 口 中 说 道 : 如 果 你 现 在 要 我 写 一 个 Windows 应 用 程 序 的 计 算 器, 我 就 可 以 复 用 这 个 运 算 类 (Operation) 了 大 鸟 : 不 单 是 Windows 程 序,Web 版 程 序 需 要 运 算 可 以 用 它,PDA, 手 机 等 需 要 移 动 系 统 的 软 件 需 要 运 算 也 可 以 用 它 呀 小 菜 : 哈, 面 向 对 象 不 过 如 此 下 会 写 类 似 代 码 不 怕 了 大 鸟 : 别 急, 仅 此 而 已, 实 在 谈 不 上 完 全 面 向 对 象, 你 只 用 了 面 向 对 象 三 大 特 性 的 一 个, 还 两 个 没 用 呢? 小 菜 : 面 向 对 象 三 大 特 性 不 就 是 封 装 继 承 和 多 态 吗, 这 里 我 用 到 的 应 该 是 封 装 这 还 不 够 吗? 我 实 在 看 不 出, 这 么 小 的 程 序 如 何 用 到 继 承 至 于 多 态, 其 它 我 一 直 也 不 太 了 解 它 到 底 有 什 么 好 处, 如 何 使 用 它 大 鸟 : 慢 慢 来, 有 的 东 西 好 学 了, 你 好 好 想 想 吧, 我 要 去 魔 兽 了, 改 时 聊 9

第 五 章 体 会 简 单 工 厂 模 式 的 美 妙 次 日, 小 菜 再 来 找 大 鸟, 问 道 : 你 昨 天 说 计 算 器 这 样 的 小 程 序 还 可 以 用 到 面 向 对 象 三 大 特 性? 继 承 和 多 态 怎 么 可 能 用 得 上, 我 实 在 不 可 理 解 大 鸟 : 小 菜 很 有 钻 研 精 神 吗? 好, 今 天 我 让 你 功 力 加 深 一 级 你 先 要 考 虑 一 下, 你 昨 天 写 的 这 个 代 码, 能 否 做 到 很 灵 活 的 可 修 改 和 扩 展 呢? 小 菜 : 我 已 经 把 业 务 和 界 面 分 离 了 呀, 这 不 是 很 灵 活 了 吗? 大 鸟 : 那 我 问 你, 现 在 如 果 我 希 望 增 加 一 个 开 根 (sqrt) 运 算, 你 如 何 改? 小 菜 : 那 只 需 要 改 Operation 类 就 行 了, 在 switch 中 加 一 个 分 支 就 行 了 大 鸟 : 问 题 是 你 要 加 一 个 平 方 根 运 算, 却 需 要 把 加 减 乘 除 的 运 算 都 得 来 参 与 编 译, 如 果 你 一 不 小 心, 把 加 法 运 算 改 成 了 减 法, 这 不 是 大 大 的 糟 糕 打 个 比 方, 如 果 现 在 公 司 要 求 你 为 公 司 的 薪 资 管 理 系 统 做 维 护, 原 来 只 有 技 术 人 员 ( 月 薪 ), 市 场 销 售 人 员 ( 底 薪 + 提 成 ), 经 理 ( 年 薪 + 股 份 ) 三 种 运 算 算 法, 现 在 要 增 加 兼 职 工 作 人 员 的 ( 时 薪 ) 算 法, 但 按 照 你 昨 天 的 程 序 写 法, 公 司 就 必 须 要 把 包 含 有 的 原 三 种 算 法 的 运 算 类 给 你, 让 你 修 改, 你 如 果 心 中 小 算 盘 一 打, TMD, 公 司 给 我 的 工 资 这 么 低, 我 真 是 郁 闷, 这 会 有 机 会 了, 于 是 你 除 了 增 加 了 兼 职 算 法 以 外, 在 技 术 人 员 ( 月 薪 ) 算 法 中 写 了 一 句 if ( 员 工 是 小 菜 ) salary = salary * 1.1; 那 就 意 味 着, 你 的 月 薪 每 月 都 会 增 加 10%( 小 心 被 抓 去 坐 牢 ), 本 来 是 让 你 加 一 个 功 能, 却 使 得 原 有 的 运 行 良 好 的 功 能 代 码 产 生 了 变 化, 这 个 风 险 太 大 了 你 明 白 了 吗? 小 菜 : 哦, 你 的 意 思 是, 我 应 该 把 加 减 乘 除 等 运 算 分 离, 修 改 其 中 一 个 不 影 响 另 外 的 几 个, 增 加 运 算 算 法 也 不 影 响 其 它 代 码, 是 这 样 吗? 大 鸟 : 自 己 想 去 吧, 如 何 用 继 承 和 多 态, 你 应 该 有 感 觉 了 小 菜 : OK, 我 马 上 去 写 /// <summary> /// 运 算 类 /// </summary> class Operation private double _numbera = 0; private double _numberb = 0; /// <summary> /// 数 字 A /// </summary> public double NumberA get return _numbera; set _numbera = value; /// <summary> 10

/// 数 字 B /// </summary> public double NumberB get return _numberb; set _numberb = value; /// <summary> /// 得 到 运 算 结 果 /// </summary> /// <returns></returns> public virtual double GetResult() double result = 0; return result; /// <summary> /// 加 法 类 /// </summary> class OperationAdd : Operation public override double GetResult() double result = 0; result = NumberA + NumberB; return result; /// <summary> /// 减 法 类 /// </summary> class OperationSub : Operation public override double GetResult() double result = 0; result = NumberA - NumberB; return result; 11

/// <summary> /// 乘 法 类 /// </summary> class OperationMul : Operation public override double GetResult() double result = 0; result = NumberA * NumberB; return result; /// <summary> /// 除 法 类 /// </summary> class OperationDiv : Operation public override double GetResult() double result = 0; if (NumberB == 0) throw new Exception(" 除 数 不 能 为 0 "); result = NumberA / NumberB; return result; 小 菜 : 大 鸟 哥, 我 按 照 你 说 的 方 法 写 出 来 了 一 部 分, 首 先 是 一 个 运 算 类, 它 有 两 个 Number 属 性, 主 要 用 于 计 算 器 的 前 后 数, 然 后 有 一 个 虚 方 法 GetResult(), 用 于 得 到 结 果, 然 后 我 把 加 减 乘 除 都 写 成 了 运 算 类 的 子 类, 继 承 它 后, 重 写 了 GetResult() 方 法, 这 样 如 果 要 修 改 任 何 一 个 算 法, 都 不 需 要 提 供 其 它 算 法 的 代 码 了 但 问 题 来 了, 我 如 何 让 计 算 器 知 道 我 是 希 望 用 哪 一 个 算 法 呢? 大 鸟 : 写 得 很 不 错 吗, 大 大 超 出 我 的 想 象 了, 你 现 在 的 问 题 其 实 就 是 如 何 去 实 例 化 对 象 的 问 题, 哈, 今 天 心 情 不 错, 再 教 你 一 招 简 单 工 厂 模 式, 也 就 是 说, 到 底 要 实 例 化 谁, 将 来 会 不 会 增 加 实 例 化 的 对 象 ( 比 如 增 加 开 根 运 算 ), 这 是 很 容 易 变 化 的 地 方, 应 该 考 虑 用 一 个 单 独 的 类 来 做 这 个 创 造 实 例 的 过 程, 这 就 是 工 厂, 来, 我 们 看 看 这 个 类 如 何 写 /// <summary> /// 运 算 类 工 厂 /// </summary> class OperationFactory public static Operation createoperate(string operate) Operation oper = null; 12

switch (operate) case "+": oper = new OperationAdd(); break; case "-": oper = new OperationSub(); break; case "*": oper = new OperationMul(); break; case "/": oper = new OperationDiv(); break; return oper; 大 鸟 : 哈, 看 到 吧, 这 样 子, 你 只 需 要 输 入 运 算 符 号, 工 厂 就 实 例 化 出 合 适 的 对 象, 通 过 多 态, 返 回 父 类 的 方 式 实 现 了 计 算 器 的 结 果 Operation oper; oper = OperationFactory.createOperate("+"); oper.numbera = 1; oper.numberb = 2; double result = oper.getresult(); 大 鸟 : 哈, 界 面 的 实 现 就 是 这 样 的 代 码, 不 管 你 是 控 制 台 程 序,Windows 程 序,Web 程 序,PDA 或 手 机 程 序, 都 可 以 用 这 段 代 码 来 实 现 计 算 器 的 功 能, 当 有 一 天 我 们 需 要 更 改 加 法 运 算, 我 们 只 需 要 改 哪 里? 小 菜 : 改 OperationAdd 就 可 以 了 大 鸟 : 那 么 我 们 需 要 增 加 各 种 复 杂 运 算, 比 如 平 方 根, 立 方 根, 自 然 对 数, 正 弦 余 弦 等, 如 何 做? 小 菜 : 只 要 增 加 相 应 的 运 算 子 类 就 可 以 了 呀 大 鸟 : 嗯? 够 了 吗? 小 菜 : 对 了, 还 需 要 去 修 改 运 算 类 工 厂, 在 switch 中 增 加 分 支 大 鸟 : 哈, 那 才 对, 那 如 果 要 修 改 界 面 呢? 小 菜 : 那 就 去 改 界 面 呀, 关 运 算 什 么 事 呀 小 菜 : 回 想 那 天 我 面 试 题 写 的 代 码, 我 终 于 明 白 我 为 什 么 写 得 不 成 功 了, 原 来 一 个 小 小 的 计 算 器 也 可 以 写 出 这 么 13

精 彩 的 代 码, 谢 谢 大 鸟 ( 下 为 当 时 面 试 题 时 小 菜 所 写 代 码, 见 小 菜 编 程 成 长 记 ( 一 ) ) Program static void Main(string[] args) Console.Write(" 请 输 入 数 字 A:"); string A = Console.ReadLine(); Console.Write(" 请 选 择 运 算 符 号 (+ - * /):"); string B = Console.ReadLine(); Console.Write(" 请 输 入 数 字 B:"); string C = Console.ReadLine(); string D = ""; if (B == "+") D = Convert.ToString(Convert.ToDouble(A) + Convert.ToDouble(C)); if (B == "-") D = Convert.ToString(Convert.ToDouble(A) - Convert.ToDouble(C)); if (B == "*") D = Convert.ToString(Convert.ToDouble(A) * Convert.ToDouble(C)); if (O == "/") D = Convert.ToString(Convert.ToDouble(A) / Convert.ToDouble(C)); Console.WriteLine(" 结 果 是 :" + D); 大 鸟 : 吼 吼, 记 住 哦, 编 程 是 一 门 技 术, 更 加 是 一 门 艺 术, 不 能 只 满 足 于 写 完 代 码 运 行 结 果 正 确 就 完 事, 时 常 考 虑 如 何 让 代 码 更 加 简 炼, 更 加 容 易 维 护, 容 易 扩 展 和 复 用, 只 有 这 样 才 可 以 是 真 的 提 高 写 出 优 雅 的 代 码 真 的 是 一 种 很 爽 的 事 情 不 过 学 无 止 境, 其 实 这 才 是 理 解 面 向 对 象 的 开 始 呢 给 你 出 个 作 业, 做 一 个 商 场 收 银 软 件, 营 业 员 根 据 客 户 购 买 商 品 单 价 和 数 量, 向 客 户 收 费 小 菜 : 就 这 个? 没 问 题 呀 14

第 六 章 关 于 Flex 的 争 论? 声 明 : 本 文 略 有 广 告 之 嫌, 不 过 写 此 文 的 初 衷 却 是 因 为 对 上 篇 博 客 引 发 争 议 的 感 想, 所 以 看 此 文 前 不 妨 先 看 看 上 文 的 评 论, 感 谢 您 的 阅 读, 欢 迎 拍 砖 几 天 后, 小 菜 跑 到 大 鸟 处, 说 道 : 大 鸟 哥, 今 天 看 到 一 个 网 站, 叫 妙 句 网, 是 用 来 收 藏 好 句 子 用 的, 网 站 本 身 没 什 么 太 多 希 奇, 但 它 用 的 技 术 却 是 最 近 非 常 火 的 Flex 技 术, 作 者 说 他 也 就 学 了 不 到 两 个 月 就 做 出 了 这 个 网 站, 你 说 会 不 会 是 真 的? 如 果 真 的 是 这 样, 我 也 想 学 学, 毕 竟 做 出 来 的 效 果 比 一 般 的 网 站 真 的 要 酷 很 多 哦 大 鸟 : 哦? 让 我 来 看 看 大 鸟 打 开 了 浏 览 器, 键 入 了 小 菜 说 的 网 站 嗯? 怎 么 是 flash 的? 大 鸟 说 小 菜 点 头 道 : Flex 其 实 就 是 开 发 出 可 以 在 Flash Player 插 件 上 运 行 的 编 程 工 具! 你 看, 它 整 个 网 站 就 是 一 个 Flash, 开 始 下 载 是 慢 了 点, 但 下 载 好 了, 大 部 分 操 作 都 不 用 再 访 问 网 络 了, 局 部 的 更 新 数 据, 也 只 是 局 部 刷 新 而 已 你 点 这 个 登 录, 哈, 登 录 就 从 上 框 跳 出 来, 还 会 抖 动 两 下, 再 看, 点 这 个 Show 出 来 框 后, 点 播 放, 那 个 句 子 翻 页 的 3D 效 果 是 不 是 很 酷? 还 有 Stop! 停! 大 鸟 突 然 说 道, 你 是 来 给 我 做 广 告 来 了? 这 种 纯 粹 为 炫 点 效 果 而 做 的 网 站 我 见 得 多 了, 有 什 么 希 奇 的 我 虽 然 没 做 过 Flash, 但 开 发 这 些 年, 我 还 不 知 道? 就 象 我 没 得 过 禽 流 感, 但 感 冒 啥 滋 味, 我 不 会 比 鸡 知 道 的 少 了 可 是 听 说 这 技 术 很 容 易 学, 用 不 了 多 久 就 可 以 上 手, 做 出 漂 亮 的 东 西 你 之 前 不 是 还 整 天 跟 我 说 AJAX 太 他 妈 麻 烦, JavaScript 调 试 极 度 困 难, 还 要 考 虑 跨 浏 览 器 等 诸 多 问 题, 写 Ajax 网 站 吃 力 不 讨 好 吗? 哈 哈, 小 菜 呀 小 菜, 外 行 了 吧 写 这 网 站 的 人 说 是 只 学 了 Flex 一 个 多 月 做 出 这 东 西, 我 也 相 信 他 说 的 是 真 的, 但 这 里 面 有 多 少 细 节 技 术 是 你 看 不 到 的? 我 说 几 个 细 节 给 你 听 听, 比 如 注 册,Email 如 何 验 证? 这 用 正 则 表 达 式 判 断 最 好, 你 得 懂 才 行, 哪 怕 上 网 查, 至 少 你 要 知 道 如 何 用 吧 再 比 如 这 网 站 上 的 分 页, 每 页 显 示 10 条 信 息, 如 果 把 一 千 多 条 句 子 全 下 载 不 就 傻 了 吗? 可 若 每 次 换 页 只 下 载 10 条, 这 就 得 懂 得 如 何 写 这 样 的 Sql 语 句, 当 然 最 好 是 存 储 过 程 至 于 整 个 网 站 包 括 了 从 注 册 登 录 增 删 改 句 子 到 句 子 列 表, 正 文 显 示, 搜 索 查 询, 这 就 是 一 整 套 的 网 站 基 本 架 构, 这 些 都 是 要 技 术 积 累 的 啊, 这 倒 是 真 的, 正 则 表 达 式 学 过, 但 还 是 不 会 用, 分 页 存 储 过 程 干 脆 就 写 不 来, 要 独 立 写 个 网 站, 看 来 也 的 确 是 有 难 度 的 15

不 过, 这 网 站 其 实 做 了 也 没 太 大 的 用 处 大 鸟 说 道, 第 一,Flash 占 的 系 统 资 源 太 大, 你 看, 我 才 点 击 tag 查 询, 我 的 CPU 就 100%, 我 在 放 的 MP3, 声 音 都 开 始 打 抖 了, 这 真 的 很 不 爽 第 二,Flash 是 封 装 成 swf 文 件 下 载 的, 也 就 是 说 搜 索 引 擎 是 根 本 找 不 到 里 面 的 数 据, 里 面 的 句 子 也 就 谈 不 上 被 搜 索 到 这 样 这 些 数 据 又 如 何 能 被 大 众 用 户 查 看 到? 咦, 我 在 家 里 好 像 感 觉 不 到 速 度 问 题 吗? 哦, 我 明 白 了, 因 为 我 的 笔 记 本 是 双 核 的, 最 多 也 就 占 用 50%, 看 来 硬 件 的 提 升 也 是 促 进 软 件 的 发 展 呀 不 过 搜 索 引 擎 好 像 是 很 难 办, 有 没 有 什 么 解 决 方 案? 大 鸟 说 : 搜 索 引 擎 对 整 站 SWF 的 索 引 的 问 题, 目 前 没 有 什 么 完 美 的 解 决 方 法, 或 许, 我 们 可 以 生 成 一 个 sitemap, 让 搜 索 引 擎 的 爬 虫 自 己 爬 上 来 大 鸟 继 续 说 道 : 所 以 我 说 这 种 网 站, 没 什 么 太 大 用 处,Flex 这 种 富 客 户 端 技 术, 不 过 是 个 噱 头 罢 了 唉, 大 鸟, 我 就 不 同 意 的 你 看 法 小 菜 有 点 激 动, 现 在 有 了 DVD, 你 还 会 去 小 摊 买 SVCD 看 吗? 现 在 有 了 Windows, 你 还 会 去 整 天 对 着 黑 屏 用 Dos 敲 打 命 令 行 吗? 富 客 户 端 可 以 做 到 更 加 好 的 客 户 感 受 度, 又 不 用 安 装 和 升 级, 这 结 合 C/S 和 B/S 的 优 点 于 一 身 的 好 技 术 小 菜,html 是 Internet 的 主 流, 要 客 户 感 受 度, 还 是 好 好 研 究 JavaScript 的 AJAX 技 术 吧 大 鸟 语 重 声 长 的 说 降 龙 十 八 掌 固 然 强 悍 勇 猛, 那 是 因 为 没 有 发 明 手 枪 ; 赤 兔 固 然 是 良 驹, 那 是 因 为 关 老 儿 没 有 宝 马 大 奔 谁 说 html 今 天 是 主 流, 就 意 味 着 未 来 是 主 流? 我 觉 得 AJAX 有 很 大 的 局 限 性, 是 一 种 过 渡 技 术 未 来 一 定 是 富 客 户 端 的 天 下 小 菜 别 激 动, 你 说 得 也 有 道 理 我 举 个 例 子 你 就 会 明 白,Flex 或 Flash 以 前 是 Macromedia 现 在 上 Adobe 的 主 推 的 产 品 吧, 那 我 问 你, 他 们 的 官 方 网 站 是 什 么 写 的? 大 鸟 慢 条 斯 理 道 这 个 好 像 还 是 html 小 菜 犹 豫 后 答 道 你 有 想 过 为 什 么? 还 有 那 些 Flex 的 技 术 网 站, 比 如 博 客 呀 论 坛 呀 什 么 的, 我 敢 肯 定 的 说, 一 定 不 是 用 富 客 户 端 技 术 做 的 是 不 是 因 为 不 好 搜 索? 小 菜 疑 问 中 这 是 一 方 面 吧, 其 实 文 字 信 息 很 大 的 网 站, 都 不 太 适 合 这 种 技 术 的, 因 为 它 要 的 不 是 过 渡 效 果, 而 是 内 容 本 身 如 果 内 容 不 够 好, 网 站 再 漂 亮 也 是 没 有 用 的, 而 内 容 够 好, 却 没 有 人 能 找 得 到 这 些 内 容, 这 内 容 也 是 价 值 不 大 的, 这 也 正 是 为 什 么 连 Adobe 公 司 自 己 在 发 布 网 站 时 也 用 的 是 传 统 的 html 模 式 是, 我 理 解 你 的 意 思, 就 是 说 这 种 文 字 信 息 网 站 不 适 合, 但 有 些 网 站, 比 如 公 司 产 品 展 示, 动 漫 游 戏 等 才 更 适 合 是 吗? 16

大 鸟 说 : 当 然, 还 不 只 是 这 些,Google 推 出 一 种 理 念, 就 是 要 弱 化 客 户 端, 强 化 网 络, 也 就 是 说, 过 去 我 们 上 网 的 习 惯 是 下 载, 把 好 的 东 西 都 下 载 到 本 地 来, 现 在 要 反 过 来 比 如 以 前 我 们 都 是 把 Email 收 到 本 地, 不 然 网 络 信 箱 就 会 满 而 收 不 了 信, 但 这 就 带 来 了 一 个 坏 处, 你 要 是 没 有 在 这 台 机 器 旁, 你 想 看 你 以 前 的 信 就 不 可 能 了, 甚 至 操 作 系 统 崩 溃 后 可 能 这 些 信 就 没 了, 当 然 照 片, 文 档 也 是 如 此 现 在 呢, 最 好 的 办 法 是 把 所 有 的 信 息, 都 放 在 网 络 上, 比 如 Gmail 里, 比 如 163 里, 或 者 什 么 网 站 硬 盘 里 ( 最 好 是 大 公 司 ) 只 要 有 网 络 你 想 在 什 么 地 方 用 它 都 行 明 白, 同 样 道 理, 我 现 在 看 到 的 在 线 Office 在 线 Web OS 在 线 图 片 处 理 等 应 用, 都 是 Flex 的 应 用, 也 就 是 说 以 后 这 些 都 不 需 要 操 作 系 统 里 安 装 什 么 软 件 了 哈, 小 菜 开 窍 了, 这 样 操 作 系 统 的 功 能 就 下 降 了, 以 前 要 听 音 乐 看 电 影 都 需 下 载, 现 在 都 是 在 线 听, 以 前 游 戏 都 是 在 家 独 自 玩, 现 在 都 网 游, 现 在 聊 天 都 QQ,MSN, 将 来 都 WebIM, 总 有 一 天, 客 户 端 会 只 是 一 个 类 似 浏 览 器 的 东 东 就 行 的, 不 只 是 电 脑, 手 机, 家 电 都 能 上 Internet, 那 才 是 未 来 发 展 的 方 向 不 过, 你 知 道 吗? 真 这 样 的 话, 谁 最 不 开 心? 嗯? 谁 会 不 开 心? 这 不 是 大 家 都 好 吗? 哈, 当 然 是 微 软 最 不 开 心, 因 为 他 们 是 卖 操 作 系 统 的 呀, 操 作 系 统 功 能 越 来 越 弱 化 了, 他 们 的 市 场 不 就 小 了 吗? 所 以 同 样 是 推 出 富 客 户 端 应 用 (WPF 和 Flex), 微 软 和 Adobe 的 想 法 是 不 一 样 的, 微 软 是 希 望 和 操 作 系 统 连 接 更 紧 密, 而 Adobe 或 Google 却 是 希 望 客 户 端 越 简 单 越 好 大 鸟 呀, 你 说 话 前 后 矛 盾 的, 刚 才 还 在 和 我 说 Flex 这 种 富 客 户 端 技 术, 不 过 是 个 噱 头 罢 了, 现 在 又 在 大 谈 富 客 户 端 的 好, 你 到 底 是 什 么 意 思? 咱 们 领 袖 毛 老 人 家 说 过, 看 问 题 要 用 辩 证 法, 事 物 都 有 两 面 性 富 客 户 端 有 好 的 方 面, 当 然 也 存 在 着 不 足, 现 在 这 技 术 还 不 够 成 熟, 至 少 在 以 文 字 内 容 为 主 的 网 站, 这 种 技 术 还 是 没 太 大 的 用 处, 所 以 妙 句 网 只 是 一 个 噱 头, 不 能 成 大 气 候 我 却 觉 得, 新 事 物 总 会 有 人 说 不 好 的, 妙 句 这 个 创 意 本 身 很 好, 用 这 个 技 术 也 感 觉 和 一 般 网 站 不 一 样, 只 不 过 现 在 刚 开 始, 还 没 有 发 挥 Flex 的 特 性 吧, 听 说 AJAX 和 Flex 可 以 直 接 通 讯 的, 或 许 和 html 结 合 一 下, 句 子 能 被 搜 索 引 擎 找 到, 加 上 性 能 优 化 后 让 客 户 端 CPU 压 力 不 太 大, 我 相 信 它 会 越 来 越 好 起 来 我 决 定 了, 我 也 要 学 Flex, 做 一 个 贼 酷 的 富 客 户 端 网 站 得 了 吧 你, 大 鸟 说 道, 你 还 是 好 好 打 好 基 础, 上 会 你 写 完 计 算 器 的 程 序, 后 面 我 留 的 作 业 你 做 了 没 有, 就 是 做 一 个 商 场 收 银 软 件, 营 业 员 根 据 客 户 购 买 商 品 单 价 和 数 量, 向 客 户 收 费 啊, 我 忘 记 了, 那 个 没 什 么 大 问 题, 我 尽 快 去 写 17

第 七 章 工 厂 不 好 用 了? 小 菜 心 里 想 : 大 鸟 要 我 做 的 是 一 个 商 场 收 银 软 件, 营 业 员 根 据 客 户 购 买 商 品 单 价 和 数 量, 向 客 户 收 费 这 个 很 简 单, 两 个 文 本 框, 输 入 单 价 和 数 量, 再 用 个 列 表 框 来 记 录 商 品 的 合 计, 最 终 用 一 个 按 钮 来 算 出 总 额 就 可, 对, 还 需 要 一 个 重 置 按 钮 来 重 新 开 始, 不 就 行 了?! 代 码 样 例 ( 可 使 用 ): 商 场 收 银 系 统 v1.0 关 键 代 码 如 下 : // 声 明 一 个 double 变 量 total 来 计 算 总 计 double total = 0.0d; private void btnok_click(object sender, EventArgs e) // 声 明 一 个 double 变 量 totalprices 来 计 算 每 个 商 品 的 单 价 (txtprice)* 数 量 (txtnum) 后 的 合 计 double totalprices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text); // 将 每 个 商 品 合 计 计 入 总 计 total = total + totalprices; // 在 列 表 框 中 显 示 信 息 lbxlist.items.add( " 单 价 :" + txtprice.text + " 数 量 :" + txtnum.text + " 合 计 :" + totalprices.tostring()); // 在 lblresult 标 签 上 显 示 总 计 数 lblresult.text = total.tostring(); 18

大 鸟, 小 菜 叫 道, 来 看 看, 这 不 就 是 你 要 的 收 银 软 件 吗? 我 不 到 半 小 时 就 搞 定 了 哈 哈, 很 快 吗, 大 鸟 说 着, 看 了 看 小 菜 的 代 码 接 着 说 : 现 在 我 要 求 商 场 对 商 品 搞 活 动, 所 有 的 商 品 打 8 折 那 不 就 是 在 totalprices 后 面 乘 以 一 个 0.8 吗? 小 子, 难 道 商 场 活 动 结 束, 不 打 折 了, 你 还 要 再 把 程 序 改 写 代 码 再 去 把 所 有 机 器 全 部 安 装 一 次 吗? 再 说, 我 现 在 还 有 可 能 因 为 周 年 庆, 打 五 折 的 情 况, 你 怎 么 办? 小 菜 不 好 意 思 道 : 啊, 我 想 得 是 简 单 了 点 其 实 只 要 加 一 个 下 拉 选 择 框 就 可 以 解 决 你 说 的 问 题 大 鸟 微 笑 不 语 商 场 收 银 系 统 v1.1 关 键 代 码 如 下 : double total = 0.0d; private void btnok_click(object sender, EventArgs e) double totalprices = 0d; //cbxtype 是 一 个 下 拉 选 择 框, 分 别 有 正 常 收 费 打 8 折 打 7 折 和 打 5 折 switch (cbxtype.selectedindex) case 0: totalprices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text); break; case 1: totalprices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text) * 0.8; break; case 2: totalprices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text) * 0.7; break; case 3: totalprices = Convert.ToDouble(txtPrice.Text) * Convert.ToDouble(txtNum.Text) * 0.5; break; total = total + totalprices; lbxlist.items.add( " 单 价 :" + txtprice.text + " 数 量 :" + txtnum.text + " " + cbxtype.selecteditem + " 合 计 :" + totalprices.tostring()); lblresult.text = total.tostring(); 19

这 下 可 以 了 吧, 只 要 我 事 先 把 商 场 可 能 的 打 折 都 做 成 下 拉 选 择 框 的 项, 要 变 化 的 可 能 性 就 小 多 了 小 菜 说 道 这 比 刚 才 灵 活 性 上 是 好 多 了, 不 过 重 复 代 码 很 多, 像 Convert.ToDouble(), 你 这 里 就 写 了 8 遍, 而 且 4 个 分 支 要 执 行 的 语 句 除 了 打 折 多 少 以 外 几 乎 没 什 么 不 同, 应 该 考 虑 重 构 一 下 不 过 还 不 是 最 主 要 的, 现 在 我 的 需 求 又 来 了, 商 场 的 活 动 加 大, 需 要 有 满 300 返 100 的 促 销 算 法, 你 说 怎 么 办? 满 300 返 100, 那 要 是 700 就 要 返 200 了? 这 个 必 须 要 写 函 数 了 吧? 小 菜 呀, 看 来 之 前 教 你 的 白 教 了, 这 里 面 看 不 出 什 么 名 堂 吗? 哦! 我 想 起 来 了, 你 的 意 思 是 简 单 工 厂 模 式 是 吧, 对 的 对 的, 我 可 以 先 写 一 个 父 类, 再 继 承 它 实 现 多 个 打 折 和 返 利 的 子 类, 利 用 多 态, 完 成 这 个 代 码 你 打 算 写 几 个 子 类? 根 据 需 求 呀, 比 如 8 折 7 折 5 折 满 300 送 100 满 200 送 50 要 几 个 写 几 个 小 菜 又 不 动 脑 子 了, 有 必 要 这 样 吗? 如 果 我 现 在 要 3 折, 我 要 满 300 送 80, 你 难 道 再 去 加 子 类? 你 不 想 想 看, 这 当 中 哪 些 是 相 同 的, 哪 些 是 不 同 的? 对 的, 这 里 打 折 基 本 都 是 一 样 的, 只 要 有 个 初 始 化 参 数 就 可 以 了 满 几 送 几 的, 需 要 两 个 参 数 才 行, 明 白, 现 在 看 来 不 麻 烦 了 面 向 对 象 的 编 程, 并 不 是 类 越 多 越 好, 类 的 划 分 是 为 了 封 装, 但 分 类 的 基 础 是 抽 象, 具 有 相 同 属 性 和 功 能 的 对 象 的 抽 象 集 合 才 是 类 打 一 折 和 打 九 折 只 是 形 式 的 不 同, 抽 象 分 析 出 来, 所 有 的 打 折 算 法 都 是 一 样 的, 所 以 打 折 算 法 应 该 是 一 个 类 好 了, 空 话 已 说 了 太 多, 写 出 来 再 是 真 的 懂 大 约 1 个 小 时 后, 小 菜 交 出 了 第 三 份 的 作 业 商 场 收 银 系 统 v1.3 关 键 代 码 如 下 // 现 金 收 取 父 类 abstract class CashSuper 20

// 抽 象 方 法 : 收 取 现 金, 参 数 为 原 价, 返 回 为 当 前 价 public abstract double acceptcash(double money); // 正 常 收 费, 继 承 CashSuper class CashNormal : CashSuper public override double acceptcash(double money) return money; // 打 折 收 费, 继 承 CashSuper class CashRebate : CashSuper private double moneyrebate = 1d; // 初 始 化 时, 必 需 要 输 入 折 扣 率, 如 八 折, 就 是 0.8 public CashRebate(string moneyrebate) this.moneyrebate = double.parse(moneyrebate); public override double acceptcash(double money) return money * moneyrebate; // 返 利 收 费, 继 承 CashSuper class CashReturn : CashSuper private double moneycondition = 0.0d; private double moneyreturn = 0.0d; // 初 始 化 时 必 须 要 输 入 返 利 条 件 和 返 利 值, 比 如 满 300 返 100, // 则 moneycondition 为 300,moneyReturn 为 100 public CashReturn(string moneycondition, string moneyreturn) this.moneycondition = double.parse(moneycondition); this.moneyreturn = double.parse(moneyreturn); public override double acceptcash(double money) double result = money; // 若 大 于 返 利 条 件, 则 需 要 减 去 返 利 值 if (money >= moneycondition) 21

result = money - Math.Floor(money / moneycondition) * moneyreturn; return result; // 现 金 收 取 工 厂 class CashFactory // 根 据 条 件 返 回 相 应 的 对 象 public static CashSuper createcashaccept(string type) CashSuper cs = null; switch (type) case " 正 常 收 费 ": cs = new CashNormal(); break; case " 满 300 返 100": CashReturn cr1 = new CashReturn("300", "100"); cs = cr1; break; case " 打 8 折 ": CashRebate cr2 = new CashRebate("0.8"); cs = cr2; break; return cs; // 客 户 端 窗 体 程 序 ( 主 要 部 分 ) CashSuper csuper;// 声 明 一 个 父 类 对 象 double total = 0.0d; private void btnok_click(object sender, EventArgs e) // 利 用 简 单 工 厂 模 式 根 据 下 拉 选 择 框, 生 成 相 应 的 对 象 csuper = CashFactory.createCashAccept(cbxType.SelectedItem.ToString()); double totalprices = 0d; // 通 过 多 态, 可 以 得 到 收 取 费 用 的 结 果 totalprices = csuper.acceptcash( onvert.todouble(txtprice.text) * Convert.ToDouble(txtNum.Text) ); total = total + totalprices; lbxlist.items.add( 22

" 单 价 :" + txtprice.text + " 数 量 :" + txtnum.text + " " + cbxtype.selecteditem + " 合 计 :" + totalprices.tostring()); lblresult.text = total.tostring(); 代 码 样 例 ( 可 使 用 ) 大 鸟, 搞 定, 这 次 无 论 你 要 怎 么 改, 我 都 可 以 简 单 处 理 就 行 了 小 菜 自 信 满 满 的 说 是 吗, 我 要 是 需 要 打 5 折 和 满 500 送 200 的 促 销 活 动, 如 何 办? 只 要 在 现 金 工 厂 当 中 加 两 个 条 件, 在 界 面 的 下 拉 选 项 框 里 加 两 项, 就 OK 了 现 金 工 厂?! 你 当 是 生 产 钞 票 呀 是 收 费 对 象 生 成 工 厂 才 准 确 说 得 不 错, 如 果 我 现 在 需 要 增 加 一 种 商 场 促 销 手 段, 满 100 积 分 10 点, 以 后 积 分 到 一 定 时 候 可 以 领 取 奖 品 如 何 做? 有 了 工 厂, 何 难? 加 一 个 积 分 算 法, 构 造 方 法 有 两 个 参 数 : 条 件 和 返 点, 让 它 继 承 CashSuper, 再 到 现 金 工 厂, 哦, 不 对,, 是 收 费 对 象 生 成 工 厂 里 加 满 100 积 分 10 点 的 分 支 条 件, 再 到 界 面 稍 加 改 动, 就 行 了 嗯, 不 错, 那 我 问 你, 如 果 商 场 现 在 需 要 拆 迁, 没 办 法, 只 能 跳 楼 价 销 售, 商 场 的 所 有 商 品 都 需 要 打 8 折, 打 折 后 的 价 钱 再 每 种 商 品 满 300 送 50, 最 后 计 总 价 的 时 候, 商 场 还 满 1000 送 200, 你 说 如 何 办? 23

搞 没 搞 错 哦, 这 商 场 不 如 白 送 得 了, 哪 有 这 样 促 销 的? 老 板 跳 楼 时 估 计 都 得 赤 条 条 的 了 商 场 大 促 销 你 还 不 高 兴 呀! 当 然, 你 是 软 件 开 发 者, 客 户 老 是 变 动 需 求 的 确 不 爽, 但 你 不 能 不 让 客 户 提 需 求 呀, 我 不 是 说 过 吗, 需 求 的 变 更 是 必 然! 所 以 开 发 者 应 该 的 是 考 虑 如 何 让 自 己 的 程 序 更 能 适 应 变 化, 而 不 是 抱 怨 客 户 的 无 理, 客 户 不 会 管 程 序 员 加 班 时 的 汗 水, 也 不 相 信 程 序 员 失 业 时 的 眼 泪, 因 为 客 户 自 己 正 在 为 自 己 的 放 血 甩 卖 而 流 泪 呀 大 鸟 接 着 说 : 简 单 工 厂 模 式 虽 然 也 能 解 决 这 个 问 题, 但 的 确 不 是 最 好 的 办 法, 另 外 由 于 商 场 是 可 能 经 常 性 的 更 改 打 折 额 度 和 返 利 额 度, 每 次 更 改 都 需 要 改 写 代 码 重 新 编 译 部 署 真 的 是 很 糟 糕 的 处 理 方 式, 面 对 算 法 的 时 常 变 动, 应 该 有 更 好 的 办 法 好 好 去 研 究 一 下 设 计 模 式 吧, 推 荐 你 看 一 本 书, 深 入 浅 出 设 计 模 式, 或 许 你 看 完 第 一 章, 就 会 有 解 决 办 法 了 小 菜 进 入 了 沉 思 中 本 例 C# 源 代 码 CashAcceptSystem.rar 另 : 建 议 大 家 去 阅 读 深 入 浅 出 设 计 模 式, 第 一 章 下 载, 本 人 非 常 喜 欢 这 本 书 的 风 格, 这 是 真 正 的 做 到 了 深 入 浅 出 呀 我 也 希 望 自 己 可 以 用 类 似 的 方 式 讲 述 问 题 本 文 还 有 一 个 用 意 是 对 一 些 初 学 者, 可 以 考 虑 一 下 大 鸟 提 出 的 问 题, 在 我 的 下 一 篇 小 菜 编 程 成 长 记 八 出 来 之 前, 改 写 我 的 源 代 码, 实 现 更 灵 活 更 方 便 的 商 场 收 银 程 序 共 享 给 大 家 讨 论, 或 许 您 写 的 东 东 比 我 写 的 还 要 好, 那 样 就 大 家 都 有 提 高 了 程 序 不 是 看 出 来 的, 是 写 出 来 的 好 好 加 油! 24

第 八 章 用 策 略 模 式 是 一 种 好 策 略 小 菜 次 日 来 找 大 鸟, 说 : 深 入 浅 出 设 计 模 式 的 第 一 章 我 看 完 了, 它 讲 的 是 策 略 模 式 (Strategy) 策 略 模 式 定 义 了 算 法 家 族, 分 别 封 装 起 来, 让 它 们 之 间 可 以 互 相 替 换, 此 模 式 让 算 法 的 变 化, 不 会 影 响 到 使 用 算 法 的 客 户 看 来 商 场 收 银 系 统 应 该 考 虑 用 策 略 模 式? 你 问 我? 你 说 呢? 大 鸟 笑 道, 商 场 收 银 时 如 何 促 销, 用 打 折 还 是 返 利, 其 实 都 是 一 些 算 法, 用 工 厂 来 生 成 算 法 对 象, 感 觉 是 不 是 很 怪? 而 最 重 要 的 是 这 些 算 法 是 随 时 都 可 能 互 相 替 换 的, 这 就 是 变 化 点, 而 封 装 变 化 点 是 我 们 面 向 对 象 的 一 种 很 重 要 的 思 维 方 式 策 略 模 式 的 结 构 ( 源 自 吕 震 宇 博 客 ) 这 个 模 式 涉 及 到 三 个 角 色 : 环 境 (Context) 角 色 : 持 有 一 个 Strategy 类 的 引 用 抽 象 策 略 (Strategy) 角 色 : 这 是 一 个 抽 象 角 色, 通 常 由 一 个 接 口 或 抽 象 类 实 现 此 角 色 给 出 所 有 的 具 体 策 略 类 所 需 的 接 口 具 体 策 略 (ConcreteStrategy) 角 色 : 包 装 了 相 关 的 算 法 或 行 为 我 明 白 了, 小 菜 说, 我 昨 天 写 的 CashSuper 就 是 抽 象 策 略, 而 正 常 收 费 CashNormal 打 折 收 费 CashRebate 和 返 利 收 费 CashReturn 就 是 三 个 具 体 策 略, 也 就 是 策 略 模 式 中 说 的 具 体 算 法, 对 吧? 25

是 的, 那 么 关 键 就 在 于 Context 以 及 客 户 端 程 序 如 何 写 了? 去 查 查 资 料, 研 究 后 把 代 码 写 出 来 给 我 看 大 鸟 鼓 励 道 好 的, 我 一 定 很 快 写 出 来 给 你 看! 小 菜 很 兴 奋 过 一 小 时 后, 小 菜 给 出 商 场 收 银 程 序 的 第 四 份 作 业 CashContext 类 代 码 如 下 : // 收 费 策 略 Context class CashContext // 声 明 一 个 现 金 收 费 父 类 对 象 private CashSuper cs; // 设 置 策 略 行 为, 参 数 为 具 体 的 现 金 收 费 子 类 ( 正 常, 打 折 或 返 利 ) public void setbehavior(cashsuper csuper) this.cs = csuper; // 得 到 现 金 促 销 计 算 结 果 ( 利 用 了 多 态 机 制, 不 同 的 策 略 行 为 导 致 不 同 的 结 果 ) public double GetResult(double money) return cs.acceptcash(money); 26

客 户 端 主 要 代 码 如 下 : double total = 0.0d;// 用 于 总 计 private void btnok_click(object sender, EventArgs e) CashContext cc = new CashContext(); switch (cbxtype.selecteditem.tostring()) case " 正 常 收 费 ": cc.setbehavior(new CashNormal()); break; case " 满 300 返 100": cc.setbehavior(new CashReturn("300", "100")); break; case " 打 8 折 ": cc.setbehavior(new CashRebate("0.8")); break; double totalprices = 0d; totalprices = cc.getresult(convert.todouble(txtprice.text) * Convert.ToDouble(txtNum.Text)); total = total + totalprices; lbxlist.items.add( " 单 价 :" + txtprice.text + " 数 量 :" + txtnum.text + " " + cbxtype.selecteditem + " 合 计 :" + totalprices.tostring()); lblresult.text = total.tostring(); 27

大 鸟, 我 用 策 略 模 式 是 实 现 了, 但 有 些 疑 问, 用 了 策 略 模 式, 则 把 分 支 判 断 又 放 回 到 客 户 端 来 了, 这 等 于 要 改 变 需 求 算 法 时, 还 是 要 去 更 改 客 户 端 的 程 序 呀? 问 得 好, 如 果 不 是 因 为 前 面 有 工 厂 的 例 子, 再 来 通 过 你 的 思 考 写 出 的 这 个 策 略 模 式 的 程 序, 你 就 问 不 出 这 样 的 问 题 的 大 鸟 很 开 心, 继 续 讲 道, 最 初 的 策 略 模 式 是 有 缺 点 的, 客 户 端 必 须 知 道 所 有 的 策 略 类, 并 自 行 决 定 使 用 哪 一 个 策 略 类 这 就 意 味 着 客 户 端 必 须 理 解 这 些 算 法 的 区 别, 以 便 适 时 选 择 恰 当 的 算 法 类 换 言 之, 策 略 模 式 只 适 用 于 客 户 端 知 道 所 有 的 算 法 或 行 为 的 情 况 那 还 不 如 工 厂 模 式 好 用, 至 少 要 增 加 促 销 或 改 进 打 折 额 度 时, 不 用 去 大 改 界 面, 而 现 在, 界 面 程 序 要 承 担 的 责 任 还 是 太 大 没 有 体 现 你 说 的 封 装 变 化 点 的 作 用 呀 小 菜 疑 问 多 多 就 目 前 而 言, 的 确 是 这 样, 这 样 的 程 序 确 实 还 是 不 够 完 善, 要 改 的 地 方 还 很 多 大 鸟 说 道, 不 过 正 所 谓 病 毒 时 间 长 了 会 有 变 种, 杀 毒 软 件 本 身 也 会 随 着 病 毒 的 变 化 而 升 级 改 良, 如 果 我 们 对 策 略 模 式 做 一 些 改 进, 引 入 一 些 新 的 技 术 处 理 方 式, 就 可 以 避 免 现 在 的 这 种 耦 合 了 小 菜, 又 有 新 的 东 西 要 学 了, 好 好 加 油 呀! 大 鸟, 谢 谢 你,, 你 总 是 让 我 带 着 问 题 去 思 考, 而 不 是 直 接 说 答 案, 我 觉 得 这 样 学 习 进 步 很 快, 也 不 觉 得 设 计 模 式 很 难 了, 用 不 着 这 么 客 气, 我 只 是 觉 得, 没 有 人 是 天 生 就 牛 X 的, 有 一 些 所 谓 的 技 术 牛 人 总 会 在 人 面 前 说 什 么, 你 连 这 都 不 懂, 这 还 不 简 单 了, 你 够 笨 的 等 等 说 词 给 人 感 觉 他 非 常 聪 明, 天 生 就 会 的 样 子, 其 实 他 在 之 前 也 不 知 走 过 多 少 弯 路, 犯 过 多 少 错, 或 许 他 之 前 也 被 更 早 的 牛 人 羞 辱 过, 所 以 再 继 续 把 羞 辱 传 给 后 人 大 鸟 有 些 激 动 28

小 菜 小 心 的 说 道 : 大 鸟, 你 是 不 是 也 曾 经 被 人 羞 哈 哈, 马 云 曾 说 过, 男 人 的 胸 怀 是 被 冤 枉 撑 大 的! 天 天 在 这 行 当 里 混, 阅 人 无 数, 被 羞 辱 也 是 正 常 的 事 了 问 题 在 于 是 不 是 头 脑 清 醒, 自 己 不 能 放 弃 呀 所 以 我 希 望 能 真 正 的 帮 助 初 学 者 成 长, 而 不 是 去 显 示 牛 气 充 当 狂 人 小 菜, 记 住, 学 习 一 定 是 一 个 自 己 感 悟 的 过 程, 而 程 序 员 的 感 悟 就 是 自 己 写 程 序 做 项 目, 通 过 实 践 再 学 习, 最 终 升 华 为 牛 人 嗯, 我 记 住 了, 不 过 到 底 如 何 改 良 策 略 模 式 呢? 大 鸟 微 笑 不 语 本 文 相 关 源 代 码 CashAcceptSystem2.rar 29

第 九 章 反 射 程 序 员 的 快 乐! 到 底 如 何 去 改 良 策 略 模 式 呢? 小 菜 恳 切 地 问 道 你 仔 细 观 察 过 没 有, 你 的 代 码, 不 管 是 用 工 厂 模 式 写 的, 还 是 用 策 略 模 式 写 的, 那 个 分 支 的 switch 依 然 去 不 掉 原 因 在 哪 里? 大 鸟 反 问 道 因 为 程 序 里 有 下 拉 选 择, 用 户 是 有 选 择 的, 那 么 程 序 就 必 须 要 根 据 用 户 的 选 择 来 决 定 实 例 化 哪 一 个 子 类 对 象 无 论 是 在 客 户 端 窗 体 类 编 程 还 是 到 工 厂 类 里 编 程, 这 个 switch 总 是 少 不 掉 的 问 题 主 要 出 在 这 里 小 菜 十 分 肯 定 的 说 是 呀, 大 鸟 道, 所 以 我 们 要 考 虑 的 就 是 可 不 可 以 不 在 程 序 里 写 明 如 果 是 打 折 就 去 实 例 化 CashRebate 类, 如 果 是 返 利 就 去 实 例 化 CashReturn 类 这 样 的 语 句, 而 是 在 当 用 户 做 了 下 拉 选 择 后, 再 根 据 用 户 的 选 择 去 某 个 地 方 找 应 该 要 实 例 化 的 类 是 哪 一 个 这 样, 我 们 的 switch 就 可 以 对 它 说 再 见 了 听 不 太 懂 哦, 什 么 叫 去 某 个 地 方 找 应 该 要 实 例 化 的 类 是 哪 一 个? 小 菜 糊 涂 地 说, 我 要 说 的 就 是 一 种 编 程 方 式 : 依 赖 注 入 (Dependency Injection), 从 字 面 上 不 太 好 理 解, 我 们 也 不 去 管 它 关 键 在 于 如 何 去 用 这 种 方 法 来 解 决 我 们 的 switch 问 题 本 来 依 赖 注 入 是 需 要 专 门 的 IoC 容 器 提 供, 比 如 spring.net, 显 然 当 前 这 个 程 序 不 需 要 这 么 麻 烦, 你 只 需 要 再 了 解 一 个 简 单 的.net 技 术 反 射 就 可 以 了 大 鸟, 你 一 下 子 说 出 又 是 依 赖 注 入 又 是 反 射 这 些 莫 名 其 妙 的 名 词, 我 有 点 晕 哦! 小 菜 有 些 犯 困, 我 就 想 知 道, 如 何 向 switch 说 bye-bye! 至 于 那 些 什 么 概 念 我 不 想 了 解 心 急 讨 不 了 好 媳 妇! 你 急 什 么? 大 鸟 嘲 笑 道, 反 射 技 术 看 起 来 很 玄 乎, 其 实 实 际 用 起 来 不 算 难 请 看 下 面 的 两 个 样 例 : 1 // 实 例 化 方 法 一 2 // 原 来 我 们 把 一 个 类 实 例 化 是 这 样 的 3 Animal animal=new Cat(); // 声 明 一 个 动 物 对 象, 名 称 叫 animal, 然 后 将 animal 实 例 化 成 猫 类 的 对 象 4 5 // 实 例 化 方 法 二 6 // 我 们 还 可 以 用 反 射 的 办 法 得 到 这 个 实 例 7 using System.Reflection;// 先 引 用 System.Reflection 8 // 假 设 当 前 程 序 集 是 AnimalSystem, 名 称 空 间 也 是 AnimalSystem 9 Animal animal = (Animal)Assembly.Load("AnimalSystem").CreateInstance("AnimalSystem.Cat"); 其 中 关 键 是 Assembly.Load(" 程 序 集 名 称 ").CreateInstance(" 名 称 空 间. 类 名 称 ") 30

那 也 就 是 说, 我 们 可 以 在 实 例 化 的 时 候, 再 给 计 算 机 一 个 类 的 名 称 字 符 串, 来 让 计 算 机 知 道 应 该 实 例 化 哪 一 个 类 大 鸟 讲 解 道 你 的 意 思 是, 我 之 前 写 的 cc.setbehavior(new CashNormal()); 可 以 改 写 为 cc.setbehavior((cashsuper)assembly.load(" 商 场 管 理 软 件 ").CreateInstance(" 商 场 管 理 软 件.CashNormal"), 不 过, 这 只 不 过 是 换 了 种 写 法 而 已, 又 有 什 么 神 奇 之 处 呢? 小 菜 依 然 迷 茫 分 析 一 下, 原 来 new CashNormal() 是 什 么? 是 否 是 写 死 在 程 序 里 的 代 码, 你 可 以 灵 活 更 换 吗? 大 鸟 问 不 可 以, 那 还 换 什 么, 写 什 么 就 是 什 么 了 呗 那 你 说, 在 反 射 中 的 CreateInstance(" 商 场 管 理 软 件.CashNormal"), 可 以 灵 活 更 换 CashNormal 吗? 大 鸟 接 着 问 还 不 是 一 样, 写 死 在 代 码 等 等, 哦!!! 我 明 白 了 小 菜 一 下 子 顿 悟 过 来,, 兴 奋 起 来 因 为 这 里 是 字 符 串, 可 以 用 变 量 来 处 理, 也 就 可 以 根 据 需 要 更 换 哦,My God! 太 妙 了! 哈 哈, 博 客 园 中 的 有 篇 博 文 四 大 发 明 之 活 字 印 刷 面 向 对 象 思 想 的 胜 利 中 曾 经 写 过, 体 会 到 面 向 对 象 带 来 的 好 处, 那 种 感 觉 应 该 就 如 同 是 一 中 国 酒 鬼 第 一 次 喝 到 了 茅 台, 西 洋 酒 鬼 第 一 次 喝 到 了 XO 一 样, 怎 个 爽 字 可 形 容 呀, 你 有 没 有 这 种 感 觉 了? 嗯, 我 一 下 子 知 道 这 里 的 差 别 主 要 在 原 来 的 实 例 化 是 写 死 在 程 序 里 的, 而 现 在 用 了 反 射 就 可 以 利 用 字 符 串 来 实 例 化 对 象, 而 变 量 是 可 以 更 换 的 小 菜 说 道 由 于 字 符 串 是 可 以 写 成 变 量, 而 变 量 的 值 到 底 是 CashReturn( 返 利 ), 还 是 CashRebate( 打 折 ), 完 全 可 以 由 谁 决 定? 大 鸟 再 问 当 然 是 由 用 户 在 下 拉 中 选 择 的 选 项 决 定, 也 就 是 说, 我 只 要 把 下 拉 选 项 的 值 改 成 这 些 算 法 子 类 的 名 称 就 好 了, 是 吧? 你 说 得 对, 不 过 还 不 是 最 好 因 为 把 combobox 的 每 个 选 项 value 都 改 为 算 法 子 类 的 名 称 以 后 我 们 要 加 子 类, 你 不 是 还 要 去 改 combobox 吗? 继 续 往 下 想, 现 在 我 们 的 代 码 对 有 谁 依 赖? 对 下 拉 控 件 combobox 的 选 项 有 依 赖 那 么 怎 么 办, 这 个 控 件 的 选 项 可 不 可 以 通 过 别 的 方 式 生 成 比 如 利 用 它 的 绑 定? 你 的 意 思 是 读 数 据 库? 读 数 据 库 当 然 最 好 了, 其 实 用 不 着 这 么 麻 烦, 我 们 不 是 有 XML 这 个 东 东 吗, 写 个 配 置 文 件 不 就 解 决 了? 哦, 我 知 道 你 的 意 思 了, 让 它 去 读 XML 的 配 置 文 件, 来 生 成 这 个 下 拉 列 表 框, 然 后 再 根 据 用 户 的 选 择, 通 过 反 射 实 时 的 实 例 化 出 相 应 的 算 法 对 象, 最 终 利 用 策 略 模 式 计 算 最 终 的 结 果 好 的 好 的, 我 马 上 去 写 出 来 我 现 在 真 有 一 种 不 把 程 序 写 出 来 就 难 受 的 感 觉 了 小 菜 急 切 的 说 31

OK, 还 有 一 个 小 细 节, 你 的 CashRebate 和 CashReturn 在 构 造 函 数 中 都 是 有 参 数 的, 这 需 要 用 到 CreateInstance() 方 法 的 重 载 函 数, 不 会 用 去 查 帮 助 吧! 好 嘞! 你 别 走 哦, 等 我, 不 见 不 散! 小 菜 向 外 跑 着 还 叫 道 大 鸟 摇 头 苦 笑, 嘴 里 嘟 囔 着 : 这 小 子, 忒 急 了 吧! 还 不 见 不 散 呢, 难 道 真 没 完 没 了 啦! 一 个 小 时 后, 小 菜 交 出 了 商 场 收 银 程 序 的 第 五 份 作 业 客 户 端 主 要 代 码 : using System.Reflection; DataSet ds;// 用 于 存 放 配 置 文 件 信 息 double total = 0.0d;// 用 于 总 计 private void Form1_Load(object sender, EventArgs e) // 读 配 置 文 件 ds = new DataSet(); ds.readxml(application.startuppath + "\\CashAcceptType.xml"); // 将 读 取 到 的 记 录 绑 定 到 下 拉 列 表 框 中 foreach (DataRowView dr in ds.tables[0].defaultview) cbxtype.items.add(dr["name"].tostring()); cbxtype.selectedindex = 0; private void btnok_click(object sender, EventArgs e) CashContext cc = new CashContext(); // 根 据 用 户 的 选 项, 查 询 用 户 选 择 项 的 相 关 行 DataRow dr = ((DataRow[])ds.Tables[0].Select ("name='" + cbxtype.selecteditem.tostring() + "'") )[0]; // 声 明 一 个 参 数 的 对 象 数 组 object[] args = null; // 若 有 参 数, 则 将 其 分 割 成 字 符 串 数 组, 用 于 实 例 化 时 所 用 的 参 数 if (dr["para"].tostring()!= "") args = dr["para"].tostring().split(','); // 通 过 反 射 实 例 化 出 相 应 的 算 法 对 象 32

cc.setbehavior( (CashSuper)Assembly.Load(" 商 场 管 理 软 件 ").CreateInstance( " 商 场 管 理 软 件." + dr["class"].tostring(), false, BindingFlags.Default, null, args, null, null )); double totalprices = 0d; totalprices = cc.getresult(convert.todouble(txtprice.text) * Convert.ToDouble(txtNum.Text)); total = total + totalprices; lbxlist.items.add( " 单 价 :" + txtprice.text + " 数 量 :" + txtnum.text + " " + cbxtype.selecteditem + " 合 计 :" + totalprices.tostring()); lblresult.text = total.tostring(); 配 置 文 件 CashAcceptType.xml 的 代 码 <?xml version="1.0" encoding="utf-8"?> <CashAcceptType> <type> <name> 正 常 收 费 </name> <class>cashnormal</class> <para></para> </type> <type> <name> 满 300 返 100</name> <class>cashreturn</class> <para>300,100</para> </type> <type> <name> 满 200 返 50</name> <class>cashreturn</class> <para>200,50</para> </type> <type> <name> 打 8 折 </name> <class>cashrebate</class> <para>0.8</para> </type> <type> <name> 打 7 折 </name> <class>cashrebate</class> <para>0.7</para> </type> 33

</CashAcceptType> 大 鸟, 我 再 次 搞 定 了, 这 会 是 真 的 明 白 了 小 菜 说 说 说 看, 你 现 在 的 理 解! 大 鸟 问 无 论 你 的 需 求 是 什 么, 我 现 在 连 程 序 都 不 动, 只 需 要 去 改 改 XML 文 件 就 全 部 摆 平 比 如 你 如 果 觉 得 现 在 满 300 送 100 太 多, 要 改 成 送 80, 我 只 需 要 去 XML 文 件 里 改 就 行, 再 比 如 你 希 望 增 加 新 的 算 法, 比 如 积 分 返 点, 那 我 先 写 一 个 返 点 的 算 法 类 继 承 CashSuper, 再 去 改 一 下 XML 文 件, 对 过 去 的 代 码 依 然 不 动 总 之, 现 在 是 真 的 做 到 了 程 序 易 维 护, 可 扩 展 小 菜 得 意 地 坏 笑 道, 吼 吼! 此 时 商 场 老 板 以 为 要 改 一 天 的 程 序, 我 几 分 钟 就 搞 定, 一 天 都 可 以 休 息 反 射 真 是 程 序 员 的 快 乐 呀! 在 做 梦 了 吧, 你 当 老 板 是 傻 瓜, 会 用 反 射 才 是 正 常 水 平, 不 会 用 的 早 应 该 走 人 了 大 鸟 打 击 了 小 菜 的 情 绪, 不 过 呢 小 菜 的 确 是 有 长 进, 不 再 是 小 菜 鸟 了 那 你 说 说 看, 现 在 代 码 还 有 没 有 问 题 还 有 不 足? 不 会 吧, 我 都 改 5 次 了, 重 构 到 了 这 个 地 步, 还 会 有 什 么 问 题? 小 菜 不 以 为 然 知 足 是 可 以 常 乐, 但 知 足 如 何 能 进 步! 你 的 代 码 真 的 没 有 问 题 了, 比 如 说, 你 现 在 把 列 表 是 打 印 在 了 listbox 列 表 框 中, 我 现 在 还 需 要 输 出 到 打 印 机 打 印 成 交 易 单 据, 我 还 希 望 这 些 清 单 能 存 入 数 据 库 中, 你 需 要 改 客 户 端 的 代 码 吗? 这 个, 你 这 是 加 需 求 了, 更 改 当 然 是 必 须 的 更 改 是 必 须 的 没 有 错, 但 为 什 么 我 只 是 要 对 交 易 清 单 加 打 印 和 存 数 据, 就 需 要 去 改 客 户 端 的 代 码 呢? 这 两 者 没 什 么 关 系 吧? 大 鸟 说 啊, 你 的 意 思 是 别 急 着 下 结 论, 先 去 好 好 思 考 一 下 再 说 大 鸟 打 断 了 小 菜 本 文 源 代 码 CashAcceptSystem3.rar 34

第 十 章 会 修 电 脑 不 会 修 收 音 机? 聊 设 计 模 式 原 则 小 菜 学 会 了 反 射 后, 正 在 兴 奋, 想 着 大 鸟 的 问 题 此 时, 突 然 声 音 响 起 死 了 都 要 爱, 不 淋 漓 尽 致 不 痛 快, 感 情 多 深 只 有 这 样, 才 足 够 表 白 死 了 都 要 爱 原 来 是 小 菜 的 手 机 铃 声, 大 鸟 吓 了 一 跳, 说 道 : 你 小 子, 用 这 歌 做 铃 声, 吓 唬 人 啊! 这 要 是 在 公 司 开 大 会 时 响 起, 你 要 被 领 导 淋 漓 尽 致 爱 死!MD, 还 在 唱, 快 接! 小 菜 很 是 郁 闷, 拿 起 手 机 一 看, 一 个 美 女 来 的 电 话, 由 转, 马 上 接 通 了 手 机, 喂! 小 菜 呀, 我 是 娇 娇 我 电 脑 坏 了 你 快 点 帮 帮 我 呀! 手 机 里 传 来 急 促 的 女 孩 声 音 哈, 是 你 呀, 你 现 在 好 吗? 最 近 怎 么 不 和 我 聊 天 了? 小 菜 慢 条 斯 理 的 说 道 快 点 帮 帮 我 呀,, 电 脑 不 能 用 了 啊! 娇 娇 略 带 哭 腔 的 说 别 急 别 急, 怎 么 个 坏 法? 每 次 打 开 QQ, 一 玩 游 戏, 机 器 就 死 了 出 来 蓝 底 白 字 的 一 堆 乱 七 八 糟 的 英 文, 过 一 会 就 重 启 了, 再 用 QQ 还 是 一 样 怎 么 办 呀? 哦, 明 白 了, 蓝 屏 死 机 吧, 估 计 内 存 有 问 题, 你 的 内 存 是 多 少 兆 的? 什 么 内 存 多 少 兆, 我 听 不 懂 呀, 你 能 过 来 帮 我 修 一 下 吗? 啊, 你 在 金 山, 我 在 宝 山, 虽 说 在 上 海 两 地 名 都 钱 味 儿 十 足, 可 两 山 相 隔 万 重 路 呀! 现 在 都 晚 上 了, 又 是 星 期 一, 周 六 我 去 你 那 里 帮 你 修 吧! 小 菜 无 耐 的 说 要 等 五 天 那 不 行, 你 说 什 么 蓝 屏? 怎 么 修 法? 娇 娇 依 然 急 不 可 待 蓝 屏 多 半 内 存 坏 了, 你 要 不 打 开 机 箱 看 看, 或 许 有 两 个 内 存, 可 以 拔 一 根 试 试, 如 果 只 有 一 根 内 存, 那 就 没 戏 了 机 箱 怎 么 打 开 呢? 娇 娇 开 始 认 真 起 来 这 个, 你 找 机 箱 后 面, 四 个 角 应 该 都 有 螺 丝, 靠 左 侧 边 上 两 个 应 该 就 可 以 打 开 左 边 盖 了 小 菜 感 觉 有 些 费 力, 远 程 手 机 遥 控 修 电 脑, 这 是 头 一 次 我 好 象 看 到 了, 要 不 先 挂 电 话, 我 试 试 看, 打 开 后 再 打 给 你 哦, 好 的 小 菜 正 说 着, 只 听 娇 娇 边 嘟 囔 着 老 娘 就 不 信 收 拾 不 了 你 这 破 电 脑 边 挂 掉 了 电 话 呵! 小 菜 长 出 一 口 气, 不 懂 内 存 为 何 物 的 美 眉 修 电 脑, 强! 你 小 子, 人 家 在 困 难 时 刻 想 得 到 你, 说 明 心 中 有 你, 懂 吗? 这 是 机 会! 大 鸟 说 道 这 倒 也 是, 这 小 美 眉 长 得 蛮 漂 亮 的, 我 看 过 照 片 就 是 脾 气 大 些, 不 知 道 有 没 有 男 朋 友 了 切, 你 干 吗 不 对 她 说, 你 可 以 找 男 友 修 呀, 真 是 没 脑 子, 要 是 有 男 友, 就 算 男 友 不 会 修 也 要 男 友 找 人 搞 定, 用 得 着 35

找 你 求 助 呀, 笨 笨! 大 鸟 嘲 笑 道, 你 快 把 你 那 该 死 的 手 机 铃 声 换 掉 死 了 都 要 爱, 死 了 还 爱 个 屁! 噢! 知 道 了 十 分 钟 后 我 在 这 儿 等 着 你 回 来, 等 着 你 回 来, 看 那 桃 花 开 我 在 这 儿 等 着 你 回 来, 等 着 你 回 来, 把 那 花 儿 采 小 菜 的 手 机 铃 声 再 次 响 起 菜 花 痴, 你 就 不 能 找 个 好 听 的 歌 呀 大 鸟 气 着 说 道 好 好 好, 我 一 会 改, 一 会 改 小 菜 拿 起 手 机, 一 副 很 听 话 的 样 子, 嘴 里 却 跟 着 哼 我 在 这 儿 等 着 你 回 来 哎, 把 手 机 放 到 耳 边 小 菜, 我 打 开 机 箱 了, 快 说 下 一 步 怎 么 走! 娇 娇 仍 然 着 急 着 说 你 试 着 找 找 内 存 条, 内 存 大 约 是 10 公 分 长,2 公 分 宽, 上 有 多 个 小 长 方 形 集 成 电 路 块 的 长 条, 应 该 是 竖 插 着 的 小 菜 努 力 把 内 存 样 子 描 述 得 容 易 理 解 我 看 到 一 个 风 扇, 没 有 呀, 在 哪 里? 娇 娇 说 道, 哦, 我 找 到 了, 是 不 是 很 薄, 很 短 的 小 长 条? 咦, 怎 么 有 两 根? 啊, 太 好 了, 有 两 根 估 计 就 能 解 决 问 题 了, 你 先 试 着 拔 一 根, 然 后 开 机 试 试 看, 如 果 还 是 死 机, 再 插 上, 拨 另 一 根 试, 应 该 总 有 一 根 可 以 保 证 不 蓝 屏 我 怎 么 拨 不 下 来 呢? 旁 边 有 卡 子, 你 扳 开 再 试 嗯, 这 下 好 了, 你 别 挂, 我 这 就 重 启 看 看 十 分 钟 后 哈, 没 有 死 机 了 啊, 小 菜, 你 太 厉 害 了, 我 竟 然 可 以 修 电 脑 了, 要 我 怎 么 感 谢 你 呢! 娇 娇 兴 奋 地 说 最 好 以 身 相 许 吧, 小 菜 心 里 这 么 遐 想 着, 口 中 却 谦 虚 地 说 : 不 客 气, 都 是 你 聪 明, 敢 自 己 独 自 打 开 机 箱 修 电 脑 的 女 孩 很 少 的 你 把 换 下 的 内 存 去 电 脑 城 换 掉, 就 可 以 了 我 不 懂 的, 要 不 周 六 你 帮 我 换? 周 六 我 请 你 吃 饭 吧! 这 怎 么 好 意 思 你 说 在 什 么 时 间 在 哪 碰 面? 小 菜 假 客 气 着, 却 不 愿 意 放 弃 机 会 周 六 下 午 5 点 在 徐 家 汇 太 平 洋 数 码 门 口 吧 好 的, 没 问 题 36

今 天 真 的 谢 谢 你, 那 就 先 Bye-Bye 了! 嗯, 拜 拜! 小 菜 走 桃 花 运 了 哦, 大 鸟 有 些 羡 慕 道, 那 铃 声 看 来 有 些 效 果, 不 过 还 是 换 掉 吧, 俗! 嘿 嘿, 你 说 也 怪, 修 电 脑, 这 在 以 前 根 本 不 可 能 的 事, 怎 么 就 可 以 通 过 电 话 就 教 会 了, 而 且 是 真 的 修 到 可 以 用 了 呢 你 有 没 有 想 过 这 里 的 最 大 原 因? 大 鸟 开 始 上 课 了 蓝 屏 通 常 是 内 存 本 身 有 问 题 或 内 存 与 主 板 不 兼 容, 主 板 不 容 易 换, 但 内 存 却 只 需 要 更 换 就 可 以 了, 而 且 换 起 来 很 容 易 如 果 是 别 的 部 件 坏 了, 比 如 硬 盘, 显 卡, 光 驱 等, 是 否 也 只 需 要 更 换 就 可 以 了? 是 呀, 确 实 很 方 便, 只 需 要 懂 一 点 点 计 算 机 知 识, 就 可 以 试 着 修 电 脑 了 想 想 和 我 们 编 程 有 什 么 联 系? 你 的 意 思 是 面 向 对 象? 说 说 看, 面 向 对 象 的 四 个 好 处? 这 个 我 记 得 最 牢 了, 就 是 活 字 印 刷 那 个 例 子 啊, 是 可 维 护 可 扩 展 可 复 用 和 灵 活 性 好 我 知 道 了, 可 以 把 PC 电 脑 理 解 成 是 大 的 软 件 系 统, 任 何 部 件 如 CPU 内 存 硬 盘, 显 卡 等 都 可 以 理 解 为 程 序 中 封 装 的 类 或 程 序 集, 由 于 PC 易 插 拨 的 方 式, 那 么 不 管 哪 一 个 出 问 题, 都 可 以 在 不 影 响 别 的 部 件 的 前 题 下 进 行 修 改 或 替 换 PC 电 脑 里 叫 易 插 拨, 面 向 对 象 里 把 这 种 关 系 叫 什 么? 应 该 是 叫 强 内 聚 松 耦 合 吧 对 的, 非 常 好, 我 们 电 脑 里 的 CPU 全 世 界 也 就 是 那 么 几 家 生 产 的, 大 家 都 在 用, 可 是 就 是 不 知 道 Intel/AMD 等 是 如 何 做 出 这 个 小 东 西 去 年 国 内 不 是 还 出 现 了 汉 芯 造 假 的 新 闻 吗! 这 就 说 明 CPU 的 强 内 聚 的 确 是 强 但 它 又 独 自 成 为 了 产 品 可 以 在 千 千 万 万 的 电 脑 主 板 上 插 上 就 可 以 使 用, 这 是 什 么 原 因? 大 鸟 又 问 因 为 CPU 的 对 外 都 是 针 脚 式 或 触 点 式 等 标 准 的 接 口 啊, 我 明 白 了, 这 就 是 接 口 的 最 大 好 处 CPU 只 需 要 把 接 口 定 义 好, 内 部 再 复 杂 我 也 不 让 外 界 知 道, 而 主 板 只 需 要 预 留 与 CPU 针 脚 的 插 槽 就 可 以 了 很 好, 你 已 经 在 无 意 的 谈 话 间 提 到 了 设 计 模 式 其 中 的 几 大 设 计 原 则, 单 一 职 责 原 则, 开 放 封 闭 原 则, 依 赖 倒 转 原 则 ( 参 考 敏 捷 软 件 开 发 原 则 模 式 与 实 践 ) 大 鸟 接 着 讲 道, 所 谓 单 一 职 责 原 则, 就 是 指 就 一 个 类 而 言, 应 该 仅 有 一 个 引 起 它 变 化 的 原 因, 就 刚 才 修 电 脑 的 事, 显 然 内 存 坏 了, 不 应 该 成 为 更 换 CPU 的 理 由 开 放 封 闭 原 则 是 说 对 扩 展 开 发, 对 修 改 关 闭, 通 俗 的 讲, 就 是 我 们 在 设 计 一 个 模 块 的 时 候, 应 当 使 这 个 模 块 可 以 在 不 被 修 改 的 前 提 下 被 扩 展, 换 句 话 说 就 是, 应 当 可 以 在 不 必 修 改 源 代 码 的 情 况 下 改 变 这 个 模 块 的 行 为 比 如 内 存 不 够 只 要 插 槽 多 就 可 以 加, 比 如 硬 盘 不 够 了, 可 以 用 移 动 硬 盘 等,PC 的 接 口 是 有 限 的, 所 以 扩 展 有 限, 软 件 系 统 设 计 得 好, 却 可 以 无 限 的 扩 展 依 赖 倒 转 原 则, 原 话 解 释 是 抽 象 不 应 该 依 赖 细 节, 细 节 应 该 依 赖 于 抽 象, 这 话 绕 口, 说 白 了, 就 是 要 针 对 接 口 编 程, 不 要 对 实 现 37

编 程, 无 论 主 板 CPU 内 存 硬 盘 都 是 在 针 对 接 口 编 程, 如 果 针 对 实 现 编 程, 那 就 会 出 现 换 内 存 需 要 把 主 板 也 换 了 的 尴 尬 你 想 在 小 MM 面 前 表 现 也 就 不 那 么 容 易 了 所 以 说,PC 电 脑 硬 件 的 发 展, 和 面 向 对 象 思 想 发 展 是 完 全 类 似 的 这 也 说 明 世 间 万 物 都 是 遵 循 某 种 类 似 的 规 律, 谁 先 把 握 了 这 些 规 律, 谁 就 最 早 成 为 了 强 者 还 好, 她 没 有 问 我 如 何 修 收 音 机, 收 音 机 里 都 是 些 电 阻 三 极 管, 电 路 板 等 等 东 东, 我 可 不 会 修 的 小 菜 庆 幸 道 哈, 小 菜 你 这 个 比 方 打 得 好, 大 鸟 开 心 的 说, 收 音 机 就 是 典 型 的 耦 合 过 度, 只 要 收 音 机 出 故 障, 不 管 是 声 音 没 有 不 能 调 频 有 杂 音, 反 正 都 很 难 修 理, 不 懂 的 人 根 本 没 法 修, 因 为 任 何 问 题 都 可 能 涉 及 其 它 部 件 非 常 复 杂 的 PC 电 脑 可 以 修, 反 而 相 对 简 单 的 收 音 机 不 能 修, 这 其 实 就 说 明 了 很 大 的 问 题 当 然, 电 脑 的 所 谓 修 也 就 是 更 换 配 件,CPU 或 内 存 要 是 坏 了, 老 百 姓 是 没 法 修 的 其 实 现 在 在 软 件 世 界 里, 收 音 机 式 强 耦 合 开 发 还 是 太 多 了, 比 如 前 段 时 间 某 银 行 出 问 题, 需 要 服 务 器 停 机 大 半 天 的 排 查 修 整, 这 要 损 失 多 少 钱 如 果 完 全 面 向 对 象 的 设 计, 或 许 问 题 的 查 找 和 修 改 就 容 易 得 多 是 的 是 的, 我 听 说 很 多 银 行 目 前 还 是 纯 C 语 言 的 面 向 过 程 开 发, 非 常 不 灵 活, 维 护 成 本 是 很 高 昂 的 那 也 是 没 办 法 的, 银 行 系 统 哪 是 说 换 就 换 的, 所 以 现 在 是 大 力 鼓 励 年 轻 人 学 设 计 模 式, 直 接 面 向 对 象 的 设 计 和 编 程, 从 大 的 方 向 上 讲, 这 是 国 家 大 力 发 展 生 产 力 的 很 大 保 障 呀 大 鸟 真 是 高 瞻 远 瞩 呀, 我 对 你 的 敬 仰 犹 如 滔 滔 江 水, 连 绵 不 绝! 小 菜 怪 笑 道, 我 去 趟 WC 浪 奔, 浪 流, 万 里 江 海 点 点 星 光 耀, 人 间 事, 多 纷 扰, 化 作 滚 滚 东 逝 波 涛, 有 泪, 有 笑 小 菜, 电 话 小 子, 怎 么 又 换 成 上 海 滩 的 歌 了, 这 歌 好 听 大 鸟 笑 道, 刚 才 是 死 了 都 要 爱, 现 在 是 为 爱 复 仇 而 死 你 怎 么 找 的 歌 都 跟 爱 过 不 去 呀 快 点, 电 话, 又 是 刚 才 那 个 叫 娇 娇 的 小 MM 的 来 了 来 了, 尿 都 只 尿 了 一 半! 小 菜 心 急 地 接 起 电 话, 喂! 小 菜 呀, 我 家 收 音 机 坏 了, 你 能 不 能 教 我 修 修 呢! 38

第 十 一 章 三 层 架 构, 分 层 开 发 大 鸟, 我 们 继 续 讨 论 吧! 小 菜 很 沮 丧 的 说 小 伙 子, 不 会 修 收 音 机 也 是 很 正 常 的, 没 什 么 大 不 了 的, 用 不 着 丧 着 一 个 脸 好 象 失 恋 一 样, 男 人 再 强 也 要 学 会 说 不 大 鸟 安 慰 着 说, 如 果 你 的 目 标 是 要 成 为 修 理 电 器 专 家, 那 么 你 连 收 音 机 都 不 会 修, 那 是 很 郁 闷 的 事 但 你 现 在 的 目 标 是 什 么? 我 想 成 为 软 件 架 构 师, 编 程 专 家 小 菜 毫 不 含 糊 的 说 就 是, 你 的 人 生 目 标 很 明 确, 别 的 方 面 弱 一 些 有 什 么 关 系 呢 大 鸟 继 续 说 道, 现 在 电 视 节 目 波 士 堂 里 请 来 的 嘉 宾, 全 是 中 国 的 大 企 业 家, 许 多 人 身 家 上 亿, 节 目 中 都 要 求 他 们 要 有 一 个 Boss 秀, 难 道 真 的 要 把 他 们 的 才 艺 去 和 人 家 艺 术 家 比 吗, 我 看 老 板 们 唱 歌 虽 很 业 余, 但 却 也 感 觉 得 到 他 们 那 份 认 真 和 情 趣 原 来 亿 万 富 翁 也 是 会 唱 歌, 会 跳 舞, 会 食 人 间 烟 火 的 至 于 他 们 歌 唱 得 是 不 是 跑 调 没 有 人 在 意 的, 明 白 吗? 我 明 白!, 我 一 定 要 好 好 努 力, 成 为 编 程 专 家, 小 菜 说, 我 们 言 归 正 传, 你 说 我 那 程 序 用 了 反 射 后, 还 有 什 么 需 要 修 改 的 呢? 嗯, 好! 大 鸟 清 了 清 嗓 子, 开 始 上 课, 如 果 你 的 程 序 再 也 不 修 改 了, 或 者 就 是 改 改 打 折 的 额 度 和 返 利 额 度, 那 么 你 的 代 码 是 足 够 可 以 了 不 过 需 求 却 是 会 不 断 产 生 的 比 如 说, 现 在 这 个 程 序 是 单 机 版 的 程 序, 如 果 需 要 商 场 多 层 楼 的 所 有 收 银 机 都 要 使 用, 那 该 怎 么 办? 那 用 XML 的 配 置 文 件 就 不 合 适 了, 应 该 用 数 据 库 会 比 较 好! 那 么 老 板 听 说 了 C/S 架 构 的 坏 处, 更 新 麻 烦, 不 够 安 全 等 等, 他 也 不 是 傻 瓜, 每 次 更 新 都 需 要 针 对 每 台 机 器 部 署, 一 次 就 半 天, 那 些 工 作 时 间 他 是 需 要 给 程 序 员 付 薪 水 的 所 以 他 提 出 要 改 为 B/S 架 构, 客 户 端 用 浏 览 器 支 持, 你 怎 么 办? 那 需 要 改 界 面 了, 把 应 用 程 序 改 成 Web 程 序 就 你 现 在 的 代 码, 改 起 来 容 易 吗? 好 象 不 容 易, 需 要 重 新 写, 尽 管 可 以 复 制 一 些 代 码 过 去, 不 过 要 重 新 写 的 东 西 还 是 很 多 的 好, 那 你 有 没 有 发 现, 我 说 了 这 么 多 的 需 求 变 动, 但 系 统 中 有 一 些 东 西 一 直 没 有 变, 是 哪 些? 我 知 道, 是 策 略 模 式 用 到 的 那 几 个 类, 也 就 是 正 常 收 费 打 折 消 费 返 利 消 费 等 算 法 是 没 有 变 化 的 是 呀, 其 实 不 是 算 法 不 会 变, 而 是 之 前 我 们 已 经 考 虑 它 很 多 了, 用 了 策 略 模 式, 用 了 反 射 技 术 使 得 它 的 变 化 相 对 稳 定 你 刚 才 也 说, 要 把 应 用 程 序 改 为 Web 是 需 要 复 制 粘 贴 的, 可 实 际 上, 改 改 界 面 和 这 些 算 法 有 什 么 关 系? 没 有 关 系 还 有, 把 配 置 文 件 改 为 数 据 库 访 问, 这 其 实 是 读 取 写 入 数 据 的 操 作, 和 算 法 又 有 什 么 关 系 呢? 也 没 有 关 系, 我 知 道 了, 你 是 说, 他 们 之 间 完 全 可 以 分 离 开, 互 不 影 响, 改 动 其 一, 不 要 影 响 其 它 两 者? 哦, 这 是 不 是 就 是 所 谓 的 三 层 架 构? 39

对, 说 得 好, 就 是 三 层 架 构 三 层 架 构 或 者 分 层 开 发 说 起 来 容 易, 在 程 序 开 发 时 的 初 学 者 还 是 有 很 多 的 误 解 比 如 有 些 初 学 者 以 为,DBServer-WebServer-Client 是 三 层 架 构, 其 实 这 是 物 理 意 思 上 的 三 层 架 构, 和 程 序 的 三 层 架 构 没 有 什 么 关 系 还 有 人 以 为,WinForm 界 面 的 窗 体 或 者 WebForm 的 aspx 是 最 上 一 层, 它 们 对 应 的 代 码 后 置 (codebehind) 文 件 Form.cs 或 aspx.cs 是 第 二 层, 然 后 再 有 一 个 访 问 数 据 库 的 代 码, 比 如 ado.cs 或 SqlHelper.cs 是 最 下 一 层, 这 其 实 也 是 非 常 错 误 的 理 解 再 有, 很 多 人 认 为 MVC 模 式 (Model-View-Controler) 就 是 三 层 架 构, 这 是 比 较 经 典 的 错 误 理 解 了 总 之, 尽 管 三 层 架 构 不 算 难, 不 过 由 于 现 在 很 多 数 书 籍 材 料 的 讲 解 不 透, 所 以 让 我 们 初 学 者 都 概 念 模 糊, 理 解 有 误, 非 常 的 可 惜 的 啊, 我 一 直 以 为 MVC 就 是 三 层 架 构 呀, 看 来 真 的 弄 错 了 那 么 三 层 具 体 是 什 么 呢? 我 不 是 已 经 告 诉 你 了 吗? 你 说 说 看, 不 管 是 应 用 程 序 WinForm, 还 是 网 页 程 序 Aspx, 它 们 主 要 用 来 干 吗 的? 用 来 界 面 显 示 和 处 理 的, 对 的, 它 们 可 以 看 作 是 一 层 叫 界 面 层? 界 面 层 这 种 叫 法 可 以, 或 者 叫 UI 层 表 现 层 都 可 以 访 问 配 置 文 件 或 处 理 数 据 库 是 不 是 就 是 数 据 层 了? 哈, 三 层 架 构 是 不 是 不 难 理 解 呀! 说 得 很 对, 不 过 名 称 应 该 叫 做 数 据 访 问 层 (Data Access Layer) 或 简 称 DAL 层 那 么 第 三 个 层 就 是 那 些 算 法 类 了, 这 叫 什 么 层 呢? 这 些 算 法 是 谁 制 定 的? 由 谁 来 决 定 其 变 化? 当 然 是 需 求 提 出 者, 即 软 件 系 统 所 有 者 制 定 的, 他 们 要 改 算 法, 我 们 开 发 就 得 改 这 都 是 他 们 的 业 务 算 法 呀! 哈, 好, 你 说 到 了 一 个 词, 业 务 (Business) 或 叫 商 务, 这 其 实 是 软 件 的 核 心, 我 们 就 是 根 据 业 务 规 则 来 开 发 软 件 提 供 服 务 的, 所 以 这 个 层 叫 做 业 务 逻 辑 层 (Business Logic Layer) 不 过 它 应 该 是 中 间 的 一 层, 介 于 另 两 者 之 间 哦, 所 谓 的 三 层 开 发, 就 是 关 于 表 现 层 业 务 逻 辑 层 和 数 据 访 问 层 的 开 发 那 么 他 们 之 间 的 关 系 呢? 你 需 要 知 道, 这 其 实 只 是 大 方 向 的 分 层, 每 个 层 中 都 有 可 能 再 细 分 为 多 个 层 次 和 结 构 比 如 PetShop4, 这 是 微 软 用 它 来 展 示.Net 企 业 系 统 开 发 的 能 力 的 范 例,PetShop 尽 管 作 为 对 大 型 软 件 系 统 开 发 的 样 例 还 是 不 够, 但 可 以 理 解 为 儿 童 的 智 力 玩 具 不 过 对 于 初 学 编 程 的 小 菜 你 来 说, 玩 具 却 是 最 好 的 学 习 道 具 下 面 图 源 自 Bruce Zhang 博 客 40

如 果 是 要 细 化, 可 能 结 构 就 会 变 得 很 复 杂 比 如 给 你 看 看 PetShop4 的 结 构 图 大 鸟 继 续 说 道 41

啊, 上 面 那 图 我 是 明 白 了, 下 面 这 图 看 得 晕 晕 乎 乎 的, 哪 有 这 样 复 杂 的 玩 具, 大 鸟 又 在 故 弄 玄 虚, 快 点 解 释 一 下? 小 菜 疑 惑 的 说 第 一 次 看 到 就 完 全 看 明 白, 那 不 就 成 天 才 了 学 习 它 还 需 要 慢 慢 来, 以 后 再 说 你 现 在 应 该 对 改 写 商 场 收 银 系 统 有 点 数 了 吧, 应 该 怎 么 做 呢? 应 该 原 来 的 解 决 方 案 分 为 三 个 项 目, 一 个 UI 项 目, 目 前 是 WinForm 的 程 序, 一 个 BLL 项 目, 用 来 把 算 法 类 都 封 装, 还 有 一 个 DAL 项 目, 用 来 访 问 配 置 文 件 对 吗? 嗯, 差 不 多 了, 快 去 改 吧, 口 说 容 易, 实 践 中 会 有 很 多 细 节 问 题 等 着 你 去 解 决 的 好 的, 不 过 今 天 不 行 了, 我 前 几 天 面 试 的 一 家 公 司 给 我 Offer 了, 我 明 天 就 要 去 第 一 天 上 班, 明 晚 我 再 去 改 写 这 个 程 序 小 菜 说 道 恭 喜 恭 喜, 就 是 你 之 前 提 到 了 那 家 做 物 流 软 件 的 公 司 吗? 找 到 工 作 你 得 请 客 啦 No problem, 不 过 等 我 发 工 资 吧 就 是 那 一 家 感 觉 公 司 还 是 很 大 的 那 你 快 去 休 息 吧, 第 一 天 要 好 好 表 现 哦! ( 待 续 ) 应 一 些 回 复 朋 友 的 要 求, 专 门 写 了 关 于 Web 架 构 方 面 的 文 章, 本 篇 还 只 是 简 单 介 绍 其 实 这 些 都 不 是 新 鲜 的 东 西, 如 果 42

你 认 为 自 己 的 确 是 小 菜, 我 建 议 你 去 下 载 上 一 篇 的 代 码 来 根 据 本 篇 的 介 绍 去 改 写, 编 程 是 实 践 性 很 强 的 技 术, 理 解 不 等 于 会 应 用 的 43

第 十 二 章 无 熟 人 难 办 事? 聊 设 计 模 式 迪 米 特 法 则 次 日 傍 晚, 小 菜 敲 开 了 大 鸟 家 的 门 回 来 啦! 怎 么 样? 第 一 天 上 班 感 受 多 吧 大 鸟 关 心 的 问 道 感 受 真 是 多 哦!!! 小 菜 一 脸 的 不 屑 一 顾 怎 么 了? 受 委 屈 了 吗 说 说 看 怎 么 会 事? 委 屈 谈 不 上, 就 感 觉 公 司 氛 围 不 是 很 好 我 一 大 早 就 到 他 们 公 司, 正 好 我 的 主 管 出 去 了 不 在 公 司 人 事 处 的 小 杨 让 我 填 了 表 后, 就 带 我 到 IT 部 领 取 电 脑, 她 向 我 介 绍 了 一 个 叫 小 张 的 同 事 认 识, 说 我 跟 他 办 领 取 电 脑 的 手 续 就 可 以 了 小 张 还 蛮 客 气, 正 打 算 要 装 电 脑 的 时 候, 来 了 个 电 话, 叫 他 马 上 去 一 个 客 户 那 里 处 理 PC 故 障, 他 说 要 我 等 等, 回 来 帮 我 弄 我 坐 了 一 上 午, 都 没 有 见 他 回 来, 但 我 发 现 IT 部 其 实 人 还 有 两 个 人, 他 们 都 在 电 脑 前, 一 个 忙 于 QQ, 一 个 好 象 在 看 新 闻 我 去 问 人 事 的 小 杨, 可 不 可 以 请 其 他 人 帮 我 办 理 领 取 手 续, 她 说 她 现 在 也 在 忙, 让 我 自 己 去 找 一 下 IT 部 的 小 李, 他 或 许 有 空 我 又 返 回 IT 部 办 公 室, 问 小 李 帮 忙, 小 李 先 是 忙 着 回 了 两 个 QQ 后 才 接 过 我 领 取 电 脑 的 单 子, 看 到 上 面 写 着 张 XX 负 责 电 脑 领 取 安 装 工 作, 于 是 说 这 个 事 是 小 张 负 责 的, 他 不 管, 叫 我 还 是 等 小 张 回 来 再 做 吧 我 就 这 样 又 像 皮 球 一 样 被 踢 到 桌 边 继 续 等 待, 还 好 我 带 着 一 本 重 构 在 看, 不 然 真 要 郁 闷 死 小 张 快 到 下 班 的 时 候 才 回 来, 开 始 帮 我 装 系 统, 加 域, 设 置 密 码 等, 其 实 也 就 Gohost 恢 复 再 设 置 一 下, 差 不 多 半 小 时 就 弄 好 了 小 菜 感 叹 的 说 道, 就 这 样, 我 这 人 生 一 个 最 重 要 的 第 一 次 就 这 么 渡 过 了 哈 哈, 就 业 结 婚 生 子, 人 生 三 大 事, 你 这 第 一 大 事 的 第 一 次 是 够 郁 闷 的 大 鸟 同 情 道, 不 过 现 实 社 会 就 是 这 样 的, 他 们 又 不 认 识 你, 不 给 你 面 子, 也 是 很 正 常 的 就 象 现 在 曹 启 泰 主 持 的 电 视 上 班 这 点 事 节 目, 当 中 可 聊 可 学 之 事 还 真 不 少, 上 班 可 不 是 上 学, 复 杂 着 呢 罢 了 罢 了, 谁 叫 你 运 气 不 好, 你 的 主 管 在 公 司, 事 情 就 会 好 办 多 了 不 过, 这 家 公 司 让 你 感 觉 不 好 原 因 在 于 管 理 上 存 在 一 些 问 题 大 鸟 接 着 说, 这 倒 是 让 我 想 起 来 我 们 设 计 模 式 的 一 个 原 则, 你 的 这 个 经 历 完 全 可 以 体 现 这 个 原 则 观 点 哦, 是 什 么 原 则? 小 菜 情 绪 被 调 动 了 起 来, 你 怎 么 什 么 事 都 可 以 和 软 件 设 计 模 式 搭 界 呢?, 大 鸟 我 显 然 不 是 吹 出 来 的 大 鸟 洋 洋 得 意 道 啧 啧, 行 了 行 了, 大 鸟 你 强!!! 不 是 吹 的, 是 天 生 的!, 快 点 说 说, 什 么 原 则? 小 菜 对 大 鸟 的 吹 鸟 腔 调 颇 为 不 满, 希 望 快 些 进 入 正 题 你 到 了 公 司, 通 过 人 事 部 小 杨, 认 识 了 IT 部 小 张, 这 时, 你 已 认 识 了 两 个 人 但 因 没 人 介 绍 你 并 不 认 识 IT 部 小 李 而 既 然 小 张 小 李 都 属 于 IT 部, 本 应 该 都 可 以 给 你 装 系 统 配 帐 号 的, 但 却 因 小 张 有 事, 而 你 又 不 认 识 小 李, 而 造 成 你 的 人 生 第 一 次 大 大 损 失, 你 说 我 分 析 得 对 吧? 你 这 都 是 废 话, 都 是 我 告 诉 你 的 事 情, 哪 有 什 么 分 析 小 菜 失 望 道 44

如 果 你 同 时 认 识 小 张 和 小 李, 那 么 任 何 一 人 有 空 都 可 以 帮 你 搞 定 了, 你 说 对 吧? 还 是 废 话 这 就 说 明, 你 如 果 把 人 际 关 系 搞 好, 所 谓 无 熟 人 难 办 事, 你 在 IT 部 有 人, 不 就 万 事 不 愁 了 吗? 大 鸟 一 脸 坏 笑 大 鸟, 你 到 底 想 说 什 么? 我 要 是 有 关 系, 对 公 司 所 有 人 都 熟 悉, 还 用 得 着 你 说 呀 小 菜, 瞧 你 急 的, 其 实 我 想 说 的 是, 如 果 IT 部 有 一 个 主 管, 负 责 分 配 任 务, 不 管 任 何 需 要 IT 部 配 合 的 工 作 都 让 主 管 安 排, 不 就 没 有 问 题 了 吗? 大 鸟 开 始 正 经 起 来 你 的 意 思 是 说, 如 果 小 杨 找 到 的 是 IT 的 主 管, 那 么 就 算 小 张 没 空, 还 可 以 通 过 主 管 安 排 小 李 去 做, 是 吗? 对 头 ( 四 川 方 言 发 音 ) 大 鸟 笑 着 鼓 励 道 我 明 白 了, 关 键 在 于 公 司 里 可 能 没 有 IT 主 管, 他 们 都 是 找 到 谁, 就 请 谁 去 工 作, 如 果 都 熟 悉, 有 事 可 以 协 调 着 办, 如 果 不 熟 悉, 那 么 就 会 出 现 我 碰 到 的 情 况 了, 有 人 忙 死, 有 人 空 着, 而 我 在 等 待 没 有 管 理, 单 人 情 协 调 也 很 难 办 成 事 的 如 果 公 司 IT 部 就 一 个 小 张, 那 什 么 问 题 也 没 有, 只 不 过 效 率 低 些 后 来 再 来 个 小 李, 那 工 作 是 叫 谁 去 做 呢? 外 人 又 不 知 道 他 们 两 人 谁 忙 谁 闲 的, 于 是 抱 怨 推 诿 批 评 就 随 风 而 至 要 是 三 个 人 在 IT 部 还 没 有 管 理 人 员, 则 更 加 麻 烦 了 正 所 谓 一 个 和 尚 挑 水 吃, 两 个 和 尚 抬 水 吃, 三 个 和 尚 没 水 吃 看 来 哪 怕 两 个 人, 也 应 该 有 管 理 才 好 我 知 道 你 的 意 思 了, 不 过 这 是 管 理 问 题, 和 设 计 模 式 有 关 系 吗? 急 什 么, 还 没 讲 完 呢? 就 算 有 IT 主 管, 如 果 主 管 正 好 不 在 办 公 室 怎 么 办 呢? 公 司 几 十 号 人 用 电 脑, 时 时 刻 刻 都 有 可 能 出 故 障, 电 话 过 来 找 主 管, 人 不 在, 难 道 就 不 解 决 问 题 了? 这 个, 看 来 需 要 规 章 制 度, 不 管 主 管 在 不 在, 谁 有 空 先 去 处 理, 过 后 汇 报 给 主 管, 再 来 进 行 工 作 协 调 小 菜 也 学 着 分 析 起 来 是 呀, 就 像 有 人 在 路 上 被 车 撞 了, 送 到 医 院, 难 道 还 要 问 清 楚 有 没 有 钱 才 给 治 疗 吗, 人 命 大 于 天, 同 样 的, 在 软 件 公 司, 电 脑 命 大 于 天, 开 发 人 员 工 资 平 均 算 下 来 每 天 按 数 百 记 的, 耽 误 一 天 半 天, 实 在 是 公 司 的 大 损 失 呀 所 以 你 想 过 应 该 怎 么 办? 我 觉 得, 不 管 认 不 认 识 IT 部 的 人, 我 只 要 电 话 或 亲 自 找 到 IT 部, 他 们 都 应 该 想 办 法 帮 我 解 决 问 题 好, 说 得 没 错, 那 你 打 电 话 时, 怎 么 说 呢? 是 说 经 理 在 吗? 小 张 在 吗?, 还 是 IT 部 是 吧, 我 是 小 菜, 电 脑 已 坏, 再 不 修 理, 软 件 歇 菜, 当 然 是 软 件 歇 菜 来 得 更 好! 你 这 家 伙, 就 拿 我 开 心! 这 样 子 的 话, 公 司 不 管 任 何 人, 找 IT 部 就 可 以 了, 不 管 认 识 不 认 识 人, 反 正 他 们 会 想 办 法 找 人 来 解 决 哦, 我 明 白 了, 我 真 的 明 白 了 你 的 意 思 是 说,IT 部 代 表 是 抽 象 类 或 接 口, 小 张 小 李 代 表 是 具 体 类, 之 前 你 在 分 析 会 修 电 脑 不 会 修 收 音 机 里 讲 的 依 赖 倒 置 原 则, 即 面 向 接 口 编 程, 不 要 面 向 实 现 编 程 就 是 这 个 意 思? 小 菜, 兴 奋 异 常 当 然, 这 个 原 则 也 是 满 足 的, 不 过 我 今 天 想 讲 的 是 另 一 个 原 则 : 迪 米 特 法 则 (LoD) 也 叫 最 少 知 识 原 则, 简 单 的 45