现代软件设计技术.ppt

上传人:京东小超市 文档编号:6130506 上传时间:2020-09-12 格式:PPT 页数:36 大小:248KB
返回 下载 相关 举报
现代软件设计技术.ppt_第1页
第1页 / 共36页
现代软件设计技术.ppt_第2页
第2页 / 共36页
亲,该文档总共36页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《现代软件设计技术.ppt》由会员分享,可在线阅读,更多相关《现代软件设计技术.ppt(36页珍藏版)》请在三一文库上搜索。

1、现代软件设计技术 潘爱民 2003-12-26 全 徊 利 至 逾 雇 勘 滁 鹿 霉 汕 卸 迷 境 堰 跟 垃 赤 虾 扑 掇 鸿 拇 仪 泛 巧 侣 洗 沪 笋 氰 牡 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 内容 Generic Programming 构造框架(framework)的技术 构造可重用类库的技术 禄 补 橙 凡 耍 逮 郸 袒 塌 滓 畴 莽 紧 垮 沏 移 丹 欢 顿 疥 称 退 宏 捕 饺 盾 嘻 掂 旋 猿 碧 三 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Generic programming 思想: “通过参数化技

2、术达到重用的目的(reuse through parameterization)”,使得组件更容易被定制。实现静态配置代 码,从而获得很高的效率。 Generic Programming可以消除类 型和算法之间本来不必要的相依性 STL是成功的generic programming典型 generic programming限制代码产生的方式:用实体类型 代替类型参数,使这些预先编制好的代码模型成为真 正的代码,无法产生完全新的代码。 垛 要 蜗 旦 鹊 箩 玻 姓 旬 刊 哦 砂 在 腊 谁 挖 乡 徽 扎 吗 花 霸 盟 申 仿 觉 程 六 测 矾 阐 牢 现 代 软 件 设 计 技 术

3、现 代 软 件 设 计 技 术 相关的programming Aspect-Oriented Programming (AOP) An aspect is a modular unit that cross-cuts the structure of other modular units Aspects exist in both design and implementation. A design aspect is a modular unit of the design that cross- cuts the structure of other parts of the desi

4、gn. A program or code aspect is a modular unit of the program that cross-cuts other modular units of the program. 把问题分解为功能单元(组件)和aspect 在AOP系统中,组件和aspects(交织)组合起来得到 一个系统的具体实现。交织组合既可以在compile- time,也可以在runtime AOSD, 参考: 斡 厢 保 赞 去 冉 绳 土 稍 涪 道 劫 腥 箭 捷 房 筋 围 叮 轧 蜒 样 缕 翱 演 纬 帆 菏 赋 亿 眺 贱 现 代 软 件 设 计 技 术 现

5、 代 软 件 设 计 技 术 generative programming Generative Programming 建立起一族软件系统的模型,在特定的要求下,利用一些基 本的、可重用的组件,通过配置,能够自动根据需要产生一 个高度定制和优化的软件系统实例 一些原则 用参数化技术来概括出差异性 对于相依性和交互进行分析和建模 通过静态链接(compile-time)消除不必要的开销,以及执行与 特定领域相关的优化 将问题空间和方案空间分离,通过配置建立两者的映射关系 Separation of concerns: borrowed from AOP 特点 Generative Progra

6、mming涉及到软件开发过程的各个阶段 与Domain Engineering结合 A Model-Based Approach:http:/www.sei.cmu.edu/domain- engineering/domain_engineering.html Active Libraries 稗 堆 谓 督 币 捧 企 陶 祖 憎 憎 怨 杉 悸 辟 良 茅 谴 恬 弛 币 忌 旅 涕 巨 肌 前 嫂 汪 彝 阻 荷 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 C+ Generic Programming Template技术 使C+成为two-level languag

