OO设计原则

合集下载

OOD模型设计

OOD模型设计

OOD模型设计目录1 面向对象设计(OOD)的定义? (3)2 面向对象设计(OOD)与面向对象分析(OOA)的关系? (3)3 面向对象设计(OOD)的特点? (3)4 面向对象设计(OOD)过程以及过程模型? (4)4.1 问题域部分的设计 (6)4.2 人机交互部分的设计 (7)4.3 控制驱动部分的设计 (8)4.4 数据管理部分的设计 (9)4.5 构件及部署部分的设计 (10)1 面向对象设计(OOD)的定义?在面向对象分析阶段,已经针对用户需求建立起用面向对象概念描述的系统分析模型。

在设计阶段,要考虑为实现系统而采用的计算机设备、操作系统、网络、数据库管理系统以及所采用的编程语言等有关因素,进一步运用面向对象的方法对系统进行设计,最后形成一个可以实现的设计模型,即面向对象设计模型。

2 面向对象设计(OOD)与面向对象分析(OOA)的关系?在面向对象分析阶段,针对的是现实世界,把需求转化为面向对象概念所建立的模型,以易于理解问题域和系统责任,最终建立一个映射问题域,满足用户需求,独立于实现的OOA模型,面向对象的设计就是在面向对象分析的基础上运用面向对象方法主要解决与实现有关的问题,目标是产生一个符合具体实现条件的OOD模型。

由于OOD以OOA为基础,且OOA与OOD采用一致的表示法,使得从OOA到OOD不存在转换,只需做必要的修改与调整。

OOA与OOD之间不存在传统方法中分析与设计之间的鸿沟,二者能够紧密衔接。

OOA与OOD之间不强调阶段划分,但是OOA与OOD有着不同的侧重点和不同的分工,并因此具有不同的开发过程及具体策略。

“分析”只针对问题域和系统责任,不考虑实现有关的因素,建立一个独立于实现的OOA模型;”设计“则考虑与实现有关的问题,如选用的编程语言、数据库系统和图形用户界面等,建立一个针对具体实现的OOD模型。

3 面向对象设计(OOD)的特点?•以面向对象的分析为基础,一般不依赖结构化分析•与相应的OOA方法共同构成OOA&D方法体系,OOA和OOD采用一致的概念与原则,但属于软件生命周期的不同阶段,有不同的目标和策略•较全面地体现了面向对象方法的概念与原则•大多数OOD方法独立于编程语言,但是具体应用OOD时,则要考虑特定编程语言,因为它通过面向对象的设计所得到的系统模型,要由确定的编程语言实现4 面向对象设计(OOD)过程以及过程模型?在OOA 阶段只考虑问题域和系统责任,在OOD阶段则要考虑与具体实现有关的问题,这样做的目的是•使反映问题域本质的总体框架和组织结构长期稳定,而细节可变•把稳定部分(问题域部分)与可变部分(与实现有关的部分)分开,使得系统能从容地适应变化•有利于同一个分析模型用于不同的设计和实现•支持系统族和相似系统的分析与设计•使一个成功的系统具有超出其生存期的可扩展性为达到上述目的,设计如下的面向对象设计模型从一个侧面观察OOD模型,它包括一个核心部分,即问题域部分;还包括四个外围部分,即人机交互部分、控制驱动部分、数据管理部分以及构件及部署部分。

代理模式+观察者模式

代理模式+观察者模式
10 1-10
动态代理 -- 动态生成代理对象
不用手工编写代理类;而是在运行时候动态生成; 不用手工编写代理类;而是在运行时候动态生成;作用和手工生 成的代理对象一致。 成的代理对象一致。 实现同一个接口: 实现同一个接口: 创建ng.reflect.InvocationHandler ng.reflect.InvocationHandler, 创建ng.reflect.InvocationHandler,每个代理实例都有 一个与它对应的InvocationHandler实例,就是一个方法拦截器。 InvocationHandler实例 一个与它对应的InvocationHandler实例,就是一个方法拦截器。 用以控制对某个对象的访问的拦截。 用以控制对某个对象的访问的拦截。 创建动态代理对象的步骤: 创建动态代理对象的步骤: 指明一系列的接口来创建一个代理对象 创建一个调用处理器Invocation 创建一个调用处理器Invocation handler 对象 将这个代理指定为某个其他对象的代理对象 在调用处理器的invoke()方法中采取代理, invoke()方法中采取代理 在调用处理器的invoke()方法中采取代理,一方面将调用传递给 真实对象,另一方面执行各种需要做的操作。 真实对象,另一方面执行各种需要做的操作。
1) 2) 3) 4)
11 1-11
代理模式——智能引用 代理模式——智能引用 ——
Java虚拟机对内存的管理能力是有限的,但有些应用 虚拟机对内存的管理能力是有限的, 虚拟机对内存的管理能力是有限的 又出于效率的考虑需要将一些较大的对象装载到内存中 为了保证虚拟机不会出现内存溢出,采用软引用,虚 ,为了保证虚拟机不会出现内存溢出,采用软引用 虚 拟机在内存不够的时候能够回收较大的对象。 拟机在内存不够的时候能够回收较大的对象。采用智能 引用能够保证一旦较大对象被回收后能够重新创建大对 象保证客户端的正常使用。 象保证客户端的正常使用。

【最新+免费】OO设计原则+实例

【最新+免费】OO设计原则+实例

