目录
- 第十一章.软件工程
-
- 第九节.面向对象设计
-
- 面向对象(OAA)的基本概念
- 面向对象开发各阶段划分及任务
- OOA 设计原则
- OOA – UML
- OOA 设计模式的概念
- OOA 设计模式的分类
-
- 创建型模式
- 结构型模式
- 行为型模式
- 第十节.数据流图(DFD)
-
- 数据流图基本概念
- 数据流图的分层
- 数据字典
- 数据流图平衡原则
- 数据流图试题解题技巧
- 数据流图案例分析1
- 数据流图案例分析2
- 第十一节.数据库设计
-
- 数据库设计过程
- E-R模型
- 数据库设计答题技巧
- 数据库案例分析1
- 数据库案例分析2
- 第十二节.UML建模
-
- 用例图
- 类图与对象图
- 顺序图
- 活动图
- 状态图
- 通信图
- UML案例分析
- 第十三节.UML图的分类 2.0
- 第十四节.补充小节
-
- UML类图中常见的几种关系
-
- 1.泛化(Generalization)
- 2.实现(Realization)
- 3.关联(Association)
- 4. 聚合(Aggregation)
- 5. 组合(Composition)
- 6. 依赖(Dependency)
- 总结
- 第十四节.软件质量保证
-
- McCall软件质量模型
第十一章.软件工程
第九节.面向对象设计
面向对象(OAA)的基本概念
对象
在开发的时候,我们会把人物这些现实东西都抽象为对象。像人物的一些特征变成对象当中的一些属性;比如某个人抽象成对象之前,他会有身高、年龄、体重等等数据,这些都是以属性的方式出现;还会有他自己的操作方法,意思就是这个人在这个系统当中能做些什么事情。
类(实体类、边界类、控制类)
类是把对象的共性抽取出来而形成的类。具体来讲,类又分为实体类、边界类和控制类这几个类别。
- 实体类:往往跟数据对应的就是实体类,比方说咱们的系统当中要用到老师的信息,那么教室类就可以充当实体类,实体类它是跟数据相关的。
- 边界类:就是一个系统会有他的边界,这个系统里面会有很多类,其中有一些类是在这个边界上面需要跟外界相连。它往往也不会超出边界的范围,它还是在系统之内,但是它会有职能要跟外界的系统进行交互,这就会成为边界类要有这种特征。
- 控制类:类与类之间是需要衔接和控制,所以会有控制类。它是做衔接部件的。
抽象
没什么好讲的。
封装
什么是封装呢俗一点来讲,我们会把相关的数据把它封装在一起,比如说对象就有相应的封装机制,会把这一个对象相关的信息。封装起来的表现是什么呢们要去用这个对象,你不能够直接操作对象里面的数据,而需要通过对象的接口进行相关的操作。这就是封装的理念。那具体编写代码的层次,封装的理念就是我们会把有一部分的属性把它定义为私有的,你要操作这部分属性也可以用我们提供给外界的接口也就是公共的一些操作方法,比如说 set、get 方法来操作这个私有变量的情况,你不能够直接用去操作这个属性,这就是不允许的。
继承和泛化
继承和泛化其实一回事,只是从不同的角度来看,有父类,有子类,子类会继承父类的相关特性,这是继承。如果说有多个类,他们有共性,我们把共性抽出来,形成了一个上层的类,这个过程称为泛化。通俗一点来讲就是广泛化,因为上面的这一个类它的适用范围肯定会更广一些。
多态
多态最为直观的表现就是 我做同样的操作,但是控制的可能是不同的对象,那么它的操作会有差异会表现出不同的做法。比如说有动物类,底下有鱼猫狗之类的。它们的运动我们用 run()这个函数来表示。那动物这个类里面就已经有 run()函数,在鱼猫狗这些种类里面会具体地把它们如何运动给描述出来。我们知道猫和狗都是走,而鱼是游。如果说我们创建了一个对象集,这些动物都有鱼有猫有狗,我们要控制它的运动。我定义一个变量指针,这个指针类型是鱼能不能够用这个指针来操控狗和猫了,那是不行的。所以这个时候我们往往会定义一个动物类型的指针,这种指针既可以指向猫,也可以指向狗,还可以指向鱼。那表现形式就是 就可以控制当前它指向的这个动物运动。在这个过程中如果说指针指向的是鱼,这个 run 表示游,如果说指针指向的是猫和狗,这个run表示走。所以说看上去是完全一样的形式,但是表现出了不同的状态。这就是多态的含义。如果是在Java中,这个指针就是父类对象,指向创建的子类对象。
多态分类
一般将多态分为通用多态和特殊多态。通用多态包括参数多态和包含多态。
参数多态采用参数化模板,通过给出不同的类型参数,使得一个结构有多种类型。
包含多态同样的操作可用于一个类型及其子类型。 (注意是子类型,不是子类。) 包含多态一般需要进行运行时的类型检查。如Pascal中的子界。
特殊多态包括强制多态和过载多态。
强制多态编译程序通过语义操作,把操作对象的类型强行加以变换,以符合函数或操作符的要求。程序设计语言中 基本类型的大多数操作符,在发生不同类型的数据进行混合运算时,编译程序一般都会进行强制多态
过载多态是一种特定的多态,指同一个名(操作符、函数名)在不同上下文中可代表不同的含义。
接口
什么是接口了先我们给它定性,接口是一种类,但是它是一种特殊的类,特殊在哪里了种类只有方法的定义,没有方法的实现,相当于它定义的方法都是空框框。
消息
消息就是进行对象之间进行交互的时候所采用的机制,它走的是异步的方式在传输的。对象之间的通信都是走的消息的模式。
组件
组件就是构建
模式和复用
提出模式的概念本身就是为了复用。后面我们会详细讲到模式,因为有架构模式、设计模式之类的。其实模式就是一种经验的传承。我们解决这类问题以前用到了这种方式,现在我们把它归总起来,进行相关的一些规范化的调整,就形成了一种模式,以后针对这种问题我都用这种模式去解决。这就是模式的基本思路,根据不同的抽象级别又可以分为了架构模式、设计模式,还有惯用法之类的。
面向对象开发各阶段划分及任务
面向对象分析阶段:认定对象,组织对象,对象间的相互作用,基于对象的操作。
面向对象设计阶段:识别类及对象、定义属性、定义服务、识别关系、识别包。
面向对象程序设计:程序设计范型、选择一种OOPL。
面向对象测试:算法层、类层、模板层、系统层。
OOA 设计原则
面向对象设计原则在设计的过程中非常的实用。另外一方面我们后面会讲到设计模式,其实设计模式就是利用到这些设计原则来解决一些实际问题的解决方案。所以我们在设计模式里面是能够看到这些设计原则的一些影子的。
单一职责原则:设计目的单一的类
目的单一的类就是指的我们做一个类出来,这个类它的目的应该只能解决一个方面的问题,这就符合单一值的原则。为什么要考虑这样子来做呢因为如果说一个类它的职责越多,那它和其他类关联的可能性其实是越大的。这就好比我们日常生活中,你在公司里面管的事务,只管一个事务,让你跟你打交道的人会比较少。当你管多个业务线的业务的时候,你和相关的人员去沟通的时候,这个相关人员的群体就会要大得多。所以说我们的类如果说职责比较单一,会降低整个程序的耦合程度。
开放-封闭原则:对扩展开放,对修改封闭
对扩展开放,对修改封闭是什么意思呢是我们不要去做程序的修改,要的话就做程序的扩展。因为我们在维护的过程中经常要加一些新的功能,加新功能的第一种方式就是在原有的类的基础上把这个类改得更加强大一些,它支持的东西更多一些。另外一种方法就是我不去改原来的东西,新的功能用新的类去实现。故在开闭原则里面,该原则希望我们用扩展的方式,用新的类来解决问题,而不要去修改原有的东西。为什么呢为你在修改程序的时候很容易引入错误,引入错误影响到的不仅仅是新的功能,还会影响到原有的功能,这就带来了一些不安全的因素隐患。所以要执行开闭原则,你不去修改这个问题就可以得以避免。
李氏(Liskov)替换原则:子类可以替换父类
为什么子类可以替换父类呢为面向对象体系当中实际上是有着继承关系在里面的。子类继承父类,子类是拥有父类相关的特性,所以子类是可以替换父类去做相关的事情的,因为子类可能比父类还要懂得更多一些,但是父类懂的子类都懂,所以子类可以给父类顶班替班。为什么强调这一点是因为虽然有继承机制在,但是有的时候我们可能子类不见得能够替换父类。什么情况呢是当你把子类当中的一些方法做重载做覆盖之后,这个时候子类相同的函数和父类的起到的职能不一样,这个时候子类就不能够替换父类了。所以李氏替换原则希望我们做到的是你不要去盲目的重载去修改父类的方法,这样子会有安全隐患,因为你修改了别人不知道别人只看到他们之间有继承关系,就认为子类可以替换父类,那样子会出错。所以有这个原则就能够避免一些问题,让你设计的时候时刻记得要当子类能够替换父类时,你就不会去做重载这件事情。在我们的开发当中也确实这么去做的。为什么呢像接口的这种机制就是这样子引入过来的,子类和父类如果说有重载就会导致一些问题,那如果说这一个父类是一个接口,问题就不再存在了。
依赖倒置原则:要依赖于抽象,而不是具体实现;针对接口编程,不要针对实现编程
该原则要表达的是什么意思呢思就是我们在进行设计的时候,那你要去依赖于接口,不要依赖于具体的实现类。依赖于接口有什么好处呢赖于接口,它能够让我们的操作很灵活,而且不受太多的制约。举个简单的例子,在硬件领域,比方说我们的计算机,它就是一种针对接口编程而不针对实现编程的。为什么这么讲们拆开计算机会发现里面有很多标准接口,比如说 PCI 接口、VGA接口等等这么一系列的接口。那么这些接口是怎么做的吗板上面有插槽,显卡或者其他的声卡之类的板卡上面有那种金手指的这个插条。如果说要把两者对接,那就是直接把显卡或者声卡或者 卡插到插槽里面进行对接。这说明两个部件它们要关联结合在一起的时候是用到了接口。而类似的情况在电视机里面他就不会这么去做,部件与部件之间往往是焊接的方式。那这种就属于针对实现编程紧耦合的方式。那么两者是各有千秋的。为什么呢计算机的这种体制都是用的接口,那么你要做一些调整和改变就会比较方便,要扩展也比较容易。比如说你要升级显卡,那你把显卡拔下来换一块上去就可以了,而电视机就没这么方便了,那是要通过焊接。那为什么电视机不做成那种可拔插可更换式的呢为我们的用户习惯当中电视机是不用做部件的升级的,所以不需要这么去做。而在我们的开发过程中,在开发过程中的话,软件的部件是随时可能升级的。所以如果说你是紧耦合是针对实现编程,那你一个小的部件要做调整,那会很麻烦。但如果针对接口了,这个问题就迎刃而解。
接口隔离原则:使用多个专门的接口比使用单一的总接口要好
为什么这种原则要好呢其实就是接口的单一职责的目的。就一个接口我只做一件事情,那就能够把问题简单化,不容易出错,不会因为职责过多而导致一些问题一些疏漏。
组合重用原则:要尽量使用组合,而不是继承关系达到重用目的
为什么尽量不使用继承关系呢为继承它是一种紧耦合关系,所以我们要避免去用它继承。为什么继承是紧耦合关系呢为父类一变,子类也都要跟着变,这就自然紧耦合。
共同封闭原则:包中的所有类对于同一性质的变化应该是共同封闭的。一个变化若对一个包产生影响,则将对该包产生影响,则将对该包里的所有类产生影响,而对于其他的包不造成任何影响
共同重用原则:一个包里的所有类应该是共同重用的。如果重用了包里的一个类,那么就要重用包中的所有类
迪米特(Demeter)原则(最少知识法则):一个对象应当对其他对象有尽可能的了解
最少知识法则的基本思路就是一个对象,他要尽可能少的对其他对象有了解。这就跟我们之前讲到的信息隐蔽是一回事,只有你对另外一个对象了解非常之少,你才能够用标准的方式去调用它。如果说你知道的越多,你就越容易绕开规则,直接操作对象里面的属性方法之类的,这不太合适。那么最少支持法则是通过什么来实现的呢往就是通过封装,我们把一个对象给封装起来。封装起来之后,对象里面的属性方法可以私有的,私有的属性方法外界是看不到的。
总结
这就是面向对象的一系列原则。其实在面向对象的设计过程中,我们一直要记得这些原则,否则了开发出来的程序往往会存在这样或那样的一些问题,比如说可扩展能力不强,比如说可修改性不强等等这一系列的问题。所以这些原则是要把握好的。在考试的时候,这些原则以选择题的形式出现的比较多。然后往往问到哪些说法是对的,哪些说法是不对的,或者说了给你一个原则,给你一系列描述,问这些描述是否符合原则的这一个基本的思想。所以对这些原则要有一定的认识。
OOA – UML
UML是一个非常重要的知识点,考察频度也很高。在这里我们要了解的东西主要是 UML 的一系列的图,这是最核心的。其次是要对这几种关系有一定的了解。好下面我们来逐步展开来进行相关的讲解。
1.创建型模式就是指的用于创建对象的模式,它为设计类实例化新对象提供指南。那么我们知道对象的产生其实是用 new 这样的关键字,可以很简单很方便的产生。为什么需要设计模式来掺和这个事情呢是因为简单的用 new 的方式来产生对象往往灵活度不够,然后在一些场景之下要费比较大的功夫才能够完成和达到我们需要的效果。所以就诞生了一系列的创建型的模式。比如说工厂方法,工厂方法就是构建的一个工厂,你只要给工厂下发指令,就能够生产出你想需要用到的这一种对象。那这个时候你如果说要不同类型的一些对象,你只要改工厂方法里面的内容就可以了,而不需要去调整原有的业务逻辑这一块的代码。所以就相当于把创建对象这件事情把它脱离出来,这对于我们维护肯定是有好处的。像抽象工厂可以生产按系列生产相应的对象,原型模式,还有单例模式、构建器模式,这些都属于创建型模式。后面我们会逐一的进行讲解。
2.结构型的模式主要是处理类或对象的组合问题,让类或对象形成更大的结构,提供相应的一些指导。结构型模式典型的有适配器模式、桥接模式、组合模式等等,他们各有各的一些特色,比如说适配器模式就可以通过这样的模式进行统一的操作,就可以把原来不统一的东西统一起来。这就跟我们的电源适配器差不多。家用电用到的是 220 伏的交流电,而手机上用到的是 4.7 伏的直流电,笔记本上面用到的往往是 12 伏的直流电,不同的地方用到的电有不同的差别。这个时候我们就要用到电源适配器来做转换工作。所以其实我们平常的所谓的充电器就是适配器。桥接模式、组合模式、装饰模式、外观模式等等都有各自的特点。后面会一一介绍。
主要意图是 将抽象部分与其实现部分分离,使它们都可以独立地变化。
3.行为型模式 包括职责链、命令解释器、迭代器等等。行为型的模式它主要了是用来描述类或者说对象交互的这个情况以及职责的分配的问题是在这一方面有他的一些方案,因为每一种模式都是一种不同的方案。
这是设计模式的分类。这些分类我们要搞清楚哪些是属于创建型,哪些是结构型,哪些是行为型,这就是设计模式要掌握的这些一系列模式当中第一梯度需要掌握的东西。
创建型模式
创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建、组合和表示它的对象。
适配器模式
说明中的做法 就是适配器模式要解决的主要问题。所以给它的关键字是转换接口。在这讲到转换接口的时候,请大家想到电源适配器,比如说在软件领域里面,我们可以用到的对外的接口很多种,每种不同的厂商给我们提供了不同的接口。我们现在要用到这些接口,并且希望用一致的方法应用,那你就可以用适配器模式。
桥接模式
如果说看类图的话,这是一种非常典型的桥的结构。为什么要这么做呢往往是这种应用场景,原来了是一棵大的类树,如果说要用继承的方式来走,这棵树了会非常之庞大。然而我们发现了这棵树当中变化点有两个方面,所以就把它拆成两个不同的方面,让它在两个维度上面形成两棵树。然后把它桥接起来。这样子就把继承树相当于进行了拆分简化问题了,这就是桥接。
组合模式
组合模式要表达的是以这种组合数的形式表示了整体和部分的关系,典型代表就是树形目录结构。什么情况呢如说这是一个目录底下了可以有目录还可以有文件。其实这里面就折射出来了整体部分,到部分的时候又可以包含其他部分的这样的一种结构。这种结构应用非常广泛,像我们操作系统里面的树形目录结构是一方面的应用。还有比方说在一个公司里面涉及到部门,部门底下又可能有分支机构一层一层下来,或者说总公司底下有部门,有分公司,分公司底下又有部门还有办事处之类的一级一级往下走。所以组合模式应用的也是比较多的。
装饰模式
装饰模式顾名思义它就是一层一层往上面加。所以给它的一个简要说明是动态的给一个对象添加一些额外的职责,它提供了用子类扩展功能的一个灵活的替代,比派生一个子类更加的灵活。所以给他的关键字是附加职责。附加职责如何去附加呢会有一个基础的类,之后需要其他的东西又是一层一层往上面叠就可以了。你比如说有一个经典的实例就是讲到的,我们星巴克喝咖啡,那你可以考虑加奶,加糖,还可以加其他的一些东西。在这个过程中实际上就可以用到装饰模式,因为有些人要加糖,有些人要加奶,有些人既要加糖也要加奶,那就可以把这种外面的职责一层一层的给它附加上去。
外观模式
图中的简要说明什么意思呢设一个系统可以有多个边界的类,假设这一系列的边界的类,他们有着不同的职能,他们既然是边界类,那么都要跟外界进行联系,这样看上去就比较复杂。同时外界来了解你的时候也会比较复杂,因为它要跟多个这个接口类进行交互,所以相当于有多个窗口对外。这个时候有人就想到一个办法,把这个问题简化,怎么简化呢是我还是有这一堆的窗口,但是这些窗口都和一个类进行交互。这就是外观模式,它提供了一个高层的接口,为子系统的一组接口,提供了一个一致的外观。
享元模式
享元模式提供支持大量细粒度对象共享的有效方法。记得这个概念就行了。
代理模式
代理模式就是 为其他的对象提供一种代理以控制这一个对象的访问。
行为型模式
观察者模式
举个例子进行理解。比方说我们平常用到的 Excel 你在 A1 单元格里面填了个1,A2单元格里面填了个1, A3 等于 A1 加A2。那么这个时候 A3 是等于 2 ,一旦我们把 A1 的值改为 10 的时候,A3会自动的变成11,这就有观察者模式的存在。 A3 观察了A1,所以 A1 一旦发生变化,会通知 A3 让它也发生变化,这就是观察者模式。
状态模式
简要说明的意思就是会把各种状态做成相应的类,然后状态的改变就能够改变他当前可以执行的相应的行为。那这个时候咱们就只要做好状态的一个变迁,然后变迁到这种状态下,然后再做什么样的操作呢会根据当前的状态的情况,他的行为也就变化了,这种场景也比较多。比方说会员,会员会有不同的级别,它可以享受到不同的折扣。那如果说我们把不同的会员的状态级别定义成类,那么它每一种类它能够做的行为就已经做好了相应的设计。
策略模式
图中的简要说明什么意思呢如说我要对一组数进行排序,我可以用到的算法有快速排序冒泡法、归并法等多种排序方法。这个时候我可以通过设置很方便的切换,我用哪一种方法来完成排序。所以涉及到灵活的多种方案的切换的时候,你又可以用到策略模式。
模板方法
了解它的基本概念就可以了,不需要深究。
访问者模式
了解它的基本概念就可以了,不需要深究。
第十节.数据流图(DFD)
数据流图也称为 DFD 或者 分层数据流图,这是一种在需求分析阶段用到的一种工具。
数据流图这一个知识点在软考中的情况
在结构化的需求分析当中, DFD 的使用频度非常之高。所以在考试当中,数据流图是一个重点考察的知识点。数据流图的题设计方面的题在每次考试当中都会考到,而且是下午设计题当中的第一个问题,考的分值是 15 分。这种题看似是考察考生的结构化分析的能力,实际也偏实践。但事实上即便你没有相应的项目经验,只要是做过大量的练习,掌握了它基本的规则与技能,这类题是能够拿高分的。因为在考察的时候,数据流图的题考察非常之稳定,每一次考试都会问那几个问题,比方说让大家补充外部的实体,补充数据存储,补充数据流,这是非常典型的一类问题。第二类就是根据父图、子图以及题目给出的描述,让你来查找这一个数据流图有什么样的缺陷,存在什么样的问题。这里面会用到一些方法原则,由于他出题的方式比较稳定,所以这一块是我们要求要掌握好,然后在考试当中拿到一个高分的题。
具体来讲数据流图这一个知识点,我们会讲到这么一些方面的内容。
- 数据流图基本概念:在数据流图里面会涉及到哪些图形符 ,这些图形符 代表的含义是什么/li>
- 数据字典:因为数据字典是配合数据流图而存在的,它可以在数据流图里面起到相应的解释的职能。
- 数据平衡原则:数据平衡原则又分了两个分支,待会详细讲到,它是解题的时候一个非常重要的依据。
数据流图基本概念
数据流图中基本元素包括4种。
加工
什么是加工呢方说图中的 用户管理、操作管理,这些就是加工。当你把它体现在程序里面的时候,它会是一个处理过程或者说函数之类的东西,亦或是说由多个函数和处理过程组成的一个功能模块。它在我们输入了数据流之后,能够把数据进行加工处理,变换,形成新的数据流,这就是加工。加工一般会用圆形或者圆角的矩形来代表。
数据存储
数据存储就是指的我们一个应用系统往往需要把一部分的数据保存起来,下一次处理再去用它。像我们的数据库就是一个典型的数据存储,它配套应用程序来使用的。当然为了能够表达相关的一些细节,我们的数据存储的粒度往往不是以数据库为单位的,是以表为单位的。而措辞在题目里面描述往往是某某记录文件或者说某某记录表之类的,这样的措辞往往就是指的数据存储。数据存储是用双横线或者说半框形的矩形来表示的,也就是一个矩形去掉一条线。
外部实体
外部实体注意它是指软件系统之外的人员或组织,还可以是其他的系统。什么叫软件系统之外的呢比如说我们开发一个考勤系统里面有很多职能处理的一些东西,但是操作这个系统的人属于外部实体,再比如 OA 体系里面,其他系统应跟他有交互,这都属于了外部实体。外部实体往往以矩形来表示,这是数据流图的基本的组成的情况。
数据流图基本概念在软考中的情况
之所以来讲这些东西,是因为在考试的时候考得简单的时候,他也会问到以下哪一个元素不属于数据流图的基本元素。还有题目很容易给你把 ER 图和数据流图做混淆处理。比如说数据流图当中有没有联系,我们知道在E-R里面实体是有的,联系也是有的,E-R图就是实体联系图。那么联系在数据流图里面有没有呢有,只有在 ER 图里面才提到了有联系用菱形表示。所以这个图示图例以及了元素是归属于哪一种工具哪一种图当中的,我们要求搞清楚。
数据流图的分层
数据流图又称为分层数据流图。那么这个分层是如何得名呢是如何去分层的呢面我们来看一个示意图。
所以其实对于数据字典的了解,我们知道它们是干什么用的,然后再了解这些基本符 所代表的含义就可以了,是不需要去深究的。
数据流图平衡原则
平衡原则有两个维度,一个维度是父图与子图之间的平衡,另外一个维度是子图内部的平衡。
父图与子图之间的平衡
顶层图被细化形成0层图,顶层图是父图,0层图是子图。但是在细化的过程中,有部分数据流丢失或遗忘了,我们就可以利用父图与子图之间的平衡的平衡原则找出丢失或遗忘的数据流。下面我们以两个图为实例来看待这个问题。

在图一当中展示的是顶层数据流图。我们可以看到这个图当中数据管理中间件其实就是我们要开发的这一个系统,前端应用、数据管理员、后端数据库是外部实体,外部实
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!