软件构造期末总结

目录

  • 考点
  • 第三章
    • 3.1 类型检查
      • 静态类型检查
      • 动态类型检查
      • 代码快照图
      • Immutability
    • 3.2 Specification(规格说明)
      • 防御式拷贝
      • 行为等价性
      • 前置条件 后置条件
      • 规约的强度
    • 3.3 Abstrate Data Type(ADT)
      • ADT 操作的四种类型
      • Representation Independence(表示独立性)(待完成,44页)
      • RA
      • AF:R->A
  • 第五章 (可复用性的度量、形态与外部表现)
    • Programing for/with reuse
    • 设计模式
      • 白盒框架的原理与实现
      • 黑盒框架的原理与实现
    • Liskov Substitution Principle (LSP)
    • type erasure 类型擦除
    • Delegation
  • 第六章(可维护性的度量与构造原则)
    • 雨课堂题目
    • 可维护性
    • 模块化编程
    • OO Design Principles: SOLID
    • 设计模式
  • 第七章
    • Unchecked exceptions
    • checked exceptions
  • 第十章
    • 交错
    • Race Condition
    • interleaving

考点

若干种设计模式
线程安全的策略
四种GC策略
多态:LSP原则,泛型,重载和重写。

第三章

考点图:
软件构造期末总结_第1张图片

3.1 类型检查

静态类型检查

语法错误,类名 / 函数名错误 ,参数数目错误,参数类型错误 ,返回值类型错误

动态类型检查

非法的参数值 ,非法的返回值 ,越界 ,空指针。

代码快照图

描述程序运行时内存里变量层面的状态。
参考链接:https://www.cnblogs.com/zdj-/p/8494316.html

  • 基本类型的值。原始值由常量表示。 传入箭头是对变量或对象字段中的值的引用。
    在这里插入图片描述
  • 对象类型的值。对象值是由其类型标记的圆圈。 我们在其中写入字段名称,箭头指向它们的值。字段可以包括其声明的类型。
    软件构造期末总结_第2张图片
  • 不可变对象:用双线椭圆
    软件构造期末总结_第3张图片
  • 可变对象:用一个椭圆
    软件构造期末总结_第4张图片
  • 不可变的引用:用双线箭头(引用是不可变的,但指向的值却可以是可变的;可变的引用,也可指向不可变的值)
    软件构造期末总结_第5张图片
  • 引用是不可变的,但指向的值却可以是可变的。例如:: final StringBuilder sb
  • 可变的引用,也可指向不可变的值。例如:String s1 = new String(“abc”)。
    软件构造期末总结_第6张图片软件构造期末总结_第7张图片

Immutability

  • final类无法派生子类
  • final类无法改变值/引用
  • final方法无法被子类重写
    软件构造期末总结_第8张图片
    | immutable |mutable |
    |–|--|
    | String| StringBuilder |
    ||List|

使用mutable类型的风险,前后打印出的结果相同。
软件构造期末总结_第9张图片
groundhogAnswer与partyDate引用相同,更改了partyDate,groundhogAnswer也将随之更改。
软件构造期末总结_第10张图片

3.2 Specification(规格说明)

防御式拷贝

  • 通过防御式拷贝,给客户端返回一个全新的 Date 对象在这里插入图片描述
  • 安全的使用可变类型:局部变量,不会涉及共享;只有一个引用

行为等价性

判断两个函数实现是否可相互替换。站在客户端视角看行为等价性。
根据规约判断是否行为等价,如果两个函数符合这个规约则等价。

前置条件 后置条件

requires effects
软件构造期末总结_第11张图片
在规范中,前置条件和后置条件的某些部分可以在@param和@return子句之外的其他位置找到,因此必须仔细阅读。
对于可变函数
除非在后置条件里声明过,否则方法内部不应该改变输入参数
避免使用可变的全局变量,但是为了性能原因,有时候却不得不用。这对程序的安全性造成了巨大破坏。
软件构造期末总结_第12张图片

规约的强度

3.3 Abstrate Data Type(ADT)

可变类型的对象:提供了可改变其内部数据的值的操作。
不变数据类型: 其操作不改变内部值,而是构造新的对象。

ADT 操作的四种类型

  • 构造器 Creators create new objects of the type.
    创建该类型的新对象
  • 生产器 Producers create new objects from old objects of the type.
    从该类型的旧对象创建新对象
  • 观察器 Observers take objects of the abstract type and return objects of a different type.
    获取抽象类型的对象并返回不同类型的对象。
  • 变值器 Mutators change objects.
    改变对象
    软件构造期末总结_第13张图片

