软件质量特征:
(1)Mc Call软件质量模型:第一层是质量特征,第二层是评价准则,第三层是度量指标;
(2)ISO/IEC 9126 软件质量模型由三个层次组成:第一层是质量特征,第二层是质量子特征性,第三层是度量指标;
1.功能性(Functionality):
适应性——对规定任务能否提供一组适应任务的功能的能力。
准确性——是否能够得到正确或相符的结果的能力。
互用性——与其他规定的系统进行交互的能力。
依从性——软件是否符合相关标准、法律法规等的能力。
安全性——是否能避免对程序及数据非法访问或意外访问的能力。
2.可靠性(Reliability):
成熟性——由故障引起软件失效的频率。
容错性——在出现错误后维持规定的运行的能力。
易恢复性——在故障发生后恢复至正常状态的能力。
3.易使用性(Usability):
易理解性——用户为理解软件逻辑及应用所要付出的努力。
易学性——用户为了学习软件使用所要付出的努力。
易操作性——用户对软件进行操作和控制所要付出的努力。
4.效率(Efficiency):
时间特性——响应和处理及软件执行功能时的所需耗费的时间(吞吐量)。
资源特性——响应和处理及软件执行功能时所需耗费的资源及持续时间。
5.可维护性(Maintainability):
易分析性——为诊断缺陷或失效时所需付出的努力。
易改变性——为对软件进行修改、排错等所需付出的努力。
稳定性——对软件进行修改后造成风险或无法预期结果的频率。
易测试性——为确认软件修改是否有效所需付出的努力。
6.可移植性(Portability):
适应性——软件转移到不同环境时所需付出的努力。
易安装性——在指定环境下安装软件所需付出的努力。
一致性——软件是否符合可移植性的约定。
易替换性——软件在该环境中替代指定软件的能力。
其中,前三者又被称为内部质量,后三者称为外部质量。
第一层质量特性的含义如下:
功能性:当软件在指定条件下使用时,软件产品提供明确的和隐含要求的功能的能力;
可靠性:在指定条件下使用时,软件产品维持规定的性能水平的能力;
可使用性:在指定条件下使用时,软件产品被理解、学习、使用和吸引用户的能力;
效率:在指定条件下使用时,相对于所用资源的数量,软件产品可提供适当性能的能力;
可维护性:软件产品纠错、改进功能或适应环境、需求和功能规格说明的变化可被修改的能力;
可移植性:软件产品从一种环境迁移到另外一种环境的能力。
软件容错技术:提高软件质量和可靠性的技术大致可以分为两类,
一类是避开错误,即在开发过程中不让差错潜入软件的技术;
另一类是容错技术,即对某些无法避开的差错,使其影响减至最小的技术;
实现容错的主要首段是冗余.
冗余是指对于实现系统规定功能是多余的那部分资源,包括硬件,软件,信息和时间.
冗余技术分四类:结构冗余,信息冗余,时间冗余,附加冗余技术;
无直接耦合:两个模块之间没有直接的关系,它们从属于不同模块的控制与调用,他们之间不传递任何信息.
因此,模块间的耦合性最弱,模块的独立性最高;
数据耦合:指两个模块之间有调用关系,传递的是简单的数据值,相当于高级语言中的值传递。
标记耦合:指两个模块之间传递的是数据结构。
控制耦合:指一个模块调用另一个模块时,传递的是控制变量,被调用模块通过该控制变量的值有选择地执行模块内的某一功能。
因此,被调用模块应具有多个功能,哪个功能起作用受调用模块控制。
外部耦合:模块间通过软件之外的环境联结(如I/O将模块耦合到特定的设备、格式、通信协议上)时称为外部耦合。
公共耦合:指通过一个公共数据环境相互作用的那些模块间的耦合。
内容耦合:当一个模块直接使用另一个模块的内部数据,或通过非正常入口转入另一个模块内部时,这种模块间的耦合称为内容耦合。
偶然内聚(巧合内聚):指一个模块内的各处理元素之间没有任何联系。
逻辑内聚:指模块内执行若干个逻辑上相似的功能,通过参数确定该模块完成哪一个功能。
时间内聚:把需要同时执行的动作组合在一起形成的模块称为时间内聚模块。
过程内聚:指一个模块完成多个任务,这些任务必须按指定的过程执行。
通信内聚:指模块内的所有处理元素都在同一个数据结构上操作,或者各处理使用相同的输入数据或者产生相同的输出数据。
顺序内聚:指一个模块中的各个处理元素都密切相关于同一功能且必须顺序执行,前一功能元素的输出就是下一功能元素的输入。
功能内聚:这是最强的内聚,指模块内的所有元素共同作用完成一个功能,缺一不可。
DFD中描的是数据流而不是控制流;
有输入但是没有输出,我们称之为”黑洞”;
输入不足以产生输出,我们称之为”灰洞”;
外部实体是指存在于软件系统之外的人员或组织,他指出系统所需数据的发源地(源)和系统所产生的数据流动的归宿地(宿);
某个源和某个宿可以是同一个人员或组织; 一个加工的输出数据流不能与该加工的输入数据流同名;
父图与子图平衡是指任何一张DFD子图边界上的输入/输出数据流必须与其父图中对应加工的输入/输出流保持一致;
如果父图中某个加工的一条数据流对于子图中的几条数据流,
而子图中组成这些数据流的数据项全体正好等于父图中的这条数据流,那么他们依然是平衡的;
绑定是一个把过程调用和响应调用所需执行的代码加以结合的过程.
在一般的程序设计语言中,绑定是在编译时进行的,叫做静态绑定.
动态绑定则是在运行时进行的,因此,一个给定的过程调用和代码的结合直到调用发生时才进行;
通过实体间的关系寻找对象常常没有问题,困难在于寻找(选择)系统关心的实质性对象,实质性对象是系统稳定的基础;
经验表明,从应用定义域概念标识对象是非常合理的,完成上述工作后写出规范文档,文档确定每个对象的范围;
对象可以可以用预先开发的源代码实现,称这样的部分为构件;
(1)单一责任原则:就一个类而言,应该仅有一个引起它变化的原因。
即,当需要修改某个类的时候原因有且只有一个,让一个类只做一种类型的责任。
(2)开放封闭原则:软件实体(类、模块、函数等)应是可以扩展的,开放的;但不可修改的,即封闭的。
(3)里氏替换原则:子类型必须能够替换掉他们的基类型。
即,在任何父类可以出现的地方,都可以用子类的实例来赋值给父类型的引用。
当一个子类的实例能够替换任何其超类的实例时,它们之间才具有是一个(is-a) 关系。
(4)依赖倒置原则:抽象不应该依赖于细节,细节应该依赖于抽象。即,高层模块不应该依赖于低层模块,二者都应该依赖于抽象。
(5)接口分离原则:不应该强迫客户依赖于它们不用的方法。
接口属于客户,不属于它所在的类层次结构。
即:依赖于抽象,不要依赖于具体,同时在抽象级别不应该有对于细节的依赖。这样做的好处就在于可以最大限度地应对可能的变化。
上述(1)~ (5) 是面向对象方法中的五大原则。除了这五大原则之外,Robert c. Martin提出的面向对象设计原则还包括以下几个。
(6)重用发布等价原则:重用的粒度就是发布的粒度。
(7)共同封闭原则:包中的所有类对于同一类性质的变化应该是共同封闭的。
一个变化若对一个包产生影响,则将对该包中的所有类产生影响,而对于其他的包不造成任何影响。
(8)共同重用原则:一个包中的所有类应该是共同重用的。如果重用了包中的一个类,那么就要重用包中的所有类。
(9)无环依赖原则:在包的依赖关系图中不允许存在环,即包之间的结构必须是个直接的无环图形。
(10)稳定依赖原则:朝着稳定的方向进行依赖。
(11)稳定抽象原则:包的抽象程度应该和其稳定程度一致。
类的实例化过程是一种实例的合成过程,而不仅仅是根据单个类型进行的空间分配、初始化和绑定。类属类可以看成是类的模板;
0OPL中的继承机制体现了一条重要的面向对象程序设计原则:开发人员在构造程序时不必从零开始,而只需对差别进行程序设计。
支持维承也是0OPL与传统程序设计语言在语言机制方面最根本的区别。
一般情况下,对象接收它能够识别的消息,拒绝它不能识别的消息。
对于一个对象而言,任何外部的代码都不能以任何不可预知或事先不允许的方式与这个对象进行交互。
通常,消息的名字就是这个对象中外界可知的某个方法的名字。
在消息中,经常还有一组参数(也就是那个方法所要求的参数),将外界的有关信息传给这个对象。
单元测试是系统构件的分体测试。
将测试好的系统构件接起来看它们之间相互作用的正确性称为综合测试。
最后是整个系统的测试,包括软件系统所在相关环境的测试。
综合测试尽可能在早期阶段处理,因为通信是系统开发的实质。
所有对象有预定义的界面,这也有利于综合测试。
当综合测试继续到较高层次时,那么越来越多的对象就会被逐步连接起来。
面向对象的综合测试是由底向上的测试。
在图形上,把一个消息表示为一条有向直线,通常在表示消息的线段上总有操作名;
状态表示为一个圆角矩形,通常在圆角矩形中含有状态的名称及其子状态。
活动是描述计算机过程执行的步骤序列,注重步骤之间的流而不关心哪个对象执行哪个步骤。
活动的一个步骤称为一个动作。
在图形上,把动作画成一个圆角矩形,在其中含有指明其用途的名字。
状态和动作靠不同的语境得以区别。
类图展现了一组对象,接口,协作和他们之间的关系;
对象图展现了某一时刻一 组对象以及它们之间的关系,描述了在类图中所建立的事物的实例的静态快照。
用例图(Use Case Diagram)展现了一组用例、参与者(Actor) 以及它们之间的关系。
用例之间的扩展关系(<
参与者和用例之间的关联关系,用例与用例以及参与者与参与者之间的泛化关系。
交互图用于对系统的动态方面进行建模。
一张交互图表现的是一个交互,由一组对象和它们之间的关系组成,包含它们之间可能传递的消息。
序列图是强调消息时间顺序的交互图;通信图是强调接收和发送消息的对象的结构组织的交互图:交互概览图强调控制流的交互图。
序列图是场景的图形化表示,描述了以时间顺序组织的对象之间的交互活动;
通信图强调收发消息的对象的结构组织,在早期的版本中也被称作协作图,通信图强调参加交互对象的组织;
状态图展现了一个状态机,它由状态,转换,事件和活动组成.状态图关注系统的动态视图,
对于接口,类和协作的行为建模尤为重要,强调对象行为的事件顺序;
创建型模式与对象的创建相关;结构型模式处理类或对象的组合;行为模式对类或对象怎样交互和怎样分配职责进行描述;
创建型模式抽象了实例化过程,他们帮助一个系统独立于如何创建,组合和表示它的那些对象;
1.Abstract Factory(抽象工厂):提供一个创建一系列相关或相互依赖对象的接口,而无需指定他们具体的类;
2.Builder(生成器):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示;
3.Factory Method(工厂方法):定义一个用于创建对象的接口,让子类决定实例化哪一个类;
4.Prototype(原型):用原型实例指定创建对象的种类,并且通过复制这些原型对象创建新的对象;
5.Singleton(单例):保证一个类仅有一个实例,并提供一个访问它的全局访问点;
结构型设计模式涉及如恶化组合类和对象以获得更大的结构.结构型类模式采用继承机制来组合接口或实现;
1.Adapter(适配器):将一个类的接口转换成客户希望的另一个接口.使得原本因接口不兼容而不能一起工作的那些类可以一起工作;
2.Bridge(桥接):将抽象部分与实现部分分离,使他们都可以独立地变化;
3.Composite(组合):将对象组合成树形结构以表示”整体-部分”的层次结构;
4.Decorator(装饰):动态地给一个对象添加一些额外的职责.就增加功能而言,装饰模式比生成子类更加灵活;
5.Facade(外观):为子系统中的一组接口提供一个一致的界面,外观模式定义了一个高层接口,使得这一子系统更加容易使用;
6.Flyweight(享元):运用共享技术有效地支持大量细粒度对象;
7.Proxy(代理):为其他对象提供一种代理以控制这个对象的访问;
行为设计模式设计算法和对象间职责的分配.行为模式不仅描述对象或类的模式,还描述他们之间的通信模式.
1.Chain of Responsibility(责任链):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系;
2.Command(命令):将一个请求封装为一个对象,从而使得可以用不同的请求对客户进行参数化;
3.Interpreter(解释器):给定一个语言,定义它的文法的一种表示,并定义一个解释器,这个解释器使用该表示来解释语言中的句子;
4.Mediator(中介者):用一个中介对象来封装一系列的对象交互.
中介者使各个对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变他们之间的交互;
5.Memento(备忘录):在不破坏封装性的前提下捕获一个对象的内部状态,并在对象之外保持这个状态.
这样以后就可以将对象恢复到原先保存的状态;
6.Observer(观察者):定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新;
7.State(状态):允许一个对象在其内部状态发生改变时改变他的行为.对象看起来似乎修改了它的类.
8.Strategy(策略):定义一系列算法,把他们一个个封装起来,并且使他们可以相互替换.使得算法可以独立于使用他们的客户而变化;
9.Template Method (模板方法):定义一个操作中的算法骨架,而将一些步骤延迟到子类中。
模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
10.Visitor(访问者):表示一个作用于某对象结构中的各元素的操作。它允许在不改变各元素的类的前提下定义作用于这些元素的新操作。
递归由两个基本要素:边界条件,即确定递归到何时终止,也称为递归出口;
递归模式,即大问题是如何分解成小问题的,也成为递归体;
分治法的设计思想时将一个难以直接解决的大问题分解成一些规模较小的相同问题,以便各个击破,分而治之;
动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。
与分治法不同的是,适合用动态规划法求解的问题,经分解得到的子问题往往不是独立的。
若用分治法来解这类问题,则相同的子问题会被求解多次,以至于最后解决原问题需要耗费指数级时间。
然而,不同子问题的数目常常只有多项式量级。
如果能够保存已解决的子问题的答案,在需要时再找出已求得的答案,这样就可以避免大量的重复计算,从而得到多项式时间的算法。
为了达到这个目的,可以用一个表来记录所有已解决的子问题的答案。
不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。
动态规划算法通常用于求解具有某种最优性质的问题。
在这类问题中,可能会有许多可行解,每个解都对应于一个值,我们希望找到具有最优值(最大值或最小值)的那个解。
当然,最优解可能会有多个,动态规划算法能找出其中的一个最优解。
若其具有以下两个性质可以考虑用动态规划法来求解:最优子结构,重叠子问题;
贪心法在解决问题的策略上是仅根据当前已有的信息做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变.
贪心法并不是从整体最优考虑,他所做出的选择只是在某种意义上的局部最优;
不能保证总能获得全局最优解,但通常能得到较好的近似最优解;
一般具有两个重要性质:最优子结构,贪心选择性质;
回溯法有“ 通用的解题法”之称,用它可以系统地搜索一个问题的所有解或任一解。
回溯法在用来求问题的所有解时要回溯到根,且根结点的所有子树都已被搜索遍才结束;
而用来求问题的任一解时,只要搜索到问题的一个解就可以结束。
这种以深度优先的方式系统地搜索问题的解的方法称为回溯法,它适用于解一些组合数较大的问题。
回溯法的求解目标是找出T中满足约束条件的所有解,
而分支限界法的求解目标是找出满足约束条件的一个解,
或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
伪代码是介于自然语言和程序设计语言之间的方法,它采用某一程序设计语言的基本语法,同时结合自然语言来表达;
数据库系统是存储信息的系统,数据库管理系统是数据管理软件,数据库是数据的仓库或容器;
数据的独立性是指数据与程序独立,将数据的定义从程序中分离出去,由DBMS负责数据的存储,
应用程序关心的只是数据的逻辑结构,无须了解数据在磁盘上的数据库中的存储形式,
从而简化应用程序,大大减少了应用程序编制的工作量。
数据恢复的原理非常简单,就是要建立冗余(Redundancy)数据。
换句话说,确定数据库是否可恢复的方法就是其包含的每一条信息是否都可以利用冗余存储在别处的信息重构。
冗余是物理级的,通常认为逻辑级是没有冗余的。
ODBC (开放式数据库互连)和JDBC(Java程序数据库连接)标准定义了应用程序和数据库服务器通信的方法,
即定义了应用程序接口,应用程序用它来打开与数据库的连接、发送查询和更新以及获取返回结果等。
共享内存访问问题会随着CPU个数的增加变得难以解决;
数据库有”型”和”值”的概念,”型”是指对某一数据的结构和属性的说明,”值”是型的一个具体赋值;
概念模式反映的是数据库的结构及其联系,所以是相对稳定的;而实例反映的是数据库某一时刻的状态,所以是相对变动的。
需要说明的是,概念模式不仅要描述概念记录类型,还要描述记录间的联系、操作以及数据的完整性和安全性等要求。
但是,概念模式不涉及存储结构、访问技术等细节。只有这样,概念模式才算做到了“物理数据独立性”。
内部记录并不涉及物理记录,也不涉及设备的约束。
它比内模式更接近于物理存储和访问的那些软件机制,是操作系统的一部分(即文件系统)。
数据按外模式的描述提供给用户,按内模式的描述存储在磁盘上,
而概念模式提供了连接这两级模式的相对稳定的中间层,并使得两级中任意一级的改变都不受另一级的影响。
全码(All-Key).关系类型的所有属性组是这个关系模式的候选码,称为全码;
完整性规则防止的是对数据的意外破坏;
关系R与S的差是由属于R但不属于S的元组构成的集合; R-S;
投影Π:关系R中选出若干属性列A组成新的关系;
连接θ:从R与S的笛卡尔积中选取属性间满足一定条件的元组;
等值连接。当θ为“=”时,称之为等值连接,记为R⋈S;
自然连接。自然连接是一种特殊的等值连接,
它要求两个关系中进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉,记为R⋈S;
需要特别说明的是,一般连接是从关系的水平方向运算,而自然连接不仅要从关系的水平方向运算,
而且要从关系的垂直方向运算因为自然连接要去掉重复属性,如果没有重复属性,那么自然连接就转化为笛卡儿积。
R÷S应当满足在X上的分量值x的象集YX包含关系S在属性组Y上投影的集合;
左外连接。取出左侧关系中所有与右侧关系中任一元组都不匹配的元组,
用空值null填充所有来自右侧关系的属性,构成新的元组,将其加入自然连接的结果中。
右外连接。取出右侧关系中所有与左侧关系中任一元组都不匹配的元组,
用空值null填充所有来自左侧关系的属性,构成新的元组,将其加入自然连接的结果中。 全外连接:完成左外连接和右外连接的操作;
字符串匹配运算符 LIKE 与_和%进行单个,任意个字符匹配;若涉及两个以上的表,则成为连接查询;
元组含有空值时:空值在任何聚集操作中被忽视. NULL值又可以在分组属性中看作是一个一般的值;
SQL提供了可为关系和属性重新命名的机制,这是通过使用AS子句来实现的;
规范化:将一个第一级范式的关系模式转换成若干个高一级范式的关系模式,这个过程称之为规范化;
1NF:若关系模式R中的每一个分量是一个不可再分的数据项,则关系莫斯R属于第一范式;
冗余度大; 引起修改操作的不一致性; 插入异常; 删除异常;
2NF:当1NF消除了非主属性对码的部分函数依赖,则成为2NF;
3NF:当2NF消除了非主属性对码的传递函数依赖,则成为3NF;
3NF的模式必是2NF的模式。产生冗余和异常的两个重要原因是部分依赖和传递依赖。
因为3NF模式中不存在非主属性对码的部分函数依赖和传递函数依赖,所以具有较好的性能。
备份方法:静态转储和动态转储; 海量转储和增量转储.日志文件;
海量转储是指每次转储全部数据;增量转储是指每次只转储上次转储后更新过的数据;
并发操作带来的数据不一致性有三类:丢失修改,不可重复读和读脏数据;
两段封锁协议:是指所有事务必须分两个阶段对数据项加锁和解锁。
即事务分两个阶段,第一阶段是获得封锁,事务可以获得任何数据项上的任何类型的锁,但不能释放:
第二阶段是释放封锁,事务可以释放任何数据项上的任何类型的锁,但不能申请。
封锁的粒度:封锁对象的大小称为封锁的粒度。
封锁的对象可以是逻辑单元(如属性、元组、关系、索引项、整个索引甚至整个数据库),
也可以是物理单元(如数据页或索引页)。
中继器(实现物理层协议转换,在电缆间转发二进制信号)、
网桥(实现物理层和数据链路层协议转换)、
路由器(实现网络层和以下各层协议转换)、
网关(提供从最低层到传输层或以上各层的协议转换)和交换机等。
物理层的互连设备有中继器和集线器;
数据链路层的互连设备有网桥和交换机;
路由器是网络层的互连设备,用于连接多个逻辑上分开的网络;通常把网络层地址信息称为网络逻辑地址,把数据链路层地址信息称为物理地址;
网关是应用层的互连设备;
家庭拨号上网就是通过PPP在用户端和运营商的接入服务器之间建立通信链路;
X.25 是在公用数据网上以分组方式进行操作的DTE (数据终端设备)和DCE (数据通信设备)之间的接口,
X.25只是对公用分组交换网络的接口规范说明,并不涉及网络的内部实现,
它是面向连接的,支持交换式虚电路和永久虚电路。
IP所提供的服务通常被认为是无连接的和不可靠的,与此相对应的就是面向连接的传输(如TCP);
IP的主要功能包括将上层数据(如TCP、UDP数据)或同层的其他数据(如ICMP数据)封装到IP数据报中;将IP数据报传送到最终目的地;
为了使数据能够在链路层上进行传输,对数据进行分段;确定数据报到达其他网络中的目的地的路径。
地址解析协议(Address Resolution Protocol, ARP) 及反地址解析协议(RARP)是驻留在网际层中的另一个重要协议。
ARP的作用是将IP地址转换为物理地址,RARP的作用是将物理地址转换为IP地址。
IP地址短缺的问题使用具有更大地址空间的IPv6协议;