【最新编排】---------------------------------------------------------------------------------------------------------------------- 面向对象设计原则开-闭原则里氏转换原则依赖倒转原则接口隔离原则组合/聚合复用原则迪米特法则单-职责"开--闭"原则---核心原则Software entities should be extension,but closed for modification.软件实体对扩展开发,对修改关闭.当软件系统面对着新地需求地时候,系统地设计是稳定地.满足"开-闭"原则系统地优点:1) 通过扩展已有地模块,提供新地行为,满足新需求,使得变化中地软件系统有-定地适应性和灵活性2) 已有地软件模块,特别是最重要地抽象层模块不能再修改,这就使得变化中地模块有-定地稳定性和延续性.怎样才能做到开闭原则?1) 抽象化,为系统定义-个不再更改地抽象设计,这个设计预见了所有可能地变化.满足了开闭原则地"闭"2) 找到系统中变化地部分,把可变性封装起来.使用继承或者其他方式来封装变化,将变化封装在-个方法中或者-个类中."里氏转换"原则(LSP)定义:如果-个软件实体使用-个基类地话,那么-定适合于它地子类.也就是基类出现地地方,子类-定可以出现,替换后软件行为不会发生变化, 而且它根本不能识别出基类和子类对象地区别.里氏转换原则是对开-闭原则地补充.违反了里氏原则,有就违反了开闭原则;反之不成立. 里氏转换原则是继承复用地基础.只有当衍生类可以替换掉基类,软件功能不会受到影响地时候,基类才能被真正复用,而衍生类才能在基类地基础上增加新地行为.理氏转换原则是代理模式成立地基础.代理模式和真实主题模式都是抽象主题角色地子类.客户端只知道抽象主题,而代理主题可以替代抽象主题出现在任何地方"依赖倒转"原则抽象不应该依赖于细节, 细节应该依赖于抽象.(高层模块不应该依赖于底层模块,两个都依赖于抽象)通俗地说:面向接口编程, 不要对实现编程."接口隔离"原则使用专门地接口比使用-个总地接口好;-个类对另外-个类地依赖性应当建立在最小地接口上地.接口理解成角色,-个接口就只是代表-个角色,每个角色都有它特定地-个接口,这里地这个原则可以叫做"角色隔离原则".OOD设计地时候,准确地划分角色以及角色对应地接口.将没有关系地接口合并在-起,就会对接口和角色构成污染."组合/聚合复用"原则要尽量使用合成/聚合达到复用, 尽量少用继承.将-个已经有地对象纳入新对象中,使之成为新对象地-部分, 新对象可以调用引入地旧对象地方法和功能.优势:1)新对象存取成分对象地唯-方法是通过成分对象地接口.2)这种对象地复用是黑箱复用,因为成分对象地内部实现细节对于新地对象是看不见地. 3)这种复用支持包装.4)新对象可以在运行地时候动态地引用于成分对象类型相同地对象.继承复用地优势:1)新地实现较为容易,因为超类地大部分功能可以通过继承关系自动进入子类.2) 修改或者扩展继承而来地实现比较容易.继承复用地缺点:1) 继承复用破坏包装.将超类地实现细节暴露给子类.超类地内部细节常常对子类是透明地,白箱复用.2)超类地实现发生了改变,子类地实现也不得不改变3) 超类继承而来地是静态地,不可能在运行时间内发生改变.因此没有足够地灵活性."迪米特"原则又叫最少知识原则;-个对象应当对其他对象有尽可能少地了解.只与你地朋友们通信,不要和陌生人说话;使民无知不相往来: 将被统治地对象隔离开来,使它们没有直接地通信,可以达到分化瓦解,继而分而治之地效果迪米特法则能够减少耦合.类之间地耦合越小,越有利于复用."定制服务"设计原则,只向客户端提供客户端需要地方法,其他地不需要地不提供,这也是符合迪米特法则地.单-职责原则就-个类而言,应该仅有-个引起他变化地原因.如果-个类承担地职责过多,就等于把这些职责耦合在-起,-个职责地变化可能会削弱或者抑制这个类完成其他职责地能力.这种耦合会导致脆弱地设计.当变化发生地时候,设计会遭受意想不到地破坏.对设计而言,就是发现职责并把这些职责分离.。

设计模式简答题

设计模式简答题

设计模式简答题1.什么是设计模式?设计模式的目标是什么?答:设计模式通常是对于某一类的软件设计问题的可重用的解决方案,将设计模式引入软件设计和开发过程,其目的就在于要充分利用已有的软件开发经验。

2.设计模式具有哪三大特点?答:(1) 在特定的场景下有可重用性,对相同类型不同问题的环境,其解决方案都有效。

(2) 可传授性,即问题出现的机会很多,解决问题的方案相同,人们相对可以接受。

(3) 有表示模式的名称。

3.GOF 设计模式常用的有几种?GOF 设计模式按照模式的目的可分为哪三类?答:行为型,结构型,创建型4.画出抽象工厂方法类图(这类题自己看书去。

)5.针对接口编程,不针对实现编程的意义。

答:主题与观察者都是用接口:观察者利用主题的接口向主题注册,而主题利用观察者接口通知观察者。

这样可以让两者之间运作正常,又同时具有松耦合的优点。

6.面向对象(OO)的原则有:答:1.封装变化2.多用组合,少用继承3.针对接口编程,不针对实现编程4.为交互对象之间的松耦合设计而努力5.对扩展开放,对修改关闭6.依赖抽象,不要依赖具体类7.只和朋友交谈8.别找我,我会找你9.类应该只有一个改变的理由7. 耦合分为几种?(1)内容耦合(2)公共耦合(3)外部耦合(4)控制耦合(5)标记耦合(6)数据耦合(7)非直接耦合8.GOF模式分为几种,每种包含哪些模式?答:分为3种。

创建型设计模式:简单工厂模式,工厂方法模式,抽象工厂模式,建造者模式,原型模式,单例模式;结构型设计模式:适配器模式,桥接模式,组合模式,装饰模式,外观模式,轻量级模式,代理模式;行为性设计模式:责任链模式,命令模式,解释器模式,迭代器模式,中介者模式,备忘录模式,观察者模式,状态模式,策略者模式,模板方法模式,访问者模式。

1.不要和陌生人说话”是(D)原则的通俗表述A.接口隔离B.里氏代换C.依赖倒转D.迪米特2.当一个抽象模型有两个方面,其中一个方面依赖于另一方面,将这两者封装在独立的对象中以使它们可以各自独立地改变和复用,可以考虑使用(A)A.观察者模式B.命令模式C.适配器模式D.单例模式3.对于某些类来说,只有一个实例是非常重要的,例如,系统中可以有都种类型的打印机,但是只能有一个打印机假脱机,只应该一个文件系统和一个窗口管理器,为此,可以使用(C)。

OOAD基本概念

OOAD基本概念

OOAD基本概念学习⽬标:1.理解与掌握⾯向对象的概念与⽅法。

2.使⽤UML。

3.完成⾯向对象的分析与设计⼯作。

4.了解OO的设计原则及⼀些典型的设计模式什么是⾯向对象?1. ⾯向对象(Object-Orientation, 简称OO)是⼀种系统建模技术。

2. ⾯向对象编程(Object-Orientation Programming,简称OOP)是按照OO的⽅法学来开发程序的过程。

3. 通过分析系统内对象的交互来描述或建模⼀个系统。

4. 交互的对象最终以类的形式组织。

5. OO的⽅法由三部分组成:过程,标识,规则。

对象1. 是⼀个客观存在的、唯⼀的实体。

2. 是⾯向对象编程过程中分析与解决问题的出发点与基础。

3. 拥有⾃⼰的标识、数据与⾏为。

4. 可以简单或复杂。

5. 可以抽象或具体。

6. 在OOP中是⼀个类的动态实例。

7. 如Student—id,name,age(attribute)--setName,getName,countScore(methods)--new Student()类1. 类是对象的模板。

2. 对象通过类实例化产⽣。

3. ⼀个类可以创建多个对象OOADOOAD(Object Oriented Analysis and Design),⾯向对象的分析与设计。