Representation Independence(表示独立性)(待完成,44页)

  • 不变量
    软件构造期末总结_第14张图片
  • Defensive copying(在return和构造器中)
    在这里插入图片描述软件构造期末总结_第15张图片
    当复制代价很高时,可以增加spec
    软件构造期末总结_第16张图片
  • Rep Invariant
    R相同,AF相同,RI可以不同
  • Abstraction Function

RA

ADT 开发者关注表示空间 R , client 关注抽象空间 A。
软件构造期末总结_第17张图片软件构造期末总结_第18张图片

AF:R->A

第五章 (可复用性的度量、形态与外部表现)

Programing for/with reuse

White box reuse 白盒复用:源代码可见,可修改和扩展
Black box reuse 黑盒复用:源代码不可见,不能修改
delegation 委托
显式委派:将发送对象传递给接收对象
隐式委托:由语言的成员查找规则
(Framework)框架:可重复使用的框架代码,可以自定义到应用程序中。一组具体类、抽象类、及其之间的连接关系。

设计模式

Adapter
shape是目标对象
Rectangle是适配器
LegacyRectangle是被适配对象
软件构造期末总结_第19张图片
Decorator
Display类是抽象类,被装饰物与装饰物的抽象父类,这样保持了两者之间的一致性。
StringDisplay类是被装饰者类,具体类
Border类是装饰物的抽象类
(deligation是声明了在class类中使用了被委托的类型的变量,并调用该类型变量的方法,而继承没有)
参考链接:https://blog.csdn.net/zoinsung_lee/article/details/82771581
软件构造期末总结_第20张图片
factory method 设计模式
抽象工厂类:工厂的抽象类实现
具体工厂类:一个工厂生产一类产品
软件构造期末总结_第21张图片
abstract factory(产品族)
抽象工厂类:工厂的抽象类实现
抽象产品类:产品的抽象类实现
具体产品类:
具体工厂类:一个工厂创建多个不同类型的产品。具体产品与具体工厂之间通过deligation联系。
软件构造期末总结_第22张图片
builder 设计模式
软件构造期末总结_第23张图片
Builder:抽象建造类,用于规范产品的各个组成部分,并进行抽象。
ConcreteBuilder:具体建造类,实现抽象类中的所有方法并返回一个产品实例。
Product:builder要返回的多个产品类
Director:安排一有模块的顺序,并且告诉builder开始建造

Iterator
Iterator(迭代器接口):该接口必须定义实现迭代功能的最小定义方法集,比如提供hasNext()和next()方法。
ConcreteIterator(迭代器实现类): 比如BookShelfIterator,迭代器接口Iterator的实现类。可以根据具体情况加以实现。
Aggregate(容器接口):定义基本功能以及提供类似Iterator iterator()的方法。
ConcreteAggregate(容器实现类): 比如BookShelf,容器接口的实现类。必须实现Iterator iterator()方法。
软件构造期末总结_第24张图片
参考链接:https://blog.csdn.net/xw13106209/article/details/6912873
软件构造期末总结_第25张图片
Strategy
AthContext:外部环境类,实现create()方法
Strategy类:抽象类,策略实现接口
ConcreteStrategy类:具体类

state 和 memento 设计模式

Facade(外观模式)
(电脑)
软件构造期末总结_第26张图片
参考链接:https://blog.csdn.net/bifuguo/article/details/81432774

visitor设计模式
Visitor类:存放要访问的对象
Myvisitor类:针对不同子类型的subject类,分别实行visitor操作
Subject类:accept()方法,与特定的visitor子类联系起来,允许其对自己的数据进行操作。
软件构造期末总结_第27张图片
软件构造期末总结_第28张图片
observer模式
Subject:被观察者的抽象类,定义增加和删除观察者对象的操作。声明了获取当前状态的方法,如果MySubject发生变化,会通知所有需要监控的对象。
MySubject:如果MySubject发生变化,会通知所有需要监控的对象。
Observer:观察者的抽象类。声明了update方法,负责接收来自Subject角色的状态变化通知。
Observer1:依赖于MySubject的对象,表示具体的Observer,当update执行后会获取观察对象的最新的状态
Observer2:依赖于MySubject的对象,表示具体的Observer,当update执行后会获取观察对象的最新的状态
软件构造期末总结_第29张图片
//proxy、bridge、composite,template、mediator 等设计模式
Flyweight设计模式
Prototype 设计模式

用 Singleton 和 Object Pool 设计模式
(canonicalization 的思想)

白盒框架的原理与实现

通过继承和动态绑定实现的可扩展性
template method pattern

黑盒框架的原理与实现

通过为可以插入框架的组件定义接口来实现可扩展性
通过定义符合特定接口的组件来重用现有功能
这些组件通过委派与框架集成

