版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
《软件设计原则与模式》本课程分为两个部分第一章软件设计原则设计模式(包括三部分):第二章创建模式第三章结构模式第四章行为模式第一章软件设计原则与UML简介宁波城市职业技术学院郭双宙软件设计什么是软件(1)运行时,能够提供所要求功能和性能的指令或计算机程序集合。(2)程序能够满意地处理信息的数据结构。(3)描述程序功能需求以及程序如何操作和使用所要求的文档。这时软件设计就至关重要了。软件设计包括软件的结构设计,数据设计,接口设计和过程设计.结构设计是指:定义软件系统各主要部件之间的关系数据设计是指:将模型转换成数据结构的定义接口设计是指:软件内部,软件和操作系统间以及软件和人之间如何通信过程设计是指:系统结构部件转换成软件的过程描述软件质量如何设计才能保证质量?下面给出软件设计的5个一般原则:(1)要有分层的组织结构,便于对软件各个构件
进行控制;(2)应形成具有独立功能特征的模块(模块化);(3)应有性质不同、可区分的数据和过程描述(表达式);(4)应使模块之间、模块与外部环境之间的接口复杂性尽量减小;(5)应利用软件需求分析中得到的信息和可重复的方法。合格软件的10个标准怎样评价设计的软件是合格的?通常有如下标准:(1)
可靠性
软件在运行过程中避免可能发生故障的能力且一旦发生故障后,具有解脱和排除故障的能力。(2)
健壮性(鲁棒性)
指软件对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式。
软件健壮性是非常重要的软件外部量度标准。(3)
可修改性
要求软件有良好的结构和完备的文档,系统易于调整。(4)
容易理解
包括:文档清晰可读和软件本身具有简单明了的结构。(5)程序简便包括:代码简单易懂可读性强,系统运行易上手。合格软件的10个标准(6)
可测试性
能设计一个适当的数据集合用于测试所建立的系统,并保证系统能得到全面的检验。(7)
效率性
一般用程序的执行时间和所占用的内存容量来度量。
在达到功能指标要求的前提下,程序运行所需时间愈短和占用存储容量愈小,则效率愈高。(8)标准化原则
在结构上实现开放,基于业界开放式标准,符合国家和信息产业部的规范。(9)先进性
满足客户需求,系统性能可靠,易于维护。(10)可扩展性
软件设计完要留有升级接口和升级空间。什么是软件设计原则要想得到一个满意的设计结果,需要有基本设计原则的指导,系统化的设计方法科学严格的评审机制相结合。才能达到预想的目的软件设计原则从宏观上指导着软件设计,但软件设计的具体实现还要遵循软件设计的基本准则。软件设计原则满足了软件开发过程中常用的软件设计原则,就容易实现上面的诸多要求。下面介绍七种常用的软件设计原则。“开-闭”原则里氏代换原则依赖倒置原则接口隔离原则合成/聚合复用原则迪米特法则单一职责原则第一节“开-闭”原则(Open-ClosedPrinciple,OCP)开-闭原则:一个软件实体应当对扩展开放,对修改关闭。满足“开一闭”原则的设计可以给一个软件系统两个优点:可扩展性:通过扩展已有的软件系统,可以提供新的行为,以满足对软件的新需求,使变化中的软件系统有一定的适应性和灵活性。稳定性和延续性:不修改已有的软件模块特别是最重要的抽象层模块,这就使变化中的软件系统有一定的稳定性和延续性。具有这两个优点的软件系统是一个在高层次上实现了复用的系统,也是一个易于维护的系统。“开-闭”原则常见实际应用:现在的程序常有升级,且升级后原有功能不变,还可能会增加新的功能。例子:玉帝招安美猴王当年大闹天宫的美猴王便是对玉帝天庭的新挑战。美猴王说:“皇帝轮流做,明年到我家。只教他搬出去,将天宫让与我。”对于这项挑战,太白金星给玉皇大帝提出的建议是:“……降一道招安圣旨,把他宣来上界……。”换言之,不劳师动众、不破坏天规便是“闭”,收仙有道便是“开”。招安之法便是玉帝天庭的“开-闭”原则,通过增加一个“弼马温”宫职封给美猴王,便可使现有系统满足变化了的需求而不必更改天庭的既有秩序,如下图所示。招安之法的关键便是不允许更改现有的天庭秩序,但允许将妖猴纳入现有秩序中,从而扩展了这一秩序。用面向对象的语言来讲,不允许更改的是系统的抽象层,而允许扩展的是系统的实现层。文武仙师是抽象层,太白金星等就是实现层。第二节里氏代换原则(LiskovSubstitutionPrinciple,LSP)里氏代换原则的意思是:程序中如果使用一个父类,那么一定可以用其子类替换,而且被替换处根本不能察觉出父类对象和子类对象的区别。注意:只有子类可以替换父类,软件单位的功能才能不受影响,父类才能真正被复用,而子类也能够在父类的基础上增加新功能。反过来的代换不成立,即父类不能代替子类。例子:乘马说《墨子•小取》中说:“白马,马也;乘白马,乘马也。骊马(黑马),马也;乘骊马,乘马也。”这个说法的结构图如图所示。对人来说,骑小黑马和骑白龙马结果是一样的,都是骑马。这就是里氏代换原则的一个实际应用。第三节依赖倒置原则(DependenceInversionPrinciple)依赖倒置原则要求客户端依赖于抽象耦合。依赖倒置原则表述:要针对接口编程,不要针对实现编程。意思是:应当使用接口和抽象类进行变量的类型声明,参量的类型声明,方法的返还类型声明等。不遵守依赖倒置原则的例子:privateArrayList
list=newArrayList();publicArrayList
method(ArrayList
sample){
……}遵守依赖倒置原则的例子:privateListlist=newArrayList();publicListmethod(Listsample){ ……}第四节接口隔离原则(InterfaceSegregationPrinciple,ISP)接口隔离原则的意思是使用多个专门的接口比使用单一的总接口要好。理由:一个类对另外一个类的依赖是建立在最小的接口上。胖接口会导致他们的客户程序之间产生不正常的并且有害的耦合关系。当一个客户程序要求该胖接口进行一个改动时,会影响到所有其他的客户程序。因此客户程序应该仅仅依赖他们实际需要调用的方法。使用场合:提供调用者需要的方法,屏蔽不需要的方法。例子:电子商务系统的订单类电子商务系统的订单类有三个地方会使用到:第一:匿名用户,只能有查询方法。第二:注册用户,有添加和查询订单方法。第三:管理后台,添加删除修改查询。根据接口隔离原则(ISP),一个类对另外一个类的依赖性应当是建立在最小的接口上,也就是说,对于匿名用户,它只能依赖有一个查询方法的接口。订单类结构图该系统的UML结构图如图所示。系统实现见书。第五节合成/聚合复用原则(CARP)合成和聚合都是对象建模中的关联(Association)关系。聚合表示整体与部分的关系,表示“含有”,整体由部分组合而成,部分可以脱离整体作为一个独立的个体存在。合成则是一种更强的聚合,部分组成整体,而且不可分割,部分不能脱离整体而单独存在。在合成关系中,部分和整体的生命周期一样,合成的新的对象完全支配其组成部分,包括他们的创建和销毁。一个合成关系中成分对象是不能与另外一个合成关系共享。本原则要求:要尽量使用合成/聚合,不要使用继承。合成/聚合和继承是实现复用的两个基本途径。合成复用原则是指尽量使用合成/聚合,而不是使用继承。关于继承关系只有当以下三个条件全部被满足时,才应使用继承关系:子类是超类的一个特殊种类,而不是超类的一个角色,也就是区分“Has-A”和“Is-A”。“Is-A”关系符合继承关系,“Has-A”关系应当使用聚合来描述。永远不会出现需要将子类换成另外一个类的子类的情况。如果不能肯定将来是否会变成另外一个子类的话,就不要使用继承。子类具有扩展超类的责任,而不是具有置换掉或注销掉超类的责任。
如果一个子类需要大量的置换掉超类的行为,那么这个类就不应该是这个超类的子类。“Has-A”与“Is-A”的区别错误的使用继承而不是合成/聚合的一个常见原因是错误地把“Has-A”当成了“Is-A”。“Is-A”代表一个类是另外一个类的一种;“Has-A”代表一个类是另外一个类的一个角色,而不是另外一个类的特殊种类。例一:不使用合成/聚合复用原则导致错误的使用继承而不是合成/聚合的一个常见的原因是错误的把“Has-A”当作“Is-A”。例如:在上图中,一个人只能有一个角色,兼职就不行了。一个人无法同时拥有多个角色,是“雇员”就不能再是“学生”了,这显然是不合理的。例二:使用合成/聚合复用原则实际上,雇员、经理、学生描述的只是一种角色,比如一个人是“经理”必然是“雇员”,另外一个人可能是“学生雇员”。例一的错误源于把“角色”的等级结构与“人”的等级结构混淆起来,误把“Has-A”当作“Is-A”。修正后的结构如图所示。现在编程就灵活多了,把角色作为人的属性,同一个人可以很方便的具有不同角色。第六节迪米特法则(LawofDemeter,LoD)软件结构设计的总原则是“低耦合,高内聚”。低耦合是指让每个模块尽可能的独立完成某个特定的子功能。高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是单一职责原则。迪米特法则解析无论是面向过程编程还是面向对象编程,只有使各个模块之间的耦合尽量低,才能提高代码的复用率。怎么样编程才能做到耦合尽量低呢?这正是迪米特法则要去完成的。迪米特法则又叫做最少知识原则,就是说,一个对象应当对其他对象有尽可能少的了解。迪米特法则核心观念就是类间解耦,弱耦合,只有弱耦合了以后,类的复用率才能提高。例一:不使用迪米特法则我们在安装软件时,经常有一个导向动作:第一步是确认是否安装,第二步是确认License,最后再选择安装目录;这是一个典型的顺序执行动作,具体到程序中就是:调用一个或者多个类,先执行第一个方法,然后是第二个方法,根据返回结果再来看是否调用第三个方法,其类图如图所示:实现代码见书P9。方法类型是public缺点:可直接调用任一方法例子:使用迪米特法则后重构后的类图如图所示。
实现代码见书P11。方法类型是private注意:迪米特法则要求类尽量不要对外公布太多的public方法和非静态的public变量,多使用private、protected等访问权限。第七节单一职责原则(SingleresponsibilitypincipleSRP)单一职责原则在编程过程中经常能遇上,比方说需要修改用户名和密码,可能的写法如下所示。voidchange(StringuserName,Stringpassword);如果只需要修改一个数据,上面代码则要求必须将两个数据都传进去,这就违反了单一职责原则。原因很简单:方法职责不单一。正确的做法应该是:voidchangeName(StringuserName);voidchangePassword(Stringpassword);不用单一职责原则例子:用户信息管理系统一般来说项目都要涉及到用户、机构、角色管理这些模块,基本上使用的都是RBAC模型(基于角色的访问控制Role-BasedAccessControl,RBAC),这确实是很好的一个解决办法。该系统应有如下功能:用户管理、修改用户的信息、增加机构(一个人属于多个机构)、增加角色等。用户有这么的信息和行为要维护,我们把这些写到一个接口中,因为都是用户管理类。
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 护理职业生涯规划
- 2025年家庭影院播放器评测
- 6.2细胞的分化 课件共44张 2024-2025学年人教版(2019)高中生物学必修1
- 矿石破碎筛分工岗前实操综合知识考核试卷含答案
- 橡胶割胶工安全技能评优考核试卷含答案
- 2026年新科教版高中高一生物上册第三单元物质跨膜运输方式卷含答案
- 电炉炼钢工岗前QC管理考核试卷含答案
- 电子电气产品能效检验员成果模拟考核试卷含答案
- 信用管理师安全理论考核试卷含答案
- 办公设备维修工岗前安全实操考核试卷含答案
- 国际贸易咨询服务方案
- (正式版)DB32∕T 5184-2025 《海域使用权立体分层设权技术规范》
- 七下语文课内文言文阅读夯实基础训练(含答案)
- 韩非子导读课件
- 二年级上册两位数加减法竖式计算300道(进退位)及答案
- VCSEL及光通信激光芯片产业化项目可行性研究报告
- 污水站安全操作应急处置培训考试题及答案
- 2024年下半年成都铁路文化传媒有限责任公司校招笔试题带答案
- 2025年重庆红色旅游市场调研报告
- 东航总部劳务派遣合同6篇
- 外厂人员驻厂安全协议书
评论
0/150
提交评论