OOAD是根据OO的⽅法学,对软件系统进⾏分析与设计的过程。

--OOA 分析阶段--OOD 设计阶段定义OOA阶段1. 分析阶段主要解决以下问题-- 建⽴针对业务问题域的清晰视图。

-- 列出系统必须完成的核⼼任务。

-- 针对问题域建⽴公共词汇表。

-- 列出针对此问题的最佳解决⽅案。

2.此阶段要解决的核⼼问题是“What to do?”定义OOD阶段1.设计阶段主要解决以下问题-- 如何解决具体的业务问题。

-- 引⼊系统⼯作所需的⽀持元素。

-- 定义系统的实现策略2. 此阶段要解决的核⼼问题是“How to do?”OOP的主要特征1 .抽象(abstract)2.封装(encapsulation)3.继承(inheritance)4.多态(polymorphism)5.关联(association)6.聚合(aggregation)7.组合(composition)8.内聚与耦合(cohesion & coupling)抽象1. 忽略掉⼀个对象或实体的细节⽽只关注其本质特征的过程。

OO系统分析员--用例规约的编写--业务规则和实体描述

OO系统分析员--用例规约的编写--业务规则和实体描述

OO系统分析员之路--用例规约的编写--业务规则和实体描述上一篇我们图形化建模的部分基本上完成了,得到了业务用例模型,这帮助我们获得了功能性需求。

得到了业务场景和用例场景,这帮助我们获得了面对业务的执行过程描述和概念(逻辑)模型,让我们知道业务将如何的运作。

得到了用例实现以及领域模型,这帮助我们得知哪些业务用例将在系统中实现,对应这些用例,哪些业务实体将会被包括进来,以及它们如何帮助业务实现。

上一篇我们也留下了悬念,对于业务执行过程来说,除了以上的成果,我们还需要知道业务规则,以及业务实例的属性。

即我们要如何做以及做什么。

这一篇就来讨论这些内容。

先说说业务规则。

笔者习惯将业务规则分为三种。

一种是全局规则,这种规则一般与所有用例都相关而不是与特定用例相关,例如actor要操作用例必须获得相应的授权,用例的操作与授权级别相关,或者用户在系统中的所有操作都要被记录下来等等。

这类规则笔者习惯于,并且也建议将它们写到用例的补充规约里面去,因为它们一般与具体的业务功能性要求没有直接关系。

有时候,这类规则也被写到软件架构文档中。

关于用例补充规约以后再讨论。

第二种是交互规则。

这种规则产生于用例场景当中,例如当提交一份定单时,哪些数据是必须填写的,用户身份是否合法。

当然也包括一般理解上的业务流程流转规则等,例如金额大于一万元的定单被定为VIP定单进入特殊流程等。

这类规则一般要写到用例规约中。

交互规则实际上还有两个是比较特殊的,一个入口条件,也称为前置条件,即actor满足什么条件才能启动用例;另一个是出口条件,也称为后置条件,即用例结束后会产生哪些后果。

稍后参看示例。

第三种是内禀规则。

所谓内禀规则是指业务实体本身具备的规则,并且不因为外部的交互而变化的规则。

例如,每张定单至少要有一件商品,同一类商品数量不能大于5件等。

同时也包括大家所熟悉的数据效验规则,例如身份证号必须是15或18位,邮编必须是6位等等。

这类规则是业务实体的内在规则,因此应该写到领域模型文档中读者或许对把规则这么分类有不同的习惯和理解,可能会觉得麻烦。

程序设计七大原则

程序设计七大原则

软件设计的七大原则设计模式遵循的一般原则:1.开-闭原则(Open-Closed Principle, OCP):一个软件实体应当对扩展开发,对修改关闭.说的是,再设计一个模块的时候,应当使这个模块可以在不被修改的前提下被扩展.换言之,应当可以在不必修改源代码的情况下改变这个模块的行为,在保持系统一定稳定性的基础上,对系统进行扩展。

这是面向对象设计(OOD)的基石,也是最重要的原则。

2.里氏代换原则(Liskov Substitution Principle,常缩写为.LSP)(1).由Barbar Liskov(芭芭拉.里氏)提出,是继承复用的基石。

(2).严格表达:如果每一个类型为T1的对象o1,都有类型为T2的对象o2,使得以T1定义的所有程序P在所有的对象o1都代换称o2时,程序P的行为没有变化,那么类型T2是类型T1的子类型.换言之,一个软件实体如果使用的是一个基类的话,那么一定适用于其子类,而且它根本不能察觉出基类对象和子类对象的区别.只有衍生类可以替换基类,软件单位的功能才能不受影响,基类才能真正被复用,而衍生类也能够在基类的基础上增加新功能。

(3).反过来的代换不成立(4).<墨子.小取>中说:"白马,马也; 乘白马,乘马也.骊马(黑马),马也;乘骊马,乘马也."(5).该类西方著名的例程为:正方形是否是长方形的子类(答案是"否")。

类似的还有椭圆和圆的关系。