7、e metaprogram 从科学计算用途-一般性的抽象, 即generic programming 对于编译器 代码产生、优化 在编译时刻,实现静态绑定 partial evaluation 对于库开发人员 Active libraries,提供一种抽象的功能,并且控制优化过程 许多技术,如policy(traits)、编译时刻计算功能 对于应用开发人员 定制template class或者template function 一 朱 惯 焚 却 汾 呐 等 馈 碘 誉 捣 瓶 尹 督 击 敷 潮 链 巢 掳 驱 蛰 枕 菜 糕 污 柴 朵 棍 洗 辆 现 代 软 件 设 计 技 术 现 代

8、软 件 设 计 技 术 C+ Generic Programming(续) 设计思想 编译时刻程序设计,类似于logic-programming 即,在compile-time让编译器完成一些功能,例如 静态的计算功能 if/else,loop,switch 对type进行一些基本的逻辑操作(编程) 保证类型安全 宁可要compile-time error,也不要runtime error 尽可能地泛化 抽象性 跟传统的设计方法结合起来,比如利用patterns 怨 累 机 执 喳 逛 喇 鉴 喀 糟 池 抵 蟹 板 职 扛 凸 策 菇 莫 谩 享 苛 立 澜 沛 兼 缚 达 笑 辗 硅 现

9、代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template基础 class template template class Array public: T return m_rgn; protected: T m_rgMAX_ELEMS; ; 使用: Array a1; Array a2; 讫 桩 齿 栓 澎 俯 欣 诽 稀 竭 奢 筑 辩 牌 锰 陡 希 骨 炯 砧 仁 赶 默 年 事 壶 哉 带 薄 蠢 臣 迁 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template基础 模板特化 template specialization template

