面向对象设计(OOD)
- OOA和OOD的区别
- OOA是对于真实世界中的问题、职责进行描述,不需要考虑怎么实现。用户角度。领域模型。概念类。
- OOD需要考虑编程的实现。系统实现角度。设计模型。设计类。
- OOD是什么
- 在OOA模型基础上运用面向对象方法进行系统设计,目标是产生一个符合具体实现条件的OOD模型
- OOD主要工作
- 软件体系结构设计(必须在用例实现方案设计之前进行)
- 用例实现方案设计
- 用户界面设计(与其余两项没有必须的前后关系)(前两个是重点)
- OOD结果
- 以uml包图等表示的软件体系结构
- 以交互图和类图表示的用例实现
- 针对复杂对象的状态图
- 描述流程化处理过程的活动图
- 层次化设计:
- 同一类放一起
- 软件分层的好处(软件体系结构设计中的内容)
- 健壮性
- 易于扩展和维护
原则:对某一划分出的层次进行修改时,只要接口不变,系统的其他部分应该不受影响,扩展维护可移植
- 包图描述层。本课学到了五层软件分层结构,松耦合架构,分别是:用户界面、控制器、业务逻辑、持久化、系统管理
- 用户界面层:人机接口
- 控制器层:并不进行任务处理,而是任务拆解和分发。实现了界面层和逻辑层的分离。控制器数量与用例数量相对应
- 业务逻辑层:这里边的类来源于OOA的概念类。但二者有本质区别:领域模型的类,着眼于业务对象,不涉及对象的动作行为。只有属性没有方法。业务逻辑层的类需要通过消息交互共同完成用户发出的系统事件,因此不仅有属性也有方法。但好消息是OOA和OOD都用类和对象表示,所以只需要对领域模型的概念类增加方法即可得到设计模型的设计类。
- 持久化层:引入的目的是,以防数据存储策略变化。变化之后,业务逻辑层不用动。
- 系统层:非面向对象方式实现。软件与操作系统分离,增加应用的可移植性。绝不能调用其他层次的类,因为系统层是最底层。
- OOD七个基本原则(优秀经验)
- 单一职责原则(一个类只包含一个对外功能,也就是只能有一个public方法),这样能提高类的内聚性。瑞士军刀和瑞士小刀
- 开闭原则(对于功能可以扩展,但代码不能修改,这似乎是矛盾的,于是这条想说的就是依赖于抽象,使用封装技术进行封装)例如,有一个联系方式管理器类,依赖(就是依关聚组继的那个最弱的依赖)于phone类和email类,这是坏的,因为如果要扩展一个“传真”,那么联系方式管理器类的代码一定要被改的。正确做法是,令联系方式管理器依赖于一个抽象的父类,phone和email对继承自抽象类,那么就做到了“功能扩展而代码不改”的效果。
- 里氏替换原则(父类对外提供的方法,子类必须能够提供,不然就不要贪图代码的复用而进行继承)橡皮鸭子不能继承真鸭子
- 依赖倒置原则 (①高层模块不应依赖低层模块,二者都应依赖于抽象;②抽象不应依赖于具体,具体应依赖于抽象)翻译成人话的解释,是,①高层不要直接调用底层方法,声明一个接口,让低层去实现 ②跟开闭原则讲的一件事
- 接口隔离原则:对不同的用户提供不同接口。客户冰糖要1,你因为客户雪梨要123,所以给冰糖也提供了123,这将产生负担。
- 组合聚合复用原则(复用代码不要老想继承,这太暴露了,优先考虑作为成员变量(也就是组合聚合),这样信息还是隐藏的)
- 迪米特原则(不要和陌生人说话,是信息隐藏原则的直接应用)熟人范围有五个。
- 设计用例实现方案(GRASP设计模式)
就是前面五个层次给出了框架,现在要往框架里填具体的对象是谁。包括“创建系统动态结构”、“创建系统静态结构”
设计类的来源:一个是前面说到的“概念类+方法”,这些最后都落到“业务逻辑层”;二是新增的,因为OOD考虑到“实现”这一步了,比如负责任务分发的类、负责持久化的类、负责通信的类是必不可少的,这些是之前在用户角度看不到的,这些类落到:用户界面层,控制器层,系统管理层,持久化层。
了解型职责,行为型职责
面向对象最关键的活动是正确的给对象分配职责。本课推荐基于设计模式的对象职责分配方法,也就是 GRASP设计模式 。
补充:
设计模式是什么?是软件开发经验的总结
GoF设计模式是什么?GoF是四个人,共同写了一本书《Design Patterns: Elements of Reusable Object-Oriented Software》,收录23种设计模式。后人用“GoF设计模式”指代这本书
本课中讲的GRASP设计模式与GoF有什么区别?GoF面向特定待解决的问题提供方法论,GRASP是基础,面向“面向对象设计”来告诉初学者怎样去设计
GRASP包含:
信息专家
创建者
控制器
(还有几个但考试大概只考察上面三个)
软件测试
侠义的软件测试是程序本身,现代的软件测试指的是为了发现软件中存在的错误,对软件开发过程中形成的各项输出进行检查。注意“各项输出”,包括了需求规格说明、概要设计说明……
那么软件生存期各个阶段需要测试的对象如图所示。
广义的软件测试分为:测试、确认、验证。
- 白盒测试之一:逻辑覆盖(6种)
以图片例子,分别把A>1,B=0,A=2,x/A>1记为1234。
语句覆盖: 「保证每个矩形被执行过即可」
一个测试用例:
(1且2)真 且 (3或4)真
满足条件之一的情况是(1真,2真,3真) 即 A=2,B=0,x=4可以达到语句覆盖
(如果结果得出空集(我认为)就要调整了,下同)
判定覆盖 「每个菱形取过真和假即可」
两个测试用例:
(1且2)真 且 (3或4)真 即 A=2,B=0,x=4
(1且2)假 且 (3或4)假 即 A=-1,B=1,x=1
条件覆盖 「每个条件取过真和假即可」
两个测试用例:
1真 2真 3真 4真
1假 2假 3假 4假
判定-条件覆盖 「每个条件取过真和假,且每个菱形取过真和假」
两个测试用例:
1真 2真 3真 4真 -> ace
1假 2假 3假 4假 -> abd
条件组合 「把每个菱形内的条件都组合一遍,菱形之间的关系不用管」
1真 2真 3真 4真
1真 2假 3真 4假
1假 2真 3假 4真
1假 2假 3假 4假
路径测试 最强,含义:把所有可能的路径覆盖」
覆盖abd
覆盖abe
覆盖acd
覆盖ace
- 白盒测试之二:基本路径测试
理解一下就是逻辑覆盖中的路径测试真好啊,但是测不过来啊(考过给一个流程图,问多少条路)。那只好提取出一些有代表性的 基本 路径了
三种方式计算环路复杂度V(G)
- 黑盒测试法之等价类划分
-
软件测试过程(单、集、确、系、验)
单元测试:白盒为主,黑盒为辅;依据详细设计说明书;实施人是程序员
集成测试:组装。依据系统设计说明书。
确认测试:黑盒测试。依据需求规格说明书。也叫有效性测试,测试软件功能是否有效。也就是确认装完是飞机而不是风筝
系统测试:各种变态的压力测试,以及与环境适配。依据需求规格说明书。
验收测试:投入使用几个月后,走个流程,用户选择几个核心功能进行测试
北邮2024-2025第二学期《软件工程》期末考题回忆
四道简答题:
需求分析的活动有哪些?里程碑是什么?
操作契约的后置条件有哪些?有什么作用?
动态结构设计和静态结构设计的作用和关系。
黑盒测试中减少测试用例数量的办法有哪些?
四道大题:
根据抽象的描述画交互图
白盒测试,根据代码画控制流图、算VG、写基本路径
黑盒测试,画等价类表格
综合大题。