第二组第二次作业

第一章

单一职责原则

1.1 编写类或接口执行单一职责原则,定义是有且仅有一个原因引起类的变更。我对于它的理解是:把实现的每个功能归称一个大类,在每个功能大类中编写对应的类或接口。

1.2 单一职责的好处:

1类的复杂性降低,实现什么职责都有清晰明确的定义。

2可读性提高,复杂性降低。

3可维护性提高。 

4变更引起的风险降低。

单一职责的量化标准:用“职责”或“变化原因”来衡量接口或设计得是否优良,这两个衡量标准因项目,环境而已。

1.3 方法也要单一职责,不能贪心一个方法完成一个笼统的功能。

1.4 由于写类时需要考虑很多外部因素,所以很难做到单一职责,但接口要做到单一职责,类的设计尽量知道只有一个原因引起变化。

 

第二章

里氏替换原则

2.1 继承的优点:

1子类共享父类代码。

2提高代码重用性。 

3提高代码的可扩展性。 

4提高产品或项目的开放性。 

继承的缺点:

1继承中父类相当于侵入子类。 

2降低子类代码灵活性。 

3增强子类与父类的耦合性,不易于修改。

里氏替换原则:父类能出现的地方子类也可以出现并能替换成子类,反之不能。

2.2 子类必须完全实现父类的方法,可以有自己独有的方法。子类的输入参数宽于或等于父类的输入参数,子类的方法才不会被调用。

 

第三章

依赖倒置原则

3.1原则含义:高层模块不依赖底层模块,两者应依赖其抽象(接口或抽象类)。

细节(实现类)应依赖抽象,反之不能。细节之间不发生直接的依赖关系,依赖关系是通过抽象产生的。

3.2 依赖倒置原则的优点:

1减少内间的耦合性。 

2提高系统的稳定性。 

3降低并行开发引起的风险。 

4提高代码的可读性和可维护性(并行开发的风险是一段程序的错误和异常毁了整个项目 )。

一个变量可以有两种类型,表面类型(定义时赋予的类型)和实际类型(对象的类型 )。

独立运行单元测试的小工具:JMock工具 ,可以根据抽象虚拟一个对象进行测试。

3.3 依赖的三种写法

1构造函数传递依赖对象

 

2 setter方法传递依赖对象

 

3接口声明依赖对象

3.4 依赖倒置原则的本质是通过抽象使各个类或模块实现彼此独立,不相互影响,实现模块之间的松耦合。具体是指:

1每个类尽量都有接口或抽象类,变量的表面类型尽量是接口或抽象类,任何类都不能从具体类派生,尽量不要复写基类的方法,因为可能会对依赖的稳定性产生影响。 2结合里氏替换原则使用,依赖倒置原则比较适合中大型项目中,实现开闭原则的前提是实现依赖倒置原则。

 

 

第四章

接口隔离原则

4.1接口隔离原则的定义:首先接口分为实例接口和类接口(用Interface定义的接口 ),类接口是指在Java中声明一个类 ,再new产生一个实例,这个类就是对类型的事物的描述,这是实例接口。

接口尽量细化,里面的方法尽量少。它与单一职责的不同是:单一职责注重的是职责,是业务逻辑上的划分。接口隔离原则要求接口的方法尽量少,不需要为了满足多个模块就建立臃肿的接口。

4.2 为了便于程序的扩展,不能过度封装,也应使用接口隔离原则。

4.3 根据接口隔离原则拆分接口时要先满足单一职责原则。

注意:

1接口要高内聚。高内聚是提高接口类模块的处理能力,减少对外的交互,具体到接口隔离原则就是在接口中少使用public。

2定制服务 指只提供访问者需要的方法。

3越拆分接口系统会越灵活,但同时结构越复杂,越难维护,所以要注意适度。

4.4 1一个接口只服务一个子模块或业务逻辑。

2少量使用public,根据需求进行拆分接口,不能生搬硬套。

 

 

第五章

迪米特法则