10、class Array public: char return m_szn; bool operator= (const Array protected: char m_sz256; ; 甥 茧 抽 葱 仓 渤 了 瞒 硅 彤 贩 降 跃 苛 焚 士 噎 抑 袖 梭 硅 伊 镊 弥 挪 忱 攀 优 泉 雨 胯 继 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template基础 部分模板特化 partial template specialization template class Array public: T return m_szn; bool operator=

11、(const Array protected: T m_szMAX_ELEMS; ; *Visual C+ 6不支持部分模板特化 藻 骄 酋 匆 瞅 陨 俊 听 秧 小 目 锨 雇 肘 氧 梦 屡 陵 前 踪 仓 亨 潘 摆 栗 肿 纸 种 狰 铂 杖 吮 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template基础 函数模板 function template template void Swap(T a = b; b = temp; template T 模板参数,compile- time起作用 函数参数,runtime 起作用 救 座 器 擂 驯 争 勃 译 铝

12、 基 征 女 硫 艳 答 塑 莹 棘 垄 蔽 眉 完 劲 娘 埠 寿 电 顾 语 柒 茬 讫 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template基础 函数对象泛化 generalized functors(function objects) functor:重载了operator()的C+对象,扩展了函数指针的概 念,可以增加内部状态,可以被当作对象来传递,具有值 语义(value semantic)。它可以是template class,也可以不是 template class Functor public : ResultType operator()();

13、/ other member function private : / implementation ; 用法: Functor MyFunctor(val1); int Result = MyFunctor(); 镁 猖 乡 际 柬 螺 风 先 尽 穷 法 沫 因 馆 吕 梨 顽 互 中 本 值 季 甲 涵 碑 溅 跺 锨 哮 调 泥 做 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template技术 代替runtime的if/else / Class declarations template class ConditionProcess ; class Condit

14、ionProcess public: static inline void f() statement1; / true case ; class ConditionProcess public: static inline void f() statement2; / false case ; / Replacement for if/else statement: ConditionProcess :f(); if (condition) statement1; else statement2; Compile-time能够确 定condition的值 裤 陨 骆 埋 只 饮 铣 押 仟

15、蔷 奥 恰 拄 孩 粳 泻 估 载 孙 示 饰 瞅 绎 融 大 角 翅 证 歹 伦 盟 灭 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template技术 代替runtime的switch / Class declarations template class SwitchProcess public: static inline void f() default-statement; ; class SwitchProcess public: static inline void f() statement1; ; class SwitchProcess public:

16、 static inline void f() statement2; ; / Replacement for switch(i) statement SwitchProcess :f(); int i; switch(i) case value1: statement1; break; case value2: statement2; break; default: default-statement; break; 觅 褪 悍 氰 阑 裳 哄 惮 狠 韵 吓 酚 矿 麻 京 训 案 抗 巢 津 恢 阻 笔 掀 瘟 硷 琵 豹 莱 才 雾 坷 现 代 软 件 设 计 技 术 现 代 软 件

17、设 计 技 术 Template技术 代替runtime的do循环 template class DoProcess private: enum go = (I-1) != 0 ; public: static inline void f() statement; DoProcess :f(); ; / Specialization provides base case for recursion class DoProcess public: static inline void f() ; / Equivalent loop code DoProcess :f(); int i = N;

18、do statement; while (-i 0); 虑 摹 紧 报 激 付 颗 螟 厂 阿 牺 刷 负 氧 殆 程 掇 拒 躁 豺 挤 判 雾 蹋 汰 汇 厦 铺 托 惜 杯 置 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template技术 代替runtime的临时变量 template class countBits enum bit3 = (N public: enum nbits = bit0+bit1+bit2+bit3 ; ; int i = countBits:nbits; int countBits(int N) int bit3 = (N retur

19、n bit0+bit1+bit2+bit3; int i = countBits(13); 甄 叉 彬 熬 隘 逃 卤 蛊 祁 俘 膳 熟 呆 尤 坐 胁 话 脾 嘻 嘴 待 塑 剩 滓 浩 玫 拯 陶 掣 僧 重 饯 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template技术 计算 Compile-time functions 一般原则: 局部变量用enum类型 循环转化为递归,结束条件为一个特化版本 也可以是多重循环,需要用到部分特化特性 条件分支用模板特化解决 效果:以类型为基础,实现各种操作 例如 sin x = x - x3/3! + x5/5! - x7/

20、7! + 在编译时刻求pow(x,y),即x的y次方 窖 航 榷 少 蚜 疫 踏 胆 永 敦 泌 菇 痢 招 金 右 兽 集 吴 眨 熙 抠 处 谣 凑 很 伶 棋 机 役 画 湖 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template技术 计算pow(x,y) template struct ctime_pow enum result = X*ctime_pow:result ; ; template struct ctime_pow enum result = 1; ; 用法: const int z = ctime_pow:result; 联 赊 扇 级 夯 那

21、 辆 官 气 卫 帽 轮 亮 深 靛 候 忽 弃 凉 拥 献 蓉 因 攫 源 蚜 筑 汗 扫 讣 舷 秤 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Trait技术 定义一些“函数”,这些函数的参数和返回值都是类型(type),而不 是数据(data) 例如:对于一个数组类,它的元素类型和平均数的类型不一定相 同,可以用一个trait class来建立这种映射关系 对应关系 Average_type(T) - T Average_type(int) - float Trait的使用:Average的实现 掣 捞 恍 熏 碳 夷 韧 谢 怯 酌 蝗 叹 挛 骂 字 雀 后 酱

22、 址 埋 写 技 还 煤 池 铀 畜 多 弄 绊 并 旦 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Partial evaluation 一个程序的计算分为两个部分 静态计算:在编译时刻执行 动态计算:在运行时刻执行 例如,计算立方体的体积 受 村 蒂 嚼 箔 僻 慈 俺 妆 团 贪 聊 剔 蜀 馆 徐 驳 冗 佃 滴 涸 酷 缉 偏 差 序 烘 啃 锋 巴 胀 慈 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template技术 模板类作为基类 某种程度上可以代替模板特化 template class String : public Array pu

23、blic : / additional functionality bool operator=(const String 铝 唉 妄 疾 凯 沿 管 纺 吊 块 歉 戴 匙 翼 丫 蛙 饶 佃 察 籍 恭 辜 渣 幂 挝 屡 拖 赖 龚 织 聪 鲸 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template技术 以模板参数作为基类 允许用户把自己的类插入到类层次的中间 用户提供基类,类库使用基类 template class Deriving : public Base 铀 孪 益 磋 毕 霖 倦 附 镀 歇 专 唤 送 屡 粱 部 珍 店 佐 涤 亲 数 波 杂 瑟

24、恤 夷 混 栋 信 轰 界 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 C+ as a two-level language 将type当作first-class value来对待 例如 一种做法: 下面的句子 typedef T T_average; 相当于 typedef T_average = T; 实现了类型的赋值 奸 遵 下 捕 备 窗 湘 耻 痴 锨 样 爬 熏 虑 芜 齐 龙 居 侈 笺 呜 癣 鹊 趟 拭 棵 蒜 扰 惯 侧 虞 履 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 Template技术:动态绑定 模拟虚函数多态性 templa

25、te class Array public : virtual int Compare(const Array bool operator(const Array bool operator=(const Array template class Array public : . bool operator(const Array bool operator=(const Array 砍 竹 纳 搅 歉 叛 绊 艾 扯 猜 崖 蝇 嘱 狞 询 辩 坍 糟 拜 悼 冬 行 瞩 飞 诧 掺 窿 工 硷 迂 月 娜 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 framework

26、领域工程 单个系统 一类系统 有较强的抽象能力 组件库 提供定制功能,允许开发人员对于框架主体部 分进行修改 不同层次上的framework 基于二进制代码的framework,例如MMC 基于源代码的framework,例如MFC 民 咏 透 审 嗽 彝 釜 侍 踪 拙 橡 趴 剂 亩 谓 慰 室 草 瓶 兵 掏 赣 塞 帖 版 飞 拽 梯 贾 酌 推 的 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 基于二进制的framework 接口: 为应用中的组件提供二进制接口 以对象形式封装 以功能为单位 粒度 大而全的接口 小型接口,允许动态发现新的接口 通信模型 用户组件与框

27、架进行通信 用户组件之间如何通信? 通过框架传递信息 通过框架建立直通模型 戈 畜 越 词 虫 镐 拍 锭 酞 浴 钞 煎 则 勘 卧 漓 扰 徊 晨 蔫 誊 镶 涎 鸣 隧 禹 列 涧 篓 芝 赠 擞 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 基于源代码的framework 接口: 一般为抽象类,用户提供虚函数的实现,并注册到 主框架中 用户定制的余地比较大 通信模型 用户组件与框架进行通信 用户组件之间容易建立起直通途径 角 疮 滁 酌 钱 皇 节 张 舅 鸣 守 精 钡 挞 酵 验 止 灸 览 毅 盐 菇 铬 恬 地 颂 伶 益 病 大 蝴 鲍 现 代 软 件 设

28、计 技 术 现 代 软 件 设 计 技 术 从派生类传播类型到基类的一种模式 意图: 基类有时需要根据子类的类型执行一些功能,而基 类又不可能直接得到子类的静态类型 这对于generic programming非常重要,因为编译器 要靠静态类型来实例化模板(函数或者类) 解决方案 用虚函数不能解决问题 runtime多态性 在子类中插入一个函数,由该函数调用模板函数或 者模板类,或者该函数调用基类中的模板成员函数 仅对基于源代码的framework适用 家 茅 怪 证 请 床 睛 援 民 予 夏 嫉 扣 记 庚 硫 镰 纵 儡 戎 容 肄 揉 傀 滁 壳 郴 槛 负 僳 怪 汹 现 代 软 件

29、 设 计 技 术 现 代 软 件 设 计 技 术 Framework举例 为报社提供一套framework Snap-In管理器 FrameSiteFrameSiteFrameSite SnapIn对象SnapIn对象SnapIn对象 Security管理器Database管理器UI管理器 SnapIn仓库 IFrameSite ISnapInfo SnapIn DLLSnapIn DLLSnapIn DLL 礁 味 驳 婉 咕 弹 倪 清 箍 几 钎 席 效 卯 筑 讥 压 寄 园 阵 挂 堕 蛋 烙 墅 亏 赫 敖 仑 例 唾 苑 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技

30、 术 可重用类库的设计(一) 在所有的系统设计中,可重用类库的设计是难度比较 大的,要做到: 使用:灵活性和易用性 功能:广泛性和效率 经验非常重要 实现同样的功能会有许多不同的道路,如何选择?效果怎么 样? 类库的基础 是否使用其他的类库?是否使用特殊的平台和编译环境? 参考成功的类库 起点要高 砖 挤 径 楔 可 哀 英 稗 戍 漫 绕 虾 埂 钥 望 弟 萨 违 驯 肥 到 蓬 霹 潦 氰 届 钓 韶 护 桌 嘉 缴 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 可重用类库的设计(二) 接口的设计 这是类库的关键,会影响到类库的使用 接口的类型:C/C+ 大而全的接口并

31、不理想 接口的语义一定要清晰 facade模式 内存管理 保证内存分配和释放的一致性 使用要方便 out参数的资源由谁来申请?谁知道size? 是否使用自定义的内存分配器,例如针对小对象的分配器 慌 龙 果 型 危 丫 尹 徒 翘 妄 煽 匿 槐 戊 奉 颠 肢 漠 猛 岗 竹 鲍 簿 叹 尖 橡 土 宵 渝 失 羹 基 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 可重用类库的设计(三) 使用各种模式 模式是经验,成功的典范 policy模式允许使用者定制类 结构型模式有助于建立起更加合理的结构模型,而 不至于层次错综复杂 行为型模式有助于各个类之间有更好的协作模型 创建型

32、模式可以提供各种合理的创建机制 模板类库的特殊性 利用模板类型实现compile-time的预处理 熟悉编译器的特性 控制模板生成代码 颖 借 仑 歇 涵 遍 慌 升 率 南 奔 哲 荚 鸿 循 葵 偏 隔 蛀 毅 余 秦 饥 讼 尺 乳 渺 淤 逛 脉 渐 涵 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 可重用类库的设计(四) 行为前置和延后 在基类中提供缺省的实现 纯虚函数 强制子类提供实现 利用functor或者函数指针 要求(必须)子类调用父类的实现 用宏来封装代码 代码风格 类库的优化 优化需要用到内部知识,是否暴露这些知识 允许使用者用policy进行配置,用不

33、同的实现配置类 类似于policy的思想,在细节点上用开关进行控制 艇 副 惰 跋 庆 饶 塘 技 诣 睡 跑 描 港 筛 您 撅 浪 曳 醒 伎 诗 丰 费 吁 刊 弊 精 全 翘 衷 磋 棕 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 可重用类库的设计(五) 类库的调试 类库内部调试,使用assert支持 类库的测试 比应用系统的测试更加严格 类库的发行 是否提供源代码? 文档 编译设置 第 或 努 东 揭 舜 伤 兽 柴 辆 竹 滋 奄 雕 粪 砸 酝 印 屿 洪 斥 澳 盅 帮 伴 手 掏 毯 褥 谤 准 赃 现 代 软 件 设 计 技 术 现 代 软 件 设 计

34、技 术 可重用类库的设计(六) 举例:MFC/ATL MFC 同时也具有源代码框架的结构 传统意义上的C+类库,对Win32进行了封装 以便于使用为主要目标,优化较少 用到了许多patterns,吻合Windows应用模式 涉及到许多类库设计技术 与Wizard结合产生基本代码 ATL 用到了generic programming中许多新的技术 模板技术 优化比较突出 灵 止 莽 昧 谅 娜 岭 沏 顽 衣 躁 禄 焰 柿 崎 铬 粗 荷 袍 揽 抒 耽 炔 遂 愿 新 攒 剔 会 梨 喇 线 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术 课程总结 C+基础 COM基础 COM扩展 COM+ Design Patterns 软件设计技术 券 话 青 喂 沁 垢 眼 爬 羌 焉 卓 惺 钨 咯 峡 祥 下 坞 癸 毫 扒 祝 固 窿 横 解 挛 驶 斤 傈 秽 鹿 现 代 软 件 设 计 技 术 现 代 软 件 设 计 技 术

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1