Liskov Substitution Principle (LSP)

  • 子类型可以增加方法,但不可删
  • 子类型需要实现抽象类型中的所有未实现的方法
  • 子类型中重写的方法不能抛出额外的异常
  • 子类型中重写的方法必须有相同或子类型的返回值类型或者符合co-variance的参数
  • 子类型中重写的方法必须有相同的参数类型或者符合co-variance的参数

更强的不变量
更弱的前置条件
更强的后置条件

前置条件越弱,后置条件越强,spec强度越强。

type erasure 类型擦除

软件构造期末总结_第30张图片

Delegation

关联 依赖 聚合 组合
软件构造期末总结_第31张图片

第六章(可维护性的度量与构造原则)

雨课堂题目

https://blog.csdn.net/JAck_chen0309/article/details/92803893

是否使用了delegation 替代继承?

可维护性

纠错性,适应性,完善性,预防性。
软件的大部分成本来自于维护阶段。
软件维护不仅仅是运维工程师的工作,而是从设计和开发阶段就开始了。

模块化编程

高内聚,低耦合,分离关注点,信息隐藏。
Collections.unmodifiableList或unmodifiableSet就是将一个List或Set进行包装,返回一个不可修改的List或者Set,如果调用修改方法就会抛出java.lang.
UnsupportedOperationException异常。

OO Design Principles: SOLID

单一责任原则(Single Responsibility Principle):不应该有多于 1 个原因让你的 ADT 发生变化,否则就拆分开
(面向变化的)开放 / 封闭原则:
对扩展性的开放:( 模块的行为应是可扩展的,从而该模块可表现出新的行为以满足需求的变化)
对修改的封闭: 但模块自身的代码是不应被修改的, 扩展模块行为的一般途径是修改模块的内部实现, 如果一个模块不能被修改,那么它通常被认为是具有固定的行为。
Liskov 替换原则(LSP)
子类型必须能够替换其基类型
接口隔离原则:不能强迫客户端依赖于它们
不需要的接口:只提供必需的接口
依赖转置原则:抽象的模块不应依赖于具体的模块, 具体应依赖于抽象。

设计模式

1.工厂方法模式(一个工厂,多个产品)
软件构造期末总结_第32张图片
Creator?
2.抽象工厂模式(多个工厂,一个工厂只对应一个产品)
3.构造器模式(一个产品,有多个属性,每个具体类的多个属性不一样)
软件构造期末总结_第33张图片
设计模式:Abstract Factory vs Builder
Abstract Factory 创建的是一个“产品族”,有多个不同产品组成。
Builder 创建的是一个完整的产品,有多个部分组成。
4.Bridge(桥接模式)
软件构造期末总结_第34张图片
软件构造期末总结_第35张图片

Bridge structural pattern 强调双方的 run time delegation linking
Strategy behavioral pattern 强调一方 run-time 使用另一方的“算法”

5.Strategy

6.Proxy(代理模式)
软件构造期末总结_第36张图片
7.(不重要)Composite(组合模式)
软件构造期末总结_第37张图片

Composite 目的是在同类型的对象之间建立起树型层次结构,一个上层对象可包含多个下层对象
Decorator 强调的是同类型对象之间的“特性增加”问题,它们之间是平等的,区别在于 “拥有特性”的多少

8.Observer pattern
软件构造期末总结_第38张图片
9.Visitor Pattern
对特定类型的 object 的特定操作 (visit) ,在运行时将二者动态绑定到一起,该操作可以灵活更改,无需更改被 visit 的类。
10.Mediator Pattern
11.Command pattern

第七章

Unchecked exceptions

例如:ArrayIndexOutOfBoundsException, NullPointerException,NumberFormatException,ClassCastException,NumberFormatExceptio,ClassCastException, IllegalArgumentException,IllegalStateException,NoClassDefFoundError
软件构造期末总结_第39张图片

checked exceptions

需要从 Exception 派生出子类型(除了Runable及其派生的子类)
软件构造期末总结_第40张图片

第十章

交错

软件构造期末总结_第41张图片

Race Condition

程序的正确性(后置条件和不变量的满足)取决于并发计算线程A和B中事件的相对时间。
调整代码无用。这三个版本是都存在race condition。
软件构造期末总结_第42张图片
消息传递机制也无法解决竞争条件问题。

interleaving

利用某些方法调用来主动影响线程之间的 interleaving 关系。

for (int i = 0; i < n; i++) {
//Pause for 4 seconds
Thread.sleep(4000);
//Print a message
System.out.println(msg[i]);
}

Thread.yield() 使用该方法,线程告知调度器:我可以放弃 CPU 的占用权,从而可能引起调度器唤醒其他线程。
软件构造期末总结_第43张图片
Thread.join() 让当前线程保持执行,直到其执行结束。
软件构造期末总结_第44张图片

你可能感兴趣的:(软件构造)