HIT 软件构造 知识点总结

1. 多维软件视图:

Moment view : what do source code and component look like in a specific
time 特定时刻的软件形态
Period view : how do they evolve/change along with time 软件形态随时间
的变化
2. 正确性是第一位的,不可以折中
3. 5个质量目标:
(1)容易理解;
(2)可维护性和适应性好
(3)可复用性好
(4)健壮性好
(5)性能高
4. 软件开发周期:
(1)Planning
(2)Analysis
(3)Design
(4)Implementation
(5)Testing & Integration
(6) Maintance
5.git
和传统VCM不同的是,GIT存储发生变化的文件,不变化的文件不重复存储,只是在新版本建立一个指针指向没变化的文件
6. 基本数据类型
没有ID,不可变类型,存储在栈中,只在使用时存在
7. 对象数据类型
有ID,存储在堆中
8. Boxed primitives
可以自动转换,但是会降低效率
9. java在运行前进行类型检查,python则在运行时进行
10. 静态检查范围:(主要是关于类型的检测)
(1)类型匹配
(2)语法错误(不对的标点等)
(3)错误的类名/方法名
(4)参数数目不对
(5)参数类型不对
(6)返回值类型不对
11. 动态检查范围:(需要赋值后才能判断的错误)
(1)非法参数值
(2)非法返回值
(3)越界
(4)使用空指针
p.s. 除以0是动态检查的范围
12. 整数溢出不会被检查
13. NaN运算后还是NaN,即使是除以0
14. final关键词修饰:
(1)声明不可变引用类型,表示不可再指向其他对象
(2)final类不能有子类
(3)final方法不能被重写
15. 可变类型a,b指向同一个对象,改变a时就会改变b
16. StringBuilder调用toString转化为String
17. 不可变类型不需要防御式拷贝
18. Snapshot diagram:
(1)不可变对象用双线椭圆
(2)不可变引用用双线箭头
 
19. 不可变引用可以指向可变的值;可变的引用可以指向不可变的值
20. 垃圾回收(GC)
21. int[]数组不可改变长度
22. 遍历时移除的话,用迭代器
23. 基本类型及其封装类型都是不可变
24. Collection的unmodifiable设定的不可变是在运行时体现的,静态检查无法检查
25. 测试用例应该根据规约设计,不考虑实现
26. 更强的spec:更放松的前置条件+更严格的后置条件
27. spec应该简单,单一,容易理解
28. 是否检查先决条件取决于检查的代价
29. 四种ADT操作:
(1)creator:使用参数(或者没有)创建一个新对象
(2)producer:利用已有的对象创建一个同类型的对象
(3)obverse:利用已有的对象创建一个不同类型的对象
(4)mutator:改变对象属性
30. mutator通常返回void,如果这样就说明调用后对象属性变化了。也有的时候不返回void,例如boolean表示是否改变等
31.  BufferedReader.readLine() 是mutator
32. AF:一定满射,未必双射,未必单射
33. 同一个表示空间可以有多种RI
34. R,RI相同,AF也可以不同
35. 抽象值永远不应该改变,但是表示量可以,只要修改后继续指向原来的抽象值
36.  AF,RI都不应该被外部看见
37. default只能作用于同一个包内
38. 严格继承:只增加方法而不重写父类中的方法
39. 如果在构造方法中调用父类的构造方法,那么必须放在第一行
40. 抽象类的子类必须实现抽象类中所有抽象方法
41. 只有抽象方法的类叫接口
42. 三种多态性:
(1)特殊多态:一个方法可以有多个同名的实现
(2)参数化多态
(3)子类型多态
43. Overload属于静态检查,在编译时确定使用哪个方法;Override属于动态检查,在运行时确定
44. Overload必须有不同的参数列表,返回值类型可以不同
45. Overload可以发生在一个类,也可以发生在子类
46. Overload:由传入的参数类型决定;Override:由实例化的对象决定
47. 类中声明了泛型变量就称为泛型类,这些类型变量称为类型参数,表示为<T,E.....>
48. 即使泛型方法的类型参数名和类一样,方法体中使用的仍然是方法的类型参数,与类无关
49. 可以有多个类型参数e.g. Map<T, E>
50. 泛型不能用于创建通用数组
51. 子类的规约不能弱于父类
52. 一种重写hashCode的方法:
53. 不可变类需要重写equals方法
54.定义等价由多重视角:AF,行为等
55. ==代表存储空间相同,也就是说引用的是同一个对象
56. equals要重写,使用@Override来让编译器检查签名
57. instanceof属于动态检查
58. “相等”的对象的hashCode也必须相等
59. equals需要满足等价关系的三个条件:对称,自反和传递
60. equals(null)应该总是返回false
61. 不相等的对象也可以有相同的hashCode,但是会降低性能(最简单方法,hashCode取一个常量)
62. 利用equals中使用的所有信息重写hashCode
63. 可变类型一般要求实现观察等价性
64. 把可变对象放入例如HashSet中,会放在对应hashCode的位置。如果更改了对象,那么对象的hashCode就会和HashSet中原本位置的hashCode不相同,contains方法就会返回false;
65. 对于基本类型的包装类型,以int为例,相同整数值的Integer是equal的,但是不是==的。如果放到Map<String, Integer>中,那么在-128<int<127是,是==的(具体看ppt)
66. 软件构造中任何实体都可以被复用,小至方法,大至框架
67. 白盒框架:使用继承;黑盒框架:实现接口或者委派
68. LSP:子类拥有更强的不变量,更弱的前置条件,更强的后置条件
69. 参数协变(不安全),参数逆变都属于Overload
70. 
ArrayList<String > is a subtype of List<String >
List<String > is not a subtype of List<Object >
71. 类型参数在编译后就被丢弃,运行时不可用(类型擦除)
72. 泛型是不变的,不是协变的
73. 如果擦除时,没有特定类型来替换泛型,就会用Object来替换
74. 参数类型有多个限定时用第一个
75. M<A>和M<B>没有关系,即使A和B有关系。M<A>和M<B>共同的父类是Object
76. 无限定通配符:一般用于定义一个引用变量;可以用于类型变量协变
77. ?super A:下限通配符;? extends A:上限通配符;
78. 
List<Number > is a subtype of List<?>
List<Number > is a subtype of List<? extends Object>
List<Object > is a subtype of List<? super String>
79. 组合(一种委派)优先于继承
 
80. 继承层次数;类之间的耦合度;单元测试的覆盖度
81. 高内聚,低耦合
82. 耦合度:模块间的接口数目,每个接口的复杂度
83. 聚合度:衡量模块内的功能目标的紧密程度
84. SOLID
(1)单一责任:每个ADT只负责一件事
(2)对拓展性的开放,对修改的封闭——————抽象
(3)LSP:子类型可以完全替换父类型
(4)ISP:不提供不需要的接口
(5)DIP
85. 委派时通过接口建立关系
86. 基于语法构造
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值