(6).应当尽量从抽象类继承,而不从具体类继承,一般而言,如果有两个具体类A,B有继承关系,那么一个最简单的修改方案是建立一个抽象类C,然后让类A和B 成为抽象类C的子类.即如果有一个由继承关系形成的登记结构的话,那么在等级结构的树形图上面所有的树叶节点都应当是具体类;而所有的树枝节点都应当是抽象类或者接口.(7)."基于契约设计(Design By Constract),简称DBC"这项技术对LISKOV代换原则提供了支持.该项技术Bertrand Meyer伯特兰做过详细的介绍:使用DBC,类的编写者显式地规定针对该类的契约.客户代码的编写者可以通过该契约获悉可以依赖的行为方式.契约是通过每个方法声明的前置条件(preconditions)和后置条件(postconditions)来指定的.要使一个方法得以执行,前置条件必须为真.执行完毕后,该方法要保证后置条件为真.就是说,在重新声明派生类中的例程(routine)时,只能使用相等或者更弱的前置条件来替换原始的前置条件,只能使用相等或者更强的后置条件来替换原始的后置条件.3.依赖倒置原则(Dependence Inversion Principle),要求客户端依赖于抽象耦合.(1)表述:抽象不应当依赖于细节,细节应当依赖于抽象.(Program to an interface, not an implementaction)(2)表述二:针对接口编程的意思是说,应当使用接口和抽象类进行变量的类型声明,参量的类型声明,方法的返还类型声明,以及数据类型的转换等.不要针对实现编程的意思就是说,不应当使用具体类进行变量的类型声明,参量类型声明,方法的返还类型声明,以及数据类型的转换等.要保证做到这一点,一个具体的类应等只实现接口和抽象类中声明过的方法,而不应当给出多余的方法.只要一个被引用的对象存在抽象类型,就应当在任何引用此对象的地方使用抽象类型,包括参量的类型声明,方法返还类型的声明,属性变量的类型声明等. (3)接口与抽象的区别就在于抽象类可以提供某些方法的部分实现,而接口则不可以,这也大概是抽象类唯一的优点.如果向一个抽象类加入一个新的具体方法,那么所有的子类型一下子就都得到得到了这个新的具体方法,而接口做不到这一点.如果向一个接口加入了一个新的方法的话,所有实现这个接口的类就全部不能通过编译了,因为它们都没有实现这个新声明的方法.这显然是接口的一个缺点.(4)一个抽象类的实现只能由这个抽象类的子类给出,也就是说,这个实现处在抽象类所定义出的继承的登记结构中,而由于一般语言都限制一个类只能从最多一个超类继承,因此将抽象作为类型定义工具的效能大打折扣.反过来,看接口,就会发现任何一个实现了一个接口所规定的方法的类都可以具有这个接口的类型,而一个类可以实现任意多个接口.(5)从代码重构的角度上讲,将一个单独的具体类重构成一个接口的实现是很容易的,只需要声明一个接口,并将重要的方法添加到接口声明中,然后在具体类定义语句中加上保留字以继承于该接口就行了.而作为一个已有的具体类添加一个抽象类作为抽象类型不那么容易,因为这个具体类有可能已经有一个超类.这样一来,这个新定义的抽象类只好继续向上移动,变成这个超类的超类,如此循环,最后这个新的抽象类必定处于整个类型等级结构的最上端,从而使登记结构中的所有成员都会受到影响.(6)接口是定义混合类型的理想工具,所为混合类型,就是在一个类的主类型之外的次要类型.一个混合类型表明一个类不仅仅具有某个主类型的行为,而且具有其他的次要行为.(7)联合使用接口和抽象类:由于抽象类具有提供缺省实现的优点,而接口具有其他所有优点,所以联合使用两者就是一个很好的选择.首先,声明类型的工作仍然接口承担的,但是同时给出的还有一个抽象类,为这个接口给出一个缺省实现.其他同属于这个抽象类型的具体类可以选择实现这个接口,也可以选择继承自这个抽象类.如果一个具体类直接实现这个接口的话,它就必须自行实现所有的接口;相反,如果它继承自抽象类的话,它可以省去一些不必要的的方法,因为它可以从抽象类中自动得到这些方法的缺省实现;如果需要向接口加入一个新的方法的话,那么只要同时向这个抽象类加入这个方法的一个具体实现就可以了,因为所有继承自这个抽象类的子类都会从这个抽象类得到这个具体方法.这其实就是缺省适配器模式(Defaule Adapter).(8)什么是高层策略呢?它是应用背后的抽象,是那些不随具体细节的改变而改变的真理. 它是系统内部的系统____隐喻.4.接口隔离原则(Interface Segregation Principle, ISP) (1)一个类对另外一个类的依赖是建立在最小的接口上。

浙江工商大学题库UML

浙江工商大学题库UML

《工商大学面向对象的分析与设计》练习题一、选择题1.UML 语言不支持的建模方式有(D )。

A. 静态建模B.动态建模C. 模块化建模D. 功能建模2.一个设计得好的OO系统具有( B )。

A. 低聚、低耦合的特征B.高聚、低耦合的特征C. 高聚、高耦合的特征D.低聚、高耦合的特征3.下列不属于面向对象技术的基本特征的是( B)。

A. 封装性B. 模块性C. 多态性D. 继承性4. 面向对象程序设计将描述事物的数据与 ( C ) 封装在一起,作为一个相互依存、不可分割的整体来处理。

A. 信息B. 数据隐藏C. 对数据的操作D. 数据抽象5. 关于面向对象方法的优点,下列不正确的叙述是(C )。

A. 与人类习惯的思维方法比较一致B. 可重用性好C. 以数据操作为中心D.可维护性好6.用例之间的关系不包括以下哪种关系?DA.泛化B.包含C. 扩展D. 聚集和组合7.顺序图中不包括以下哪种元素?(A)A.用例B. 对象C. 生命线D. 消息8. 用例图中不包括以下哪种元素?(B)A. 用例B. 类C. 参与者D. 关联9. 继承机制的作用是 ( C )。

A. 信息隐藏B. 数据封装C. 派生新类D. 数据抽象10. 面向对象方法学中,对象之间仅能通过(C )相联系。

A. 类B.抽象C. 消息D. 封装11. 脚本与用例之间的关系类似与(A)之间的关系。

A. 对象与类B. 参与者与用例C. 顺序图和抽象类D. 消息和对象12. 下列元素中,(D )不属于消息的组成。

A. 提供服务的对象B. 服务C. 输入信息D. 事件13. ( D )描述了一组交互对象间的动态协作关系,它表示完成某项行为的对象和这些对象之间传递消息的时间顺序。

A.对象图 B. 协作图 C. 状态图 D. 顺序图14. ( D)是从用户使用系统的角度描述系统功能的图形表达方法。

A. 类图B. 对象图C. 序列图D. 用例图15. ( C ) 是表达系统的类及其相互联系的图示,它是面向对象设计的核心,建立状态图、协作图和其他图的基础。

面向对象的软件测试技术(转)

面向对象的软件测试技术(转)

面向对象的软件测试技术(转)面向对象的软件测试技术相关知识点-面象对象(=objectoriented)技术1.对象和类l面象对象的编程语言:以对象为中心,以消息为驱动,程序=对象+消息l类就是一种代莱数据类型,就是设计的核心,就是通过抽象数据类型的方法去同时实现的一种数据类型l类是对某一对象的抽象,对象是某一类的实例,两者密切相关2.PCB、承继和多态性(1)封装:把数据和操作结合一体,使程序结构更加紧凑,避免了数据紊乱带来的调试与维护的困难(2)承继:可以从一个类衍生至另一个类,派生类承继了父类和祖先类的数据成员和函数,减少了软件的可扩充性,并为代码器重提供更多了强有力的手段(3)多态性:多种表现形式,可以用‘一个对外接口,多个内在实现方法’表示。

一.面向对象测试模型1.面向对象测试的分类依据面向对象研发模型(面向对象分析、面向对象设计、面向对向编程),分成:(1)面向对象分析的测试(ooatest)、面向对象设计的测试(oodtest):是对分析结果和设计结果的测试,主要对分析设计产生的文本进行的,是软件开发前期的关键性测试(2)面向对象编程的测试(ooptest):对编程风格和程序代码同时实现展开测试,主要的测试内容在oounittest和oointegratetest中彰显(3)面向对象单元测试(oounittest):对程序内部具体单一的功能模块的测试,主要对类成员函数的测试,是oointegratetest的基础(4)面向对象内置测试(oointergratetest):对系统内部的相互服务展开测试,例如成员函数间的相互作用,类间的消息传递。

