- 1.动静态检查 :
- 2.内外部质量标准
- 3.final
- 4可变和不可变
- 5快照图snapshot
- 6.规约
- 7.ADT
- 8.防御性拷贝
- 9.override重写规则
- 10.异常发生后之后是否执行
- 11.视图
- 12.hascode相等 equals不一定相等
- 13.assert断言
- 14.checked exception 和unchecked exception
外部质量属性:针对于client的使用这个软件,没必要过剩了解代码内部
【正确性】【健壮性】【可扩展性】【可复用性】【兼容性】【效率】【可移植性】【应用性】【功能性】【及时性】
内部质量属性:针对于代码
从LOC(line of code)到圈复杂度:用来衡量一个模型判定结构的复杂程序
耦合度和内聚度,可读性、可理解性、清晰度、大小
final类无法派生子类
final变量无法改变值/引用
final方法无法被子类重写
mutable:
StringBulider,Date
immutable:
Sting,LocalDate
一个完整的方法包括规约spec和实现体implementation;
尽量不设计mutating的spec,否则就容易引发bugs
除非在后置条件里声明过,否则方法内部不应该改变输入参数
尽量避免使用可变(mutable)的对象
如果规约的强度 S2>=S1,就可以用S2代替S1,
体现有二:
1.一个更强的规约包括更轻松的前置条件和更严格的后置条件;
2.越强的规约,意味着实现者(implementor)的自由度和责任越重,而客户(client)的责任越轻。
S2>=S1
S2的前置条件更弱
S2的后置条件更强
9.抽象函数AF与表示不变量RI
【用注释写AF和RI】
本门课程还要求你将表示暴露的安全性注释出来。
表示不变量和抽象函数都应该记录在代码中,就在代表本身的声明旁边,以下图为例
方法的重写(override)两同两小一大原则:
1.方法名相同,参数类型相同(传入的参数类型比如相同也不能变小变大!!!)
2.子类返回类型小于等于父类方法返回类型
3.子类抛出异常小于等于父类方法抛出异常
4.子类访问权限大于等于父类方法访问权限(访问权限由高到低:public、protected、包访问权限(默认)、private)
5里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象
6 final方法不能被重写,不能覆盖不可被继承的方法
7 如果方法名称相同而参数列表不同(返回类型可以相同也可以不同),那么只是方法的重载,而非重写
1.如果对异常进行处理,后面代码还会继续执行
2.如果把异常直接抛出,后面代码将不会在继续执行
3.try里面遇到异常就不执行try内部段的下面的了,就直接跳出try执行其他代码块
//代码1
public static void test() throws Exception {
throw new Exception("参数越界");
System.out.println("异常后"); //编译错误,「无法访问的语句」
}
//代码2
try{
throw new Exception("参数越界");
}catch(Exception e) {
e.printStackTrace();
}
System.out.println("异常后");//可以执行
//代码3
if(true) {
throw new Exception("参数越界");
}
System.out.println("异常后"); //抛出异常,不会执行
1.如果对异常进行处理,后面代码还会继续执行
2.如果把异常直接抛出,后面代码将不会在继续执行
3.try里面遇到异常就不执行try内部段的下面的了,就直接跳出try执行其他代码块
public class TestException {
public static void main(String[] args) throws Exception {
int[] i = {1, 2, 3};
try {
System.out.println(i[3]);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("异常后1");//可以执行
try {
System.out.println(i[3]);
} catch (Exception e) {
throw new Exception("错误" + e);
}
System.out.println("异常后2");//不能执行
}
}
1.如果对异常进行处理,后面代码还会继续执行
2.如果把异常直接抛出,后面代码将不会在继续执行
3.try里面遇到异常就不执行try内部段的下面的了,就直接跳出try执行其他代码块
``
11.
转义字符:
. ( ) * .................
[^abc]
的这个^是作用于整个[abc]
1.阶段:构建 build|| 运行
2.动态:时刻 moment|| 周期
3.级别:代码code || 组件component
①Moment维度关注于程序在某一个时刻的表现,而Period维度更关注于程序在一段时间内的表现;
②Build-time维度关注程序还未被投入运行,编码阶段的表现,而Run-time维度更关注于程序运行时的表现;
③Code-level维度关注程序的语句层面,Component-level维度更关注于一段代码,当作一个块观察比如一个包、一个库。
(1) Build-time, moment, and code-level view 关注的是源码的组织情况,可在词汇(源码)、语法(抽象语法树)、语义(类图)三个层面分别分析。
(2) Build-time, period, and code-level view 关注的是代码的变化(Code churn代码变化)
(3) Build-time, moment, and component-level view 关注的是包/库,而且是静态链接库
(4) Build-time, period, and component-level view 关注代码的更迭,与(2)中不同的是,这个维度下更关注文件版本的变化,而不是具体语句的变化(2中关注的是哪一行代码被修改了)----VCS的引出
(5) Run-time, moment, and code-level view 关注的是程序在某个时间点内存中的情况,如代码快照图(Code Snapshot)、内存信息转储(Memory dump)。
(6) Run-time, period and code-level view 关注的是代码的执行情况,执行跟踪
(7) Run-time, moment, and component-level view 关注的也是包/库,但却是在代码执行过程中的情况,如动态链接库
(8) Run-time, period, and component-level view 关注的是系统的使用情况,使用日志查看
软件构造多维度视图
红色标注为重点(考试会考选择题)
Moment 特定时刻的软件形态 Period 软件形态随时间的变化
AST (Abstract Syntax Tree) 抽象语法树
SCI (Software Configuration Item) 配置项
concurrent multithreads 并发多线程
AST
参考:参考链接
12jmap,Eclipse Memory Analyzer Java堆分析器
Heap Dump 是一个 Java 进程在某个时间点上的内存快照
VisualVM 是一款免费的,集成了多个 JDK 命令行工具的可视化工具,它能为您提供强大的分析能力,对 Java 应用程序做性能分析和调优。这些功能包括生成和分析海量数据、跟踪内存泄漏、监控垃圾回收器、执行内存和 CPU 分析,同时它还支持在 MBeans 上进行浏览和操作。本文主要介绍如何使用 VisualVM 进行性能分析及调优。
Eclipse Memory Analyzer 以及 VisualVM 涉及内存 需要执行代码
12.hascode相等 equals不一定相等hascode相等 equals不一定相等
equals相等hashcode一定相等
assert x>0; 在运行代码中,这个抛出 AssertionError
assertTrue(x>);在junit,这个直接用作测试样例
二者不同
不能assert右侧加可执行代码
比如assert List.pop()==x;错误 pop=List.pop(); assert pop==x;
assert非常影响运行性能
assert只在开发阶段被编译到目标代码中,而在生成代码时不编译进去
checked exception会强制要求加入trycatch
unchecked exception不会强制要求
代码中的 assert 语句太多,会影响代码运行性能,这是为了 correctness 所需付出的必要代价