5.1 迪米特法则含义:一个类应该对自己需要耦合或调用的类知道的最少。

5.2 方法是类的一个行为,这个方法只能与本类产生依赖关系,不允许与其他类产生依赖关系,不同类之间的关系是建立在类间,不是方法间,这样就会降低系统间的耦合,提高系统的健壮性。

但是同个类中的方法也要注意保持距离,减少公开的属性或方法 (这样修改时候,设计面和风险会更大),尽量使用private、package、protected等访问权限。

假如一个方法可以放在不同的类中,但这个方法要优先放在不增加类间关系,也不对类产生负面影响的类。

5.3 迪米特法则的核心观念就是类间解耦,弱耦合,但是要尽量少产生中转或跳转类(量不要超过两次 ),因为跳转的越多,维护就越困难 。

 

 

第六章

开闭原则

6.1 定义:一个软件实体如类,模块和函数应该对扩展开放,对修改关闭。(通过扩展实现变化,而不是通过修改已有代码实现。)

6.2 但对修改关闭不是绝对不修改的,如果合适可以适当的修改,修改可以归纳为:

1只对某个逻辑进行变化。 

2子模块的修改。 

3可见试图的变化尽量通过扩展完成。

完成项目应经过:

1项目开发。

2重构(指对原有设计和代码修改)。

3测试。

4投产。

5运维(避免修改原有代码)。

6.3 开闭原则相比前五个原则重要

开闭原则的重要性:

1测试要保证业务逻辑,边界条件,异常要测试到。单元测试是对类的测试,类中的方法耦合是允许的,所以尽量不要修改方法,因为如果牵扯到这个方法有复杂的逻辑,在整个测试类中的方法就会被修改的面目全非,要通过扩展来实现业务逻辑的变化。

2提高复用性,便于维护。因为通过扩展来实现业务逻辑的变化,所以这个逻辑粒度是很小的,不用读懂原有代码中的逻辑关系,直接扩展一个类。

6.4 怎样使用开闭原则?

1通过接口或抽象类约束扩展,只能在现有的基础上进行扩展 。参数类型、引用对象尽量使用抽象类或者接口。抽象层一旦确定就不允许修改 。实现对扩展开放的前提条件就是抽象约束。

2元数据(用来描述环境和数据的数据 )控制模块行为。

3制定项目章程。

4封装变化(封装可能发生的变化 )相同的变化封装到一个接口或抽象类中 。

6.5 封装变化依赖的六大原则: 

1单一职责原则。

2 开闭原则。

3里氏替换原则。

4迪米特法则。

5接口隔离原则。

6依赖倒置原则。

但是封装变化并不局限于这六大设计原则, 尽量采用最好。其中类必须做到高内聚、低耦合,以此来避免一些不可预料的事故。封装变化前也要做好项目规章制度,预知变化

 

 

UML概述

 

定义:统一建模语言UML是一种直观化、明确化、构建和文档化软件系统产物的通用可视化建模语言。

支持大多数面向对象的开发过程,也可用于迭代的开发过程。

UML不是编程语言,是通用性的建模语言,是离散的建模语言,是对诸如软件、硬件或数字逻辑的离散系统建模的通用语言。

静态结构:分为类、属性、操作。多个类可以使用概括共享通用的结构,元素之间的一些关系可以用依赖来分组,包括抽象层次的转移,模块参数的绑定,许可的授予和元素对其他元素的使用。

这些元素包括接口、数据类型、用例和信号。合并在一起成为分类。

动态行为:建模动态行为有两种方式:

1通过与外界交互的对象的生命史。

2使用一系列对象的通信模式。这些相互连接的对象交互实现行为。

被隔离的对象视图是状态机,对象依照当前状态对事件响应,执行动作,迁移至新状态。

依赖上下文的对象和互相之间链的视图是协作。

UML预览 静态视图 用例视图 

 

posted @ 2021-01-29 13:37  19A2  阅读(82)  评论(0编辑  收藏  举报