不仅必须基于oounittest,还要参照ood、oodtest的结果(5)面向对象确认测试(oosystemtest)、面向对象系统测试(oosystemtest):最后阶段的测试,以用户需求为测试标准,借鉴ooa、ooatest的结果二.面向对象软件的测试策略1.面向对象分析的测试(1)面向对象分析是把e-r图和语义网络模型,即信息造型中的概念,与面向对象程序设计语方中的重要概念结合在一起而形成的分析方法。

chapter01_基础知识

chapter01_基础知识

(2)里氏代换原则 ) 或者LSP) (Liskov Substitution Principle, 或者 )
很严格的原则,规则是“子类必须能够替换基类, 否则不应当设计为其子类。” 也就是说,子类只能去扩展基类,而不是隐藏或覆 盖基类。 LSP是继承复用的基石。只有当子类可以替换掉基 类,软件单位的功能不会受到影响时,基类才能真 正被复用,而子类也才能够在基类的基础上增加新 的行为。
例子: 例子:玉帝招安美猴王
当年大闹天宫便是美猴王对玉帝的新挑战。美猴王说:"'皇 帝轮流做,明年到我家。'只教他搬出去,将天宫让于我!" 对于这项挑战,太白金星给玉皇大帝提出的建议是:"降一 道招安圣旨,宣上界来…,一则不劳师动众,二则收仙有 道也。" 换而言之,不劳师动众、不破坏天规便是"闭",收仙有道 便是"开"。招安之道便是玉帝天庭的"开放-封闭"原则。 招安之法的关键便是不允许更改现有的天庭秩序,但允许 将妖猴纳入现有秩序中,从而扩展了这一秩序。用面向对 象的语言来讲,不允许更改的是系统的抽象层,而允许更 改的是系统的实现层。
(7)纯虚构 (Pure Farication) ) )
提倡把那些非问题领域的职责分配给那些人工生成的或 者容易此类职责的概念类(Domain Class)。 Domain Class:设计对象的时候应该尽量保持与现实 : 世界里的对象一致。这种与现实世界里的对象保持一致 的从业务分析中抽象出来的类叫做“Domain Class”。 比如一个简单的用例:用户注册。用户就是一个 “Domain Class”,它是现实世界里的业务对象。 用户注册需要操作数据库,[数据库操作]是系统功能实 现的一个必需功能,它不是现实世界里存在的业务对象 ,它是一个非Domain Class。如果把[数据库操作]看作 一个行为职责,它就相当于这里所说的“非问题领域里 的职责”。 一般来说,Domain Class与非Domain Class的功能如 果聚集在一个类里,就破坏了“高内聚”原则。

Java OO设计原则

Java OO设计原则

JA VA OO设计原则1 目的: (1)2 分类 (1)2.1SRP(单一职责) (1)2.2DRY (不要重复代码) (1)2.3OCP (开闭原则) (2)2.4LSP(子类必须能够替换基类) (3)2.5DIP(依赖倒置原则) (3)2.6ISP(接口隔离原则) (4)1目的:设计原则是基本的工具,应用这些规则可使代码更加灵活、更容易维护,更容易扩展2分类2.1SRP(单一职责)The single responsibility principle系统中的每一个对象都应该只有一个单独的职责,而所有对象所关注的就是自身职责的完成。

Every object in your system should have a single responsibility ,and all the object s services should be focused on carrying out that single responsibility .每一个职责都是一个设计的变因,需求变化的时候,需求变化反映为类职责的变化。

当你系统里面的对象都只有一个变化的原因的时候,你就已经很好的遵循了SRP原则。

如果一个类承担的职责过多,就等于把这些职责耦合在了一起。

一个职责的变化就可能削弱或者抑制这个类其它职责的能力。

这种设计会导致脆弱的设计。

当变化发生的时候,设计会遭到意想不到的破坏。

SRP 让这个系统更容易管理维护,因为不是所有的问题都搅在一起。

内聚Cohesion 其实是SRP原则的另外一个名字.你写了高内聚的软件其实就是说你很好的应用了SRP原则。

怎么判断一个职责是不是一个对象的呢?你试着让这个对象自己来完成这个职责,比如:“书自己阅读内容”,阅读的职责显然不是书自己的。

仅当变化发生时,变化的轴线才具有实际的意义,如果没有征兆,那么应用SRP或者任何其它的原则都是不明智的。

2.2DRY (不要重复代码)Don't repeat yourself Principle通过抽取公共部分放置在一个地方避免代码重复.Avoid duplicate code by abstracting out things that are common and placing those thing in a single location .DRY 很简单,但却是确保我们代码容易维护和复用的关键。

OO设计模式和设计原则

OO设计模式和设计原则

1.1 设计正在“腐烂”的征兆(Symptoms of Rotting Design)有四个主要的征兆告诉我们该软件设计正在“腐烂”中。

它们并不是互相独立的,而是互相关联,它们是过于僵硬、过于脆弱、不可重用性和粘滞性过高。

1. 过于僵硬Rigidity Rigidity 致使软件难以更改,每一个改动都会造成一连串的互相依靠的模块的改动,项目经理不敢改动,因为他永远也不知道一个改动何时才能完成。

2. 过于脆弱Fragility Fragility 致使当软件改动时,系统会在许多地方出错。

并且错误经常会发生在概念上与改动的地方没有联系的模块中。

这样的软件无法维护,每一次维护都使软件变得更加难以维护。

(恶性循环)3. 不可重用性immobility immobility 致使我们不能重用在其它项目中、或本项目中其它位置中的软件。

工程师发现将他想重用的部分分离出来的工作量和风险太大,足以抵消他重用的积极性,因此软件用重写代替了重用。

4. 粘滞性过高viscosity viscosity有两种形式:设计的viscosity和环境的viscosity.当需要进行改动时,工程师通常发现有不止一个方法可以达到目的。

但是这些方法中,一些会保留原有的设计不变,而另外一些则不会(也就是说,这些人是hacks)。

一个设计如果使工程师作错比作对容易得多,那么这个设计的viscosity 就会很高。

环境的viscosity高是指开发环境速度很慢且效率很低。

2 面向对象的类设计原则2.1 开放关闭原则The Open Closed Principle (OCP)A module should be open for extension but closed for modification.一个模块应该只在扩展的时候被打开(暴露模块内部),在修改的时候是关闭的(模块是黑盒子)。

在所有的面向对象设计原则中,这一条最重要。

该原则是说:我们应该能够不用修改模块的源代码,就能更改模块的行为。

OO方法——精选推荐

