【软件工程】第7章 软件设计

【软件工程】第7章 软件设计

思考题

  1. 软件设计的目标及主要任务有哪些?
  2. 什么是模块(构件)化设计思想?
  3. 模块独立性的两个度量标准是什么?
  4. 内聚和耦合的含义是什么?各有那些种类?请举例说明每一类型。
  5. 为什么要高内聚和低耦合?高内聚低耦合是否意味着内聚越高越好,耦合越低越好呢?

拙见

1. 软件设计的目标及主要任务有哪些?

目标

  • 软件系统设计是把软件需求“变换”为用于构造软件的蓝图。
    • “输入”是需求分析各种模型元素
    • “输出”是软件设计模型和表示
  • 软件设计阶段的基本目标是构造系统“怎么做”的模型描述。
  • “设计先于编码”,这是软件工程“推迟实现”基本原则

任务

  • 总体设计,也称为概要设计,软件结构设计,或高层设计。
    • 体系结构设计:定义软件模块(构件)及模块之间的关系。
    • 接口设计:包括用户接口(界面)、外部接口、内部接口。
    • 数据设计:软件涉及的数据结构、文件系统的结构、数据库的表结构等。
  • 软件详细设计,也称为(模块)过程设计,或低层设计。
    • 模块内部细节设计:包括模块所需的算法和数据结构等

2. 什么是模块(构件)化设计思想?

  • 模块是一个独立命名的,拥有明确定义的输入、输出和特性的程序实体。
  • 把一个大型软件系统的全部功能,按照一定的原则合理地划分为若干个模块,每个模块完成一个特定子功能,所有的这些模块以某种结构形式组成一个整体,这就是软件的模块化设计(Modular Design)

3. 模块独立性的两个度量标准是什么?

  • 模块独立性由两个定性标准度量
    • 模块自身的内聚(Cohesion),也称为块内联系,指一个模块内部元素彼此结合的紧密程度。
    • 模块之间的耦合(Coupling),也称为块间联系。
  • 模块独立性愈高,则块内联系越强,块间联系越弱,即高内聚,低耦合

4. 内聚和耦合的含义是什么?各有那些种类?请举例说明每一类型。

  • 内聚性是从功能的角度对模块内部聚合能力的量度。
  • 高内聚是模块独立性追求的目标。
    内聚性分类
    • 功能性内聚:模块各个成分结合在一起,完成一个特定的功能。功能性模块具有内聚性最强、与其他模块联系少的特点。
      • 例如: 解析XML文档模块(解析XML元素, 解析XML
        属性,解析XML注释等)
    • 顺序性内聚:模块内的各个任务是顺序执行的。通常,上一个任务的输出是下一个任务的输入。
      • 例如: 规则引擎:一个任务读配置,输出执行计划。另一个任务以执行计划为输入,执行该计划。
        通常,面向数据流的设计方法设计出的模块具有顺序性内聚。
    • 通信性内聚(信息内聚):模块内部的各个任务靠公用数据联系在一起,即都使用同一个输入数据,或者产生同一个输出数据。
      • 例如:学生管理系统的数据库CRUD操作,都对学生信息进行增删查改操作。
        又如: 下图模块A的两个任务都需要从同一文件中读取数据
        通信性内聚
    • 过程性内聚:模块内的各个任务必须按照某一特定次序执行。
      在函数级别的模块比较常见。
      • 例如:读/写文件操作:判断文件是否存在、判断文件是否有相应权限、打开文件、读(或写)文件。
    • 时间性内聚:模块内的各个任务由相同的执行时间联系在一起。
      • 例如:初始化模块,异常处理模块。
        某个异常处理模块封装了“释放资源”、“记录日志”、“通知用户”几个任务。
    • 逻辑性内聚:模块通常由若干个逻辑功能相似的任务组成,通过模块外引入的一个开关量选择其一执行。这种内聚增大了模块间的耦合。
      • 例如:一个输出设备模块将打印机类和显示器类封装到同一个包里,该包即输出设备模块。打印机类和显示器类虽然都具有输出功能,但是具有不同的职责。
    • 偶然性内聚:模块内的各个任务在功能上没有实质性联系,纯属“偶然”因素组合了块内各个互不相关的任务。
      • 例如:一个处理正方形的模块有两个功能:计算面积,画出这个正方形。
  • 耦合性是对一个软件结构内不同模块之间互连程度的度量。
  • 耦合性的强弱取决于模块间接口的复杂程度,以及通过接口的数据类型和数目。
  • 弱耦合是模块独立性追求的目标。
    耦合性分类
    • 非直接耦合:同级模块相互之间没有信息传递,即没有耦合。
      • 非常底层的模块,自给自足,可以无耦合。
      • 较高层的模块,通常需要重用其他模块的功能,产生耦合。
    • 数据耦合:调用下属模块时,如果交换的都是简单变量,便构成数据耦合。
      • 要点:通过参数传递,而不是通过全局数据、配置文件、共享内存等其他方式;传递的是基本数据类型,不是数据结构。
        数据耦合
    • 特征耦合(数据结构耦合):调用下属模块时,如果交换的是数据结构,便构成特征耦合。由于传递的是数据结构,不仅数据量增加,而且会使模块的相关性增加。
      特征耦合
    • 控制耦合:模块间传递的信息不是一般的数据,而是作为控制信息的开关值或标志量。
      • 例如,逻辑性内聚的模块调用就是典型的控制耦合。
        控制耦合
    • 外部耦合:若允许一组模块访问同一个全局变量,可称它们为外部耦合。
    • 公共耦合:若允许一组模块访问同一个全局性的数据结构,则称它们为公共耦合。全局性的数据结构可以是共享的通信区、公共的内存区域、任何存储介质文件、物理设备等。
      公共耦合
    • 内容耦合:若一个模块可以直接访问另一个模块中的内部数据,或者一个模块直接转到另一个模块的内部,或者一个模块有多个入口,则称为内容耦合。
      内容耦合

