1. 考核重点概要
2. 第一,三讲
2.1软件构造的多维度视图
- 按阶段划分:构造时/运行时视图
- 按动态性划分:时刻/阶段视图
- 按构造对象划分:代码/组件视图
2.2软件构造的阶段划分、各阶段的构造活动
2.2.1 Build - time views
Code-level view:代码的逻辑组织(functions,classes,methods,interface)考虑类似多少个类,类中有什么结构等问题
Component-level view:代码的物理组织(files,directories,packages,libraries)
Moment view:特定时刻的软件形态
Period view:软件形态随时间的变化
2.2.2 Run-time Views
Runtime:程序被载入目标辑器,开始执行
Code-level view:逻辑实体在内存中如何呈现。即在某个时间点有多少个对象,对象里有什么?
Component-level view:物理实体在物理硬件环境中如何呈现
Moment view:逻辑/物理实体在内存/硬件环境中特定时刻的形态如何?
Period view:逻辑/物理实体在内存/硬件环境中的形态随时间如何变化?
2.3 内部/外部的质量指标
外部质量因素影响用户。
内部质量因素影响软件本身和它的开发者
外部质量取决于内部质量
2.3.1外部质量因素
- Correctness:最重要的质量指标
1)测试和调试:发现不正确、消除不正确
2)防御式编程:在写程序的时候就确保正确性
3)形式化方法:通过形式化验证发现问题→通过数学证明 - Robustness:针对异常情况的处理(健壮性是对正确性的补充)
1)“normal”和“abnormal”是主观而非客观
2)所谓的“异常”,取决于spec的范畴 - Extendibility/可扩展性:对软件的规约进行修改,是否足够容易
- Reusability:一次开发,多次使用。发现共性,避免重复实现
- Compatibility/兼容性:不同的软件系统之间相互可容易的集成
- Efficiency:效率是软件系统对硬件资源尽可能少的需求的能力。过度的优化导致软件不再适应变化和复用
- Portability/可移植性:软件可方便在不同的技术环境之间移植
- Easy of use
- Functionality
- Timeliness/时效性:规定时间内做出产品
- Verifiability/可验证性
- Integrity/完整性:软件系统保护其各种组件(程序和数据)免受未经授权的访问和修改的能力
- Repairability/可修复性
- Economy
2.3.2内部质量因素
- LOC:代码行数
- Complexity
- coupling:耦合度
- cohesion:内聚度
- Readability/可读性
- Understandability
- Clearness
- size
2.4 软件配置管理SCM与版本控制系统VCS
2.4.1 SCM
软件配置管理:追踪和控制软件的变化
核心:版本控制和基线的确立
软件配置项SCI:软件中发生变化的基本单元(例如:文件)
基线:软件持续变化过程中的“稳定时刻”(例如:对外发布的版本)
CMDB:配置管理数据库(存储软件的各配置项随时间发生变化的信息+基线)
2.4.2 VCS
- 本地版本控制系统:仓库存储于开发者本地机器,无法共享和合作
- 集中式版本控制系统:仓库存储于独立的服务器,支持多开发者之间的协作
- 分布式版本控制系统:仓库存储于:独立的服务器 + 每个开发者的本地机器
2.5 Git
结构:
- 本地的CMDB
- 工作目录:本地文件系统
- 暂存区:隔离工作目录和git仓库
Git的所有操作都是在一个图数据结构(对象图)上进行。
对象图/Object Graph:版本之间的演化关系图,一条边A→B表征了“在版本B的基础上作出变化,形成了版本A”
基本指令:
- 添加文件:git add xxx.xxx
- 提交文件:git commit -m “2021.7.8”
- push到远程仓库:git push -u origin master
- 从远程仓库pull:git pull origin master
- 新建分支:git checkout -b branch_name
- 切换分支:git checkout branch_name or git checkout master
- 选择一个分支与当前分支合并:git merge branch_name1
3. 第4-8讲
3.1Mutable/Immutable
Mutable类型变量
概念:
可变类型的对象:提供了可以改变其内部数据值的操作,其内部的值可以被重新更改。
Immutable类型变量
概念:
Immutable :
不可变数据类型:其内部的操作不会改变内部的值,一旦试图更改其内部值,将会构造一个新的对象而非对原来的值进行更改。
mutable | immutable | |
优点 | 可变类型会减少数据的拷贝次数,从而其效率 要高于immutable | 由于内部数据不可变,所以对其频发修改会产生大量的临时拷贝,浪费空间 |
缺点 | 可变类型由于其内部数据可变,所以其风险更大 | 内部数据的不可变导致其更加安全,可以用作多线程的共享对象而不必考虑同步问题 |
3.2 表示泄露和防御式拷贝
通过防御式拷贝,给客户端返回一个全新的对象(副本),客户端即使对数据做了更改,也不会影响到自己。
大部分时候该拷贝不会被客户端修改,可能造成大量的内存浪费
如果使用不可变类型,则节省了频繁复制的代价
3.3 Spec
客户端与开发者的规约
- 方法注释
@param
@return
@throws
输入类型、返回类型
前置条件:对客户端的约束,在使用方法是必须满足的条件
后置条件:对开发者的约束,方法结束时必须满足的条件
3.4 ADT操作的四种类型
见网址
ADT的四种操作:Creator Producer Observer Mutator_长齐克斯的博客-CSDN博客
3.5 RI、AF、A
见网址
https://blog.csdn.net/weixin_43197820/article/details/105195149?spm=1001.2014.3001.5501
https://blog.csdn.net/weixin_43197820/article/details/105203543?spm=1001.2014.3001.5501
https://blog.csdn.net/weixin_43197820/article/details/105204113?spm=1001.2014.3001.5501
3.6 override与overload
继承
继承的概念
继承是java面向对象编程技术的一块基石,因为它允许创建分等级层次的类。
继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。
继承的特性
-
子类拥有父类非 private 的属性、方法。
-
子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。
-
子类可以用自己的方式实现父类的方法。
-
Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类,多重继承就是,例如 B 类继承 A 类,C 类继承 B 类,所以按照关系就是 B 类是 C 类的父类,A 类是 B 类的父类,这是 Java 继承区别于 C++ 继承的一个特性。
-
提高了类之间的耦合性(继承的缺点,耦合度高就会造成代码之间的联系越紧密,代码独立性越差)。
多态
多态是同一个行为具有多个不同表现形式或形态的能力。
多态就是同一个接口,使用不同的实例而执行不同操作
多态存在的三个必要条件
- 继承
- 重写
- 父类引用指向子类对象:Parent p = new Child();
override
-
参数列表与被重写方法的参数列表必须完全相同。
-
返回类型与被重写方法的返回类型可以不相同,但是必须是父类返回值的派生类(java5 及更早版本返回类型要一样,java7 及更高版本可以不同)。
-
访问权限不能比父类中被重写的方法的访问权限更低。例如:如果父类的一个方法被声明为 public,那么在子类中重写该方法就不能声明为 protected。
-
父类的成员方法只能被它的子类重写。
-
声明为 final 的方法不能被重写。
-
声明为 static 的方法不能被重写,但是能够被再次声明。
-
子类和父类在同一个包中,那么子类可以重写父类所有方法,除了声明为 private 和 final 的方法。
-
子类和父类不在同一个包中,那么子类只能够重写父类的声明为 public 和 protected 的非 final 方法。
-
重写的方法能够抛出任何非强制异常,无论被重写的方法是否抛出异常。但是,重写的方法不能抛出新的强制性异常,或者比被重写方法声明的更广泛的强制性异常,反之则可以。
-
构造方法不能被重写。
-
如果不能继承一个类,则不能重写该类的方法。
overload
- 被重载的方法必须改变参数列表(参数个数或类型不一样);
- 被重载的方法可以改变返回类型;
- 被重载的方法可以改变访问修饰符;
- 被重载的方法可以声明新的或更广的检查异常;
- 方法能够在同一个类中或者在一个子类中被重载。
- 无法以返回值类型作为重载函数的区分标准。
区别点 | 重载方法 | 重写方法 |
---|---|---|
参数列表 | 必须修改 | 一定不能修改 |
返回类型 | 可以修改 | 一定不能修改 |
异常 | 可以修改 | 可以减少或删除,一定不能抛出新的或者更广的异常 |
访问 | 可以修改 | 一定不能做更严格的限制(可以降低限制) |
4. 第9-11讲
4.1 LSP
一句话概括:就是基类指针可以在任何不知道衍生类的条件下使用衍生类的对象。
详细说明:就是要确保在父类使用的时候,(无论这时候的父类实际上是哪一种衍生类),表现都是一样的。也就是说,使用者在书写代码使用该类时无需关注与考虑有什么衍生类,以及本次是什么衍生类。
4.2 协变与逆变
父类型 → 子类型:
协变:返回值和异常不变或越来越具体
逆变(反协变):参数类型要相反地变化,要不变或越来越抽象
4.3 黑盒白盒复用
4.4 SOLID
SRP 单一责任原则
责任:变化的原因 不应有 多于1个的原因使得一个类发生变化
一个类,一个责任
OCP 开发-封闭原则
对扩展性的开放:
模块的 行为应是可扩展的,从而该模块可表现出新的行为以满足需求的变化
对修改的封闭:
但模块自身的代码是不应被修改的;扩展模块行为的一般途径是修改模块的内部实现;如果一个模块不能被修改,那么它通常被认为是具有固定的行为
LSP liskov替换原则
子类型必 须能够替换其基类型
派生类必须 能够通过其基类的接口使用,客户端无需了解二者之间的差异
DIP 依赖转置原则
抽象的模块不应依赖于具体的模块
抽象的模块不应依赖于具体的模块
ISP 接口聚合原则
不能强迫客户端依赖于它们不需要的接口:只提供必需的接口
客户端不应依赖于它们不需要的方法
5. 第2-12讲
5.1 Throwable
Error:内部错误:程序员通常无能为力,一旦发生,想办法让程序优雅的结束
Exception :异常:你自己程序导致的问题,可以捕获、可以处理
5.2 Error/Runtime异常、其他异常
Error:
内部错误:程序员通常无能为力,一旦发生,想办法让程序优雅的结束
Runtime异常:
运行时异常,是程序 源代码中引入的故障所造成的
其他异常:
由外部原因造成
5.3 Checked异常、Unchecked异常
Checked异常:
编译器可帮助检查你的程序是否已抛出或处理了可能的异常。
Unchecked异常:
编程错误,其他不可恢复的故障(错误+运行时异常)