OO方法——精选推荐

OO⽅法OO⽅法(Object-Oriented Method,⾯向对象⽅法,⾯向对象的⽅法)是⼀种把⾯向对象的思想应⽤于软件开发过程中,指导开发活动的系统⽅法,简称OO (Object-Oriented)⽅法,是建⽴在“对象”概念基础上的⽅法学。

对象是由数据和容许的操作组成的封装体,与客观实体有直接对应关系,⼀个对象类定义了具有相似性质的⼀组对象。

⽽每继承性是对具有层次关系的类的属性和操作进⾏共享的⼀种⽅式。

所谓⾯向对象就是基于对象概念,以对象为中⼼,以类和继承为构造机制,来认识、理解、刻画客观世界和设计、构建相应的软件系统。

⾯向对象⽅法作为⼀种新型的独具优越性的新⽅法正引起全世界越来越⼴泛的关注和⾼度的重视,它被誉为"研究⾼技术的好⽅法",更是当前计算机界关⼼的重点。

⼗多年来,在对OO⽅法如⽕如荼的研究热潮中,许多专家和学者预⾔:正象70年代结构化⽅法对计算机技术应⽤所产⽣的巨⼤影响和促进那样,90年代OO⽅法会强烈地影响、推动和促进⼀系列⾼技术的发展和多学科的综合。

⼀、⾯向对象⽅法的由来与发展 回顾历史可激励现在,以规划将来。

OO⽅法起源于⾯向对象的编程语⾔(简称为OOPL)。

50年代后期,在⽤FORTRAN语⾔编写⼤型程序时,常出现变量名在程序不同部分发⽣冲突的问题。

鉴于此,ALGOL语⾔的设计者在ALGOL60中采⽤了以"Begin……End"为标识的程序块,使块内变量名是局部的,以避免它们与程序中块外的同名变量相冲突。

这是编程语⾔中⾸次提供封装(保护)的尝试。

此后程序块结构⼴泛⽤于⾼级语⾔如Pascal 、Ada、C之中。

60年代中后期,Simula语⾔在ALGOL基础上研制开发,它将ALGOL的块结构概念向前发展⼀步,提出了对象的概念,并使⽤了类,也⽀持类继承。

70年代,Smalltalk语⾔诞⽣,它取Simula的类为核⼼概念,它的很多内容借鉴于Lisp语⾔。

多媒体课件第三讲课件时序图

多媒体课件第三讲课件时序图
课程学习的内容
OO设计原则 UML设计图及Rose Rational 工具 OO设计模式 典型项目的分析与设计

学习方法
掌握主要OO原则的原理和应用要点 改变java编程习惯 学会设计 Rational工具的使用; 掌握类图、用例图、顺序图、活动图的设计 熟练掌握MVC 设计方法 熟练掌握数据库编程 深化了解API,深化基于API的编程 反复实践典型模式应用于项目的分析和设计

参考书

面向对象软件工程与 UML, 李飞跃, 人民邮电 出版社 ( 高职教材 ) UML与软件建模 , 徐宝文,清华大学出版社(重 点大学教材) 面向对象设计原理与模式,(美)Dale Skrien著, 清华大学出版社 (国外经典教材) Java设计模式, 耿祥义,清华大学出版社 大话设计模式,程杰,清华大学出版社

UML中的类图

类图中的6种关系 1. 继承(泛化)关系; 2. 实现关系; 3.依赖关系; 4. 关联关系; 5. 组合关系 6. 聚合关系;

基本画法: 1. 指向实体的关系用实线; 指向虚体(接 口 和抽象类)的关系用虚拟线; 2. 箭头指向时间上先定义的类
UML图
通信图 类图 顺序图 对象图 构件图 结构图 部署图 复合结构图 包图 UML图 行为图 交互图 定时图 交互概观图

开-闭原则的运用:
写一个相对固定的内核; 不断产生新的类,当修改发生时; 新的类给予接口或抽象类创建;

理解: 面向接口编程
里氏替换原则
子类型含父类型的全部特征

依赖倒转原则
抽象不应该依赖于细节,细节应该依赖于抽象; ---- 针对接口编程,不要对实现编程 解释: 1.高层类不应该依赖低层类;两者都应依赖于 抽象; 2.抽象不应该依赖细节;细节应该依赖抽象 反转实例: 电话指挥修电脑,谁依赖谁? 抽象与实现: 电脑主板-总线插槽-PIC卡的实 例— 抽象不依赖细节,细节依赖抽象。

OO的五大原则

OO的五大原则

OO的五大原则在学习和使用OO设计的时候,我们应该明白:OO的出现使得软件工程师们能够用更接近真实世界的方法描述软件系统。

然而,软件毕竟是建立在抽象层次上的东西,再怎么接近真实,也不能替代真实或被真实替代。

OO设计的五大原则之间并不是相互孤立的。

彼此间存在着一定关联,一个可以是另一个原则的加强或是基础。

违反其中的某一个,可能同时违反了其余的原则。

因此应该把这些原则融会贯通,牢记在心!OO的五大原则是指SRP、OCP、LSP、DIP、ISP。

1. SRP(Single Responsibility Principle 单一职责原则)单一职责很容易理解,也很容易实现。

所谓单一职责,就是一个设计元素只做一件事。

什么是“只做一件事”?简单说就是少管闲事。

现实中就是如此,如果要你专心做一件事情,任何人都有信心可以做得很出色。

OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性。

2. OCP :开闭原则,很简单,一句话:“Closed for Modification; Open for Extension”——“对变更关闭;对扩展开放”。

开闭原则其实没什么好讲的,我将其归结为一个高层次的设计总则。

OCP的动机很简单:软件是变化的。

不论是优质的设计还是低劣的设计都无法回避这一问题。

OCP说明了软件设计应该尽可能地使架构稳定而又容易满足不同的需求。

为什么要OCP?答案也很简单——重用。

3.LSP——里氏替换原则OCP作为OO的高层原则,主张使用“抽象(Abstraction)”和“多态(Polymorphism)”将设计中的静态结构改为动态结构,维持设计的封闭性“抽象”是语言提供的功能。

“多态”由继承语义实现。

如此,问题产生了:“我们如何去度量继承关系的质量?”Liskov于1987年提出了一个关于继承的原则“Inheritance should ensure that any property proved about supertype objects also holds for subtype objects.”——“继承必须确保超类所拥有的性质在子类中仍然成立。

《设计模式01》

《设计模式01》