5. 为什么要高内聚和低耦合?高内聚低耦合是否意味着内聚越高越好,耦合越低越好呢?

  • 高内聚,低耦合的系统具有更好的重用性,维护性,扩展性,可以更高效的完成系统的维护开发,持续的支持业务的发展,而不会成为业务发展的障碍。
  1. 并不是内聚越高越好,耦合越低越好,真正好的设计是在高内聚和低耦合间进行平衡,也就是说高内聚和低耦合是冲突的。
  2. 最强的内聚莫过于一个类只写一个函数,这样内聚性绝对是最高的。但这会带来一个
    明显的问题:类的数量急剧增多,这样就导致了其它类的耦合特别多,于是整个设计就变成了“高内聚高耦合”了。由于高耦合,整个系统变动同样非常频繁。
  3. 对于耦合来说,最弱的耦合是一个类将所有的函数都包含了,这样类完全不依赖其它类,耦合性是最低的。但这样会带来一个明显的问题:内聚性很低,于是整个设计就变成了“低耦合低内聚”了。由于低内聚,整个类的变动同样非常频繁。
  4. 真正做到高内聚、低耦合是很难的,很多时候未必一定要这样,更多的时候“最适合”的才是最好的,不过、审时度势、融会贯通、人尽其才、物尽其用,才是设计的王道。
    参考
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
中国移动无线城市集中运营服务平台系统项目 详细设计说明书 文档标识: 当前版本: 1.0 当前状态: 草稿 发布日期: 2012-8-28 发布  修改历史 日期 版本 作者 修改内容 评审号 变更控制号 2012-8-28 1.0 拓维 新建 目 录 1 总则 2 1.1 编写目的 2 1.2 读者对象 2 1.3 参考文档 2 1.4 术语与缩写 2 2 系统概述 2 2.1 模块结构 2 2.2 采用技术 3 3 模块设计 4 3.1 模块1 4 3.2 模块2…… 9 4 模块详细设计 9 4.1 模块1 9 4.2 模块2…… 12 1 总则 1.1 编写目的 明确任务和需求,使得软件开发人员知道软件开发流程,软件测试时更有条理 1.2 读者对象 描述该文档的阅读对象。 1.3 参考文档 描述该文档的参考文档。 1.4 术语与缩写 描述该文档的术语及解释。 2 系统概述 2.1 模块结构 描述软件系统的总体结构,可以使用结构图、层次分解图或包图来描述,并应说明系统结构划分的原则(例如,基于标准、协议所规定的体系结构,来自于分析模型的方案,或者基于原有体系结构的限制)。 示例: 2.2 采用技术 描述该系统所采用的技术。 示例: 数据ETL采用C++编程技术,经过FtpMain从外围系统抽取数据,Transfer_Main对数据进行清洗,load_data对清洗后的数据进行加载,完成ETL处理过程;前台流程配置界面采用JAVA编程技术,流程调度通过调度控件完成调度控制。 数据处理层(存储层、应用层、访问层)通过DB2存储过程技术实现对数据流的规则定义,通过调度程序完成数据流的流向控制。 最终展现,通过JAVA、JSP、HTML、GIS,视频监控等编程技术完成代码开发,并部署到WEB应用服务器(WebSphere等),主题采用BRIO工具结合WEB页面,地图技术,视频技术进行多维展现。 3 模块设计 按照需求进行模块分析和设计。 3.1 模块1 3.1.1 模块说明 描述该模块的功能,对该模块进行说明。 示例: 实体渠道:提供渠道发展用户分析、业务受理分析、渠道构成分析、资源分析、考核分析,监控和评估渠道的运营状况和管理能力。 如果采用面向对象的设计模式,则可以使用用例图等来说明这些设计类之间如何交互,实现本模块的典型功能。 示例: 用例主要包括购卡支付、购卡冲正、折扣查询、购卡历史记录查询等, 由于采用异步通信方式将支付、冲正分为请求和响应两个子用例。 用例说明: 购卡支付请求:该用例说明用户通过短消息、wap、web等通信接入手段购买卡系统提供的各种卡,以短信为例,用户通过短消息向系统提交购卡指令,系统查询卡类型及金额,如卡类型正确则生成订单消息,并向用户的银行帐号扣款的支付请求。 购卡支付响应:若支付请求返回正确响应,系统查询原订单和交易记录,返回相应的卡号和密码,以短消息形式通知用户;如出现超时或数据库操作异常,系统自动发起冲正请求 3.1.2 模块设计 描述模块设计。可以用流程图表示。 示例: 也可以用类图体现。 【利用Rose工具给出系统的主要类框图,描述系统的静态行为】 示例: 主要类说明 MpcpParseChainBean 包名 com.talkweb.card.buzi 类名 MpcpParseChainBean 父类名 ChainBean 责任描述  XML解析  短信指令解析  消息协议转换(MPCP2SpDeliverMsg->TradeInfo) 协同类 使用MPCP2SpDeliverMsg的unmarshal进行XML的解析; 使用TradeInfo作为内部交易协议; 使用DefaultDAO读取数据库中操作; 使用Log提供日志服务 属性 类型 描述 Logger Log 日志管理器 方法说明 方法名 process() 类型 protected Description 解析MPCP2SpDeliverMsg消息的XMLString转换为内部TradeInfo消息 Input InputMsg Output InputMsg Process  进行XML解析  调用MPCP2Trade()进行消息转换 方法名 MPCP2Trade() 类型 private Description MPCP2SpDeliverMsg消息转换TradeInfo Input MPCP2SpDeliverMsg(MPCP短消息) Output TradeInfo(本地交易报文) Process  调用parseCommand()解析短消息内容  将MPCP短消息转换为本地交易报文 方法名 parseCommand() 类型 private Description 解析短信内容为功能码 Input String(短信内容) Output Int(功能码) BUY_CARD= 100; QUERY_MONEY= 110; QUERY_FACE= 111; QUERY_HIS = 120; REPORT= 130; HELP = 140; UNKNOW_COMMAND= 0; Process 根据短信息内容产生功能码 3.1.3 数据结构 描述该模块对应的数据模型。 3.2 模块2…… 同3.1章节。 4 模块详细设计 4.1 模块1 4.1.1 功能点1 4.1.1.1 功能说明 对该功能点进行描述(比如:新增,修改,删除,查询等功能); 或者对该功能点的具体信息进行描述。 示例: 渠道发展用户日分析: 通过时间、地域、品牌、地理位置类型、排他性等角度分析各类渠道每日新增及离网用户的情况,实现对渠道的整体分析和监控。 支持切片、钻取,旋转等分析操作,以图表形式展现, 能够打印图表,并且能将图,表分别以图片格式,excel格式导出. 4.1.1.2 数据设计 描述后台的数据设计(存储过程)。 A示例(功能点): 存 储 过 程 名: CHLDW.ETL2_CUB_COUNTY_ADD_USER_DAY 分 析 类 型: 主题 结 果 表: CHLWI.CUB_CHL_ADD_USER_DAY 运 行 周 期: 日 调 用 方 式: CALL CHLDW.ETL2_CUB_COUNTY_ADD_USER_DAY (YYYYMMDD,0,999,?); 前 驱: 版 本: 1.0 设 计 人: 需 求 分 析 章 节: 1.5.1 需 求 编 码: WCMN000000001M 变 更 情 况: 统计步骤: 1) 开号用户数:取基础层的用户信息表(CHLODS.ODS_USR_INFO)与基本信息表(chlwi.t_channel_basicinfo)用渠道标志(CHANNEL_ID)关联,根据状态标志STS_ID=18,统计开号用户数量. 2) 销号用户数: 取基础层的用户信息表(CHLODS.ODS_USR_INFO)与基本信息表(chlwi.t_channel_basicinfo)用渠道标志(CHANNEL_ID)关联,根据状态标志STS_ID = 20,统计开号用户数量. 3) 预销号用户数:取基础层的用户信息表(CHLODS.ODS_USR_INFO)与基本信息表(chlwi.t_channel_basicinfo)用渠道标志(CHANNEL_ID)关联,根据状态标志STS_ID IN (19,21),统计开号用户数量. 或采用Sequence图来表示。 示例: 4.1.1.3 界面设计 示例: 主界面: 新增修改界面: 4.1.1.4 接口设计 描述接口。 4.1.2 功能点2….. 同4.1.1章节。 4.2 模块2…… 同4.1章节。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值