软件构造小记(2)哈工大软件构造2021年期末考试重点概要

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外部质量因素

  1. Correctness:最重要的质量指标
    1)测试和调试:发现不正确、消除不正确
    2)防御式编程:在写程序的时候就确保正确性
    3)形式化方法:通过形式化验证发现问题→通过数学证明
  2. Robustness:针对异常情况的处理(健壮性是对正确性的补充)
    1)“normal”和“abnormal”是主观而非客观
    2)所谓的“异常”,取决于spec的范畴
  3. Extendibility/可扩展性:对软件的规约进行修改,是否足够容易
  4. Reusability:一次开发,多次使用。发现共性,避免重复实现
  5. Compatibility/兼容性:不同的软件系统之间相互可容易的集成
  6. Efficiency:效率是软件系统对硬件资源尽可能少的需求的能力。过度的优化导致软件不再适应变化和复用
  7. Portability/可移植性:软件可方便在不同的技术环境之间移植
  8. Easy of use
  9. Functionality
  10. Timeliness/时效性:规定时间内做出产品
  11. Verifiability/可验证性
  12. Integrity/完整性:软件系统保护其各种组件(程序和数据)免受未经授权的访问和修改的能力
  13. Repairability/可修复性
  14. 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 :

  不可变数据类型:其内部的操作不会改变内部的值,一旦试图更改其内部值,将会构造一个新的对象而非对原来的值进行更改。

mutableimmutable
优点可变类型会减少数据的拷贝次数,从而其效率 要高于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异常:

编程错误,其他不可恢复的故障(错误+运行时异常)

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值