单一职责原则(The single responsibility)
类的职责不要过多 单一职责可有效降低类间的耦合度,提高内
聚度 职责的划分不可过于机械
里氏替换原则(The Liskov substitu方, 均可用子类 替换; 必须正确地 使用继承 限制RTTI的 使用
《设计模式》
主讲: 陈伟 Email:ccchenwei@
第一部分 设计模式基础
§1.1
面向对象设计与复用 §1.2 设计的模式 §1.3 类设计的UML表示 §1.4 OO设计的原则 §1.5 设计模式说明
分类方法 四个要素
§1.1 面向对象设计与复用

面向对象设计的层次
双向多对多关联关系
单向关联(相识关系)
A 1 1
}; class B { };
B
class A { private: B * pB;
单向关联关系
组合(合成)关系
A -关系说明1 1 -关系说明2 * B
1)B是A的组成部分; 2)A负责B的生存与消亡 如:人由头、颈、躯干、四 肢组成。
例:
A -关系说明1 1 -关系说明2 * B
父类和子类
抽象类和具体类
实现关系
接口类与实现类
模版与模版类
普通关联
A -关系说明1 1 -关系说明2 2 B
class A { private: B * pB1; B * pB2; }; class B { private: A * pA; };
双向关联关系
普通关联
关联类1
A
*
*
B
-关系说明1-关系说明2
Class_13
AbsBusiness2 Class_14

OO原则

OO原则

一些面向对象的设计法则Bob Tarr 著outmyth 译法则1:优先使用(对象)组合,而非(类)继承[ Favor Composition Over Inheritance ]组合⏹(对象)组合是一种通过创建一个组合了其它对象的对象,从而获得新功能的复用方法。

⏹将功能委托给所组合的一个对象,从而获得新功能。

⏹有些时候也称之为“聚合”(aggregation)或“包容”(containment),尽管有些作者对这些术语赋予了专门的含义⏹例如:☞聚合:一个对象拥有另一个对象或对另一个对象负责(即一个对象包含另一个对象或是另一个对象的一部分),并且聚合对象和其所有者具有相同的生命周期。

(译者注:即所谓的“同生共死”关系,可参见GOF的Design Patterns: Elements of ReusableObject-Oriented Software的引言部分。

)☞包容:一种特殊类型的组合,对于其它对象而言,容器中的被包含对象是不可见的,其它对象仅能通过容器对象来访问被包含对象。

(Coad)⏹包含可以通过以下两种方式实现:☞根据引用(By reference)☞根据值(By value)⏹C++允许根据值或引用来实现包含。

⏹但是在Java中,一切皆为对象的引用!组合的优点和缺点⏹优点:☞容器类仅能通过被包含对象的接口来对其进行访问。

☞“黑盒”复用,因为被包含对象的内部细节对外是不可见。

☞对装性好。

☞实现上的相互依赖性比较小。

(译者注:被包含对象与容器对象之间的依赖关系比较少)☞每一个类只专注于一项任务。

☞通过获取指向其它的具有相同类型的对象引用,可以在运行期间动态地定义(对象的)组合。

⏹缺点:☞从而导致系统中的对象过多。

☞为了能将多个不同的对象作为组合块(composition block)来使用,必须仔细地对接口进行定义。

继承⏹(类)继承是一种通过扩展一个已有对象的实现,从而获得新功能的复用方法。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OO设计原则在软件软件系统中,一个模块设计得好不好的最主要、最重要的标志,就是该模块在多大程度上将自己的内部数据和其他与实现有关的细节隐藏起来。

一个设计得好的模块可以将它所有的实现细节隐藏起来,彻底地将提供给外界的API和自己的实现分隔开来。

这样一来,模块与模块之间就可以仅仅通过彼此的API相互通信,而不理会模块内部的工作细节。

OO设计根本的指导原则是提高可维护性和可复用性。

这些原则主要有:1. 开闭原则一个软件实体应该对扩展开放,对修改关闭。

在设计一个模块的时候,就当使这个模块可以在不被修改的前提下被扩展。

换言之,就当可以在不必修改源代码的情况下改变这个模块的行为。

如何做到既不修改,又可以扩展?解决问题的关键在于抽象化:在Java语言里,可以给出一个或多个抽象Java类或Java接口,规定出所有的具体类必须提供的方法特征作为系统设计的抽象层。

这个抽象层预见了所有的可能扩展,因此,在任何扩展情况下都不会改变。

这就使得系统的抽象层不需要修改,从而满足了—对修改关闭。

同时,由于从抽象层导出一个或多个新的具体类可以改变系统的行为,因此系统的设计对扩展是开放的。

开闭原则实际上是对“对可变性的封闭原则“:找到一个系统的可变因素,将之封装起来。

这个原则意昧着两点:1) 一个可变性不应当散落在代码的很多角落里,而应当被封装到一个对象里面。

同一种可变性的不同表象意昧着同一个继承等级结构中的具体子类。

继承就当被看作是封装变化的方法,而不应当被认为是从一般的对象生成特殊对象的方法。

2) 一种可变性不应当与另一种可变性混合在一起。

(所有类图的继承结构一般不会超过两层,不然就意昧着将两种不同的可变性混合在了一起。

)开闭原则是总的原则,其它几条是开闭原则的手段和工具。

2. 依赖倒转原则依赖倒转原则讲的是:要依赖于抽象,不要信赖于实现。

开闭原则是目标,而达到这一目标的手段是依赖倒转原则。

抽象层次包含的是应用系统的商务逻辑和宏观的、对整个系统来说重要的战略性决定,是必然性的体现;而具体层次则含有一些次要的与实现有关的算法和逻辑,以及战术性的决定,带有相当大的偶然性选择。

具体层次的代码是会经常有变动的,不能避免出现错误。

抽象层次含有一个应用系统最重要的宏观商务逻辑,是做战略判断和决定的地方,那么抽象层次就应当是较为稳定的,应当是复用的重点;也应当是维护的重点。

在很多情况下,一个Java程序需要引用一个对象。

这个时候,如果这个对象有一个抽象类型的话,应当使用这个抽象类型作为变量的静态类型。

这就是针对接口编程的含义。

一般而言,在创建一个对象时,Java语言要求使用new关键词以及这个类本身。

而一旦这个对象已经被创建出来,那么就可以灵活地使用这个对象的抽象类型来引用它。

比如:List employees = new Vector();因此,Java语言中创建一个对象的过程是违背“开闭原则”以及依赖倒转原则的(因为先生成了具体的类型,再使用抽象的引用),虽然在这个类被创建出来以后,可以通过多态性使得客户端依赖于其抽象类型。

正是由于这个问题,设计模式给出了多个创建模式,特别是几个工厂模式,用于解决对象创建过程中的依赖倒转问题。

工厂模式将创建一个类的实例的过程封装起来,消费这个实例的客户端仅仅取得实例化的结果,以及这个实例的抽象类型。

当然,任何方法都无法回避Java语言所要求的new关键字和直接调用具体类的构造子的做法(这违背了里氏代换原则)。

