软件设计原则.ppt
- 文档编号:2209976
- 上传时间:2022-10-27
- 格式:PPT
- 页数:111
- 大小:3.94MB
软件设计原则.ppt
《软件设计原则.ppt》由会员分享,可在线阅读,更多相关《软件设计原则.ppt(111页珍藏版)》请在冰豆网上搜索。
软件设计原则软件设计原则2面向对象的设计原则面向对象的设计原则可可维护性;性;可复用性;可复用性;开开闭原原则接口接口抽象抽象类里氏代里氏代换原原则依依赖倒倒转原原则接口隔离原接口隔离原则合成合成/聚合复用原聚合复用原则迪米特法迪米特法则3软件可维护性设计软件可维护性设计一个维护中的软件是不断再生的软件。
修改需求,流程、界面等细节变更,修改积累,往往导致原有软件结构混乱,软件腐烂(可维护性差,可升级性差)。
系统设计师:
辩解用户需求变化多;软件腐烂:
过于僵硬rigidity过于脆弱fragility复用率低immobility黏度高viscosity4软件可维护性设计软件可维护性设计软件腐烂:
过于僵硬rigidity添加一个新功能,很困难,牵扯多,周期长过于脆弱fragility一个地方修改,导致其他地方出现故障,甚至不可预期;复用率低immobility1、想复用A模块,但A牵扯BCDE,牵扯太多,不敢被复用;2、不同模块中的重复功能,重复实现,发现问题,重复修改。
黏度高viscosity1、修改,保持原有设计;2、修改破坏原有设计如果总体设计,总是导致2的实现比1容易,就是黏度过高黏度高过会诱导程序员采用错误的方案,并导致软件逐渐腐烂5软件可维护性设计软件可维护性设计可可维护性性设计目目标可扩展性extensibility;加入新模块,不影响原有模块灵活性flexibility;修改一个模块,不影响其他模块可插入性pluggability可以很容易的去掉一个模块,更换一个模块,加入一个新模块,而不影响其他模块。
6面向对象的设计原则面向对象的设计原则可可维护性;性;可复用性;可复用性;开开闭原原则接口接口抽象抽象类里氏代里氏代换原原则依依赖倒倒转原原则接口隔离原接口隔离原则合成合成/聚合复用原聚合复用原则迪米特法迪米特法则7软件可复用性(软件可复用性(reuse)设计)设计1复用的重要性:
1、较高的效率;2、较高的软件质量;3、较好的可维护性。
传统的复用1、复制、剪切代码;2、算法的复用;3、数据结构的复用;传统复用,往往会破坏软件的可维护性。
AB共用C,如果A要修改C,B不允许。
8软件可复用性(软件可复用性(reuse)设计)设计2面向对象设计的复用:
数据的抽象化、封装、继承、多态。
复用的焦点集中在含有宏观商业逻辑的抽象层面;而不局限于函数和算法。
对可维护性的支持可扩展性extensibility;封装,继承,多态由开闭原则、里氏代换原则、依赖倒转原则、组合/聚合复用保证灵活性flexibility;复用,相对独立,与其他模块松耦合。
该模块修改后,不会传递到其他模块。
由开闭原则、迪米特法则、接口隔离原则保证。
可插入性pluggability复用后,新类替代旧类,容易实现。
由开闭原则、里氏代换原则、组合/聚合服用原则和依赖倒转原则保证。
9面向对象的设计原则面向对象的设计原则可可维护性;性;可复用性;可复用性;开开闭原原则接口接口抽象抽象类里氏代里氏代换原原则依依赖倒倒转原原则接口隔离原接口隔离原则合成合成/聚合复用原聚合复用原则迪米特法迪米特法则10开开-闭原则闭原则1开-闭原则OCP:
open-closedprinciple):
一个软件实体,应当对扩展开放,对修改关闭。
设计一个模块时,应当使该模块在不被修改前提下被扩展;即不修改源代码,而改变该模块的行为。
加个代码例子满足开-闭原则的设计的优越性:
1、具备适应性和灵活性;2、稳定性和延续性;实现该原则,是在更高层次上,实现了复用的、易于维护的系统。
11开开-闭原则闭原则2关关键点:
抽象化点:
抽象化抽象设计:
给系统定义出一个一劳永逸、不再修改的抽象设计。
允许此设计有无穷无尽的行为在实现层被实现。
JAVA中,抽象JAVA类或JAVA接口,规定所有具体类必须提供的方法的特征,作为系统设计的抽象层。
该抽象层预见了所有的可能的扩展。
因此,在扩展中,抽象层不需要修改。
满足了开闭原则中“对修改关闭”的原则。
同时,从抽象层导出的具体新类可以改变系统的行为,又是对扩展开放的。
12开开-闭原则闭原则3关键点:
抽象化但往往归纳较为困难汽车的定义:
按照国家最新标准GB/T3730.12001对汽车的定义:
由动力驱动,具有四个或四个以上车轮的非轨道承载的车辆,主要用于:
载运人员和(或)货物;牵引载运人员和(或)货物的车辆;特殊用途。
本术语还包括:
a)与电力线相联的车辆,如无轨电车;b)整车整备质量超过400kg的三轮车辆。
电车算汽车,马拉四轮车呢?
美国汽车工程师学会标准SAEJ687C中对汽车的定义是:
由本身动力驱动,装有驾驶装置,能在固定轨道以外的道路或地域上运送客货或牵引车辆的车辆。
2轮摩托车算汽车吗?
日本工业标准JISK0101中对汽车的定义是:
自身装有发动机和操纵装置,不依靠固定轨道和架线能在陆上行驶的车辆。
13开开-闭原则闭原则3对可变性的封装原则考虑设计中什么可能会发生变化,将其封装起来,考虑允许什么发生而不让这一变化导致重新设计。
意味着:
1、一种可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。
同一种可变性的不同表象,意味着同一个继承等级结构中的具体子类。
继承,应被看做是封装变化的方法。
2、一种可变性不应当与另一种可变性混合在一起。
类图的继承结构,一般不会超过两层,否则,意味着两种不同的可变性混在了一起?
14开开-闭原则闭原则4策略模式与开闭原则策略模式:
如果有一组算法,就将每一个算法封装起来,使之可以互换?
从对可变性的封装原则出发。
参考策略模式?
开闭原则与java日历设计?
如何解决。
15面向对象的设计原则面向对象的设计原则可可维护性;性;可复用性;可复用性;开开闭原原则接口接口抽象抽象类里氏代里氏代换原原则依依赖倒倒转原原则接口隔离原接口隔离原则合成合成/聚合复用原聚合复用原则迪米特法迪米特法则16JAVA语言的接口语言的接口接口:
电源插座,微波炉可以,笔记本电源也可以。
如果可以动态的将一个构件移走,并以另一个构件取而代之,那么这种构件就是可插入构件。
插座,即接口。
电器,即可插入构件可插入构件的关键在于,存在一个公用的接口。
接口是实现构件的可插入性(pluggability)的关键接口的定义:
接口(interface)是一些方法特征的集合,这些方法特征来自于一些在系统中不断出现的方法。
17JAVA语言的接口语言的接口接口的定接口的定义:
接口(interface)是一些方法特征的集合,这些方法特征来自于一些在系统中不断出现的方法。
接口,只有方法的特征,而没有方法的实现,因此这些方法在不同的地方被实现时,可以具有完全不同的行为。
接口,与接口,与类的最重要区的最重要区别:
接口仅仅描述方法的特征,而不给出方法的实现。
类不仅给出方法的特征,而且给出方法的实现。
接口把方法的特征和方法实现分割开来。
接口,类似角色,包装与该角色相关的操作和属性,而实现这个接口的类便是扮演这个角色的演员。
一个角色可以由不同的演员来演;而不同的演员之间,除了可以扮演一个共同的角色之外,并不要求有其他任何共同之处。
18JAVA语言的接口语言的接口接口的意接口的意义如果没有接口:
对象是相互关联的,常常需要借助其他对象的行为,以便完成一项工作。
如果这种对其他对象行为的调用,是通过硬代码的形式写在类中,则可插入性几乎为零。
类的继承,抽象超类,通过声明子类的行为,具体类继承超类,并以不同的方法实现了超类所声明的行为。
客户端可以动态的决定使用哪一个具体的子类,具有一定的可插入性。
但是,Java是单继承语言,一个类只能继承一个超类。
对于子类,不可能加入一个新超类的功能,除非设置超超类,就是子类他爷爷类。
但如此,子类具体功能的改变,往往导致结构上大范围的调整。
19JAVA语言的接口语言的接口接口是接口是对可插入性的保可插入性的保证关联:
一个对象需要完成一项任务,需要知道并调用其他对象的方法,对象与其他对象的联系叫做关联。
关关联的可插入性:
的可插入性:
关联,调用类中的某一方法。
Integera=String.ToInteger(“12”)如果一个关联不是针对一个具体类,而是针对一个接口。
那么任何实现该接口的类都可以满足要求。
如此,就可以动态的将此关联从一个具体类转换到另一个具体类调用的可插入性用的可插入性调用:
用:
voidmothed1(Stringa)一个对象不可避免的需要调用其他对象的方法。
这种调用,如果是一个接口,则任何实现了该接口的具体类都可以被调用。
而当前对象到底调用哪一个具体类的实例,则完全可以动态决定。
20JAVA语言的接口语言的接口JAVA的的类型控制型控制JAVA接口和抽象类,用来声明一个新的类型:
JAVA设计师,应当主要使用JAVA接口和抽象类将软件单位与内部和外部耦合起来,实现松耦合。
即:
应当使用JAVA接口和抽象类,而不是具体类进行变量的类型声明、参量的类型声明、方法的返回类型声明,以及数据类型转换等。
更好的做法更好的做法,仅使用接口,甚至不使用抽象类。
理想情况下理想情况下:
一个具体的java类,应当仅实现JAVA接口和抽象类中声明过的方法,而不应该给出多余的方法。
21面向对象的设计原则面向对象的设计原则可可维护性;性;可复用性;可复用性;开开闭原原则接口接口抽象抽象类里氏代里氏代换原原则依依赖倒倒转原原则接口隔离原接口隔离原则合成合成/聚合复用原聚合复用原则迪米特法迪米特法则22抽象类抽象类1JAVA的两种的两种类:
抽象类:
不可实例化,不能生成对象,但可以实现具体的方法。
一定是用来继承的具体类:
可以实例化,具体类,不是用来继承的。
抽象类与子类的关系,实际是模板方法的应用。
在抽象类与具体类的树形结构中,树枝节点是抽象类,树叶节点是具体类。
代码重构建议(如果B是A的子类,建立C,抽象类或接口)23抽象类抽象类2抽象抽象类,应当当拥有尽可能多的共同代有尽可能多的共同代码在一个从抽象类到多个具体类的继承关系中,共同的代码应当尽量向上移动到位于金字塔顶端抽象类中。
这样,可以提供代码的复用率,由于代码在公共的超类,而不是子类中出现,在代码发生改变时,程序员只需修改一个地方,程序可维护性更好。
抽象抽象类,应当包含尽可能少的数据当包含尽可能少的数据数据,会占用内存,而且复用率不高,所以尽量将数据向下移动,即尽量不要置于超类中,而是要置于具体类中。
24抽象类抽象类3针对抽象抽象编程的核心思想程的核心思想针对抽象的编码,主要针对超类,而不是具体类的编程。
重点,解决代码复用问题。
正确使用正确使用继承承继承分为两种:
类对接口的实现,接口继承;类对类的继承,实现继承。
实现继承,容易被滥用。
对于抽象类,尽量使用合成,而不是继承,来达到复用目的。
参考“组合/聚合复用原则”,举例25抽象类抽象类4继承复用的使用承复用的使用场合合继承代表“一般化、特殊化”关系,抽象的基类代表一般,而衍生的具体类代表特殊。
PeterCoad条件,符合条件,符合该条件所有内容,才可以使用抽象条件所有内容,才可以使用抽象类:
1、子类是超类的一个特殊种类,而不是超类的一个角色。
Has-A关系关系应当使用聚合关系;当使用聚合关系;Is-A关系符合关系符合继承关系。
承关系。
Has-A:
一个类是另一个类的角色;人-黑社会小弟,老大角色,可以互换:
人,可以做黑社会小弟,某时,也可以做老大。
Is-A:
一个类是另一个类的一种。
鸟-麻雀、天鹅种类,不可以互换:
鸟,不可以某时是麻雀,某时是天鹅。
2、永远不会出现需要将子类换成另一个类的子类的情况。
3、子类具有扩展超类的责任,而不具有置换掉、注销掉超类的责任。
如果子类需要大量的置换掉超类的行为,则不适合。
4、只有在分类学角度上,才可以使用继承,不要从工具类继承26面向对象的设计原则面向对象的设计原则可可维护性;性;可复用性;可复用性;开开闭原原则接口接口抽象抽象类里氏代里氏代换原原则依依赖倒倒转原原则接口隔离原接口隔离原则合成合成/聚合复用原聚合复用原则迪米特法迪米特法则27里氏代换原则里氏代换原则1孙悟空的以全盖偏悟空的以全盖偏西游记第三回:
四海千山皆拱伏四海千山皆拱伏九幽十九幽十类尽除
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 原则