简单工厂模式将这个违反“开闭原则”和依赖倒转原则的做法封装到了一个类里面,而工厂方法模式将这个违反原则的做法推迟到了具体工厂角色中。

通过适当的封装,工厂模式可以净化大部分的结构,而将违反原则的做法孤立到易于控制的地方。

联合使用Java接口和Java抽象类:声明类型的工作由Java接口承担,但是同时给出的还有一个Java抽象类,为这个接口给出一个缺省实现。

如果一个具体类直接实现这个Java接口的话,它就必须自行实现所有的接口;相反,如果它继承自抽象类的话,它就可以省去一些不必要的方法,因为它可以从抽象类中自动得到这些方法的缺省实现。

这其实就是缺省适配模式。

依赖倒转的缺点:1) 因为依赖倒转的缘故,对象的创建很可能要使用对象工厂,以避免对具体类的直接引用,此原则的使用还会导致大量的类。

对不熟悉面向对象技术的工程师来说,维护这样的系统需要较好地面向对象的设计知识。

2) 依赖倒转原则假定所有的具体类都是会变化的,这也不总是正确的。

有一些具体类可能相当稳定、不会发生变化,消费这个具体类实例的客户端完全可以依赖这个具体类型,而不必为此发明一个抽象类型。

3. 里氏代换原则任何基类可以出现的地方,子类一定可以出现。

开闭原则的关键步骤是抽象化。

而基类与子类的继承关系就是抽象化的具体体现,里氏代换原则是对实现抽象化的具体步骤的规范。

4. 合成/聚合复用原则要尽量使用合成/聚合,而不是继承关系达到复用的目的。

合成/聚合原则要求我们首先考虑合成/聚合关系,里氏代换原则要求在使用继承时,必须确定这个继承关系符合一定的条件(继承是用来封装变化的;任何基类可以出现的地方,子类一定可以出现。

)合成/聚合原则就是在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分;新的对象通过向这些对象的委派达到得复用已有功能的目的。

5. 迪米特原则一个软件实体应当尽可能少的其他实体发生相互作用。

模块之间的交互要少。

这样做的结果是当系统的功能需要扩展时,会相对更容易地做到对修改的关闭。

一个对象应当对其他对象有尽可能少的了解。

迪米特原则的具体操作:1) 优先考虑将一个类设置成不变类。

不变类易于设计、实现和使用。

比如Java API中的String,BigInteger等类。

一个对象与外界的通信大体上分成两种,一种是改变这个对象的状态,另一种是不改变这个对象的状态的。

如果一个对象的内部状态根本就是不可能改变的,那么它与外界的通信当然就大大地减少。

当涉及任何一个类的时候,都首先考虑这个类的状态是否需要改变。

即便一个类必须是可变类,在给它的属性设置赋值方法的时候,也要保持吝啬的态度。

除非真的需要,否则不要为一个属性设置赋值方法。

2) 尽量降低一个类的访问权限。

3) 谨慎使用Serializable,一旦将一个类设置成Serializable,就不能再在新版本中修改这个类的内部结构,包括private的方法和句段。

4) 尽量降低成员的访问权限。

6. 接口隔离原则应当为客户端提供尽可能小的单独接口,而不要提供大的总接口。

也即是使用多个专门的接口比使用单一的总接口要好。

接口隔离原则与迪米特都是对一个软件实体与其他的软件实体的通信限制。

迪米特原则要求尽可能地限制通信的宽度和深度,接品隔离原则要求通信的宽度尽可能地窄。

这样做的结果使一个软件系统在功能扩展过程当中,不会将修改的压力传递到其他对象。

一个接口相当于剧本中的一种角色,而此角色在一个舞台上由哪一个演员来演则相当于接口的实现。

因此,一个接口应当简单地代表一个角色,而不是多个角色。

如果系统涉及到多个角色的话,那么每一个角色都应当由一个特定的接口代表。

定制服务:如果客户端仅仅需要某一些方法的话,那么就应当向客户端提供这些需要的方法,而不要提供不需要的方法。

(向客户端提供public接口是一种承诺,没有必要做出不必要的承诺,过多的承诺会给系统的维护造成不必要的负担。

)设计原则是基本的工具,应用这些规则可使代码更加灵活、更容易维护,更容易扩展。

基本原则:封装变化Encapsulate what varies. 面向接口变成而不是实现Code to an interface rather than to an implementation. 优先使用组合而非继承Favor Composition Over Inheritan什么是设计原则?设计原则是基本的工具,应用这些规则能够使您的代码更加灵活、更容易维护,更容易扩展。

基本原则封装变化Encapsulate what varies.面向接口变成而不是实现Code to an interface rather than to an implementation.优先使用组合而非继承Favor Composition Over InheritanceSRP: The single responsibility principle 单一职责系统中的每一个对象都应该只有一个单独的职责,而任何对象所关注的就是自身职责的完成。

Every object in your system should have a single responsibility ,and all the object s services should be focused on carrying out that single responsibility .每一个职责都是个设计的变因,需求变化的时候,需求变化反映为类职责的变化。

当您系统里面的对象都只有一个变化的原因的时候,您就已很好的遵循了SRP原则。

假如一个类承担的职责过多,就等于把这些职责耦合在了一起。

一个职责的变化就可能削弱或抑制这个类其他职责的能力。

这种设计会导致脆弱的设计。

当变化发生的时候,设计会遭到意想不到的破坏。

SRP 让这个系统更容易管理维护,因为不是任何的问题都搅在一起。

内聚Cohesion 其实是SRP原则的另外一个名字.您写了高内聚的软件其实就是说您很好的应用了SRP原则。

怎么判断一个职责是不是个对象的呢?您试着让这个对象自己来完成这个职责,比如:“书自己阅读内容”,阅读的职责显然不是书自己的。

仅当变化发生时,变化的轴线才具备实际的意义,假如没有征兆,那么应用SRP或任何其他的原则都是不明智的。

DRY : Don't repeat yourself Principle通过抽取公共部分放置在一个地方避免代码重复.Avoid duplicate code by abstracting out things that are common and placing those thing in a single location .DRY 很简单,但却是确保我们代码容易维护和复用的关键。

您尽力避免重复代码候实际上在做一件什么事情呢?是在确保每一个需求和功能在您的系统中只实现一次,否则就存在浪费!系统用例不存在交集,所以我们的代码更不应该重复,从这个角度看DRY可就不只是在说代码了。

DRY 关注的是系统内的信息和行为都放在一个单一的,明显的位置。

就像您能够猜到正则表达式在.net中的位置相同,因为合理所以能够猜到。

DRY 原则:怎样对系统职能进行良好的分割!职责清楚的界限一定程度上确保了代码的单一性。

相关文档
最新文档