软件构造总体复习

软件构造总体复习

第一章 ——Views and Quality Objectives of Software Construction

第一章是开始讲软件构造,所以首先是怎么看一个软件呢——多维软件视图,及评价软件的一些标准,首先我们要知道什么是一个好的软件,后面的章节学习中将学习如何实现这些标准

1-1 Multi-Dimensional Views of Software Construction-多维软件视图

多维软件视图是从软件构造的三个方面来看待软件:
阶段 :build/run-time views
动态:moment / period views
级别:code / component views
关键图(多维视图及各个维度的相关内容)
软件构造这些维度的过程都要经历,后续的学习将会学习相关内容
在这里插入图片描述

1-2 Quality Objectives of Software Construction-软件构建的质量目标

软件构建的质量目标主要从外部质量标准和内部质量标准两方面进行质量标准相关说明;
外部质量标准——主要是面向用户的质量标准
内部质量标准——主要是面向开发人员的质量标准
内部标准的实现是保证外部标准的基础

外部标准:
Correctness、 Robustness、 Extendibility、Reusability: 、Compatibility、Portability、Ease of use、 Efficiency、Timeliness、Economy、Functionality

内部标准相关因素:
与源代码相关的因素,如代码行数(LOC)、圈复杂度等
与架构相关的因素,如耦合、内聚等
可读性,可理解性和清晰性
复杂性

软件构建的五个关键质量目标:
Easy to understand: elegant and beautiful code / understandability
Ready for change: maintainability and adaptability
Cheap for develop: design for/with reuse: reusability
Safe from bugs: robustness
Efficient to run: performance

第二章——Process and Tools of Software Construction

第二章主要是讲软件开发和开发过程的配置管理以及软件构造的过程,主要要理解不同过程之间的区别

2.1 Software Lifecycle and Configuration Management 软件生命周期与配置管理

软件开发过程主要分为:传统的软件开发和敏捷开发
传统的软件开发包括——瀑布模型、线性模型、V模型、原型模型等
传统的软件开发注重文档,敏捷开发不重视文档,通过快速迭代和小规模的持续改进,以快速适应变化
敏捷开发——极限编程

软件配置管理——追踪和控制软件的变化
软件配置管理分为:本地软件配置管理、集中式软件配置管理、分布式软件配置管理 终点区别三者不同
传统VCS存储的是版本之间的变化(行)
Git存储发生变 化的文件(而非代码),不变化的文件不重复存储
Git 是分布式软件配置管理的一个典型软件配置管理
每次调交到库的都是一个commit对象

软件构建主要讲了广义的软件构造和狭义的软件构造
广义的软件构造过程:编码——重构
在这里插入图片描述

狭义的软件构造过程就是Build阶段

第三章——Process and Tools of Software Construction

第三章主要内容:
软件构造的理论基础——ADT
软件构造的技术基础——OOP

3.1 Data Type and Type Checking 数据类型与类型检验

数据类型分为:
基本数据类型如:int,boolean,char 等
对象数据类型如:String,Object ,我们创建的类都是继承自Object为对象数据类型

数据根据“可变”与否:——可变/不变的数据类型
涉及变量值的变化或引用的变化
我们可以用Snapshot图理解数据类型,变量——值、引用可变性
我们理解可变与不可变,根据实际情况使用

类型检查分为:静态检查、动态检查
静态检查:关于“类型”的检查,不考虑值 ——编译阶段
动态检查:关于“值”的检查——运行阶段

3.2 Designing Specification 设计规约

上一节关注了编程语言中的“数据类型”、 “变量”、“值”
本节转向“方法/函数/操作”如何定义—— 编程中的“动词”、规约

规约说明了方法的功能,方法使用前置条件、后置条件的要求;客户端无需阅读调用函数的代码,只需理解规约即可

本节关键——理解规约,学会写好的规约;一个好的“方法”设计,并不是你的代码写的多么好,而是你对该方法的规约设计得如何

3.3 Abstract Data Type (ADT) 抽象数据类型(ADT)

抽象类型:
强调“作用于数据上的操作”,程序员和用户无需关心数据如何具体存储的,只需设计/使用操作即可
抽象数据类型重点关注操作,操作主要分为四种——
构造器、生产器、观察器、变值器
本节主要讲了ADT设计的一些重要理论
——表示不变量、表示独立,AF,表示暴露

本节关键——学会设计一个好的ADT,满足ADT的重要属性,并写注释说明重要属性的实现及表示RI、AF,防止表示暴露的实现

3.4 Object-Oriented Programming (OOP) 面向对象的编程

上一节学习了ADT理论
本节学习ADT的具体实现技术:OOP

基础相关概念——对象、类、属性和方法

重点学习内容:
接口、抽象类、实现类、继承、重写(不要改变原方法的本意 )、多态、子类型、重载

多态分为三种:
特殊多态——重载
参数多态——泛型,通配符
子类型多态——不同类型的对象可以统一的处理而无需区分

几个重要的方法:equals(),hashCode(),toString()
equals(),hashCode()方法继承时一般是一定要重写的

3.5 Equality in ADT and OOP ADT和OOP中的“等价性”

本节主要讲等价性,等价性——自反、对称、传递
包括对象等价性、引用等价性;可变对象的观察等价性、行为等价性;
对象和引用我们前面已经学习过了,但两者的理解稍有差错,会引起很多错误;重点理解

对于不可变的数据类型,一般需要重写equals(),hashCode()方法
对于可变的数据类型,一般不需要重写equals(),hashCode()方法

第四章—— Reusability-Oriented Software Construction Approaches

本章主要讲了第一章关于软件质量标准的一个重要标准——可复用性

4.1 Metrics, Morphology and External Observations of Reusability 可复用性的度量、形态与外部表现

本节主要讲了什么是可复用性,可复用性的重要性、如何评判可复用性、不同级别的可复用性

可复用性编程包括两方面:
面向复用编程:开发出可复用的软件
基于复用编程:利用已有的可复用软件搭建应用系统

4.2 Construction for Reuse 面向复用的软件构造技术

上一节学习了可复用的层次、形态、表现
本节从类、API、框架三个层面学习如何设计可复用软件实体的具体技术
设计可复用的类 :继承、委托

继承主要涉及行为子类型与Liskov替换原则:
(可静态检测)
子类型可以增加方法,但不可删
子类型需要实现抽象类型中的所有未实现方法
子类型中重写的方法必须有相同或子类型的返回值或者符合co-variance的参数
子类型中重写的方法必须使用同样类型的参数或者符合contra-variance的参数——判断重载问题
子类型中重写的方法不能抛出额外的异常

(只能人为判断)
继承实现的方法要求不变
不变量保持

重点学习子类型——判断什么才是满足要求的子类型
学习泛型中的LSP,容易出错——通配符

重点学习——继承、委托比较分析

前面我们已经学习了继承
委派/委托:一个对象请求另一个对象的功能
委派是复用的一种常见形式
“委托” 发生在object层面,而“继承”发生在class层面
分析比较继承和委托,根据实际情况判断是使用继承还是委托

设计可复用的API
设计可复用的框架——白盒框架、黑盒框架

4.3 Design Patterns for Reuse 面向复用的设计模式

除了框架,上一节所讨论的其他复用技术都过于“基础”和“细小”,
本节将讲解几种典型的“面向复用”的设计模式

Structural patterns——适配器模式
将某个类/接口转换为client期望的其他形式,通过增加一个接口,将已存在的子类封装起来,client面向接口编程,从而隐藏了具体子类。

Structural patterns——装饰器模式
主要是各种小的不同实现的组合,继承等的实现存在继承树复杂、组合爆炸等问题

装饰器模式——使用委托,实现功能一层一层的叠加

Structural patterns——外观模式
提供一个统一的接口来取代一系列小接口调用,相当于对复杂 系统做了一个封装,简化客户端使用

Behavioral patterns——策略模式
利用委托,将功能的实现使用外部接口完成不同的实现,运行时动态传入用户倾向的外部实现

Behavioral patterns——模板模式
共性的步骤在抽象类内公共实现,差异化的步骤在各个子类中实现 ——白盒框架

Behavioral patterns——迭代器模式
集合类继承Iterable接口,实现一个新的迭代器继承Iterator接口,实现不同的遍历方式

第五章—— Maintainability-Oriented Software Construction Approaches

本章主要讲了第一章关于软件质量标准的一个重要标准——可维护性

5.1 Metrics and Construction Principles for Maintainability 可维护性的度量与构造原则

本节主要讲了什么是软件维护、可维护性如何度量、实现高可维护性的设计原则

可维护性设计的构造 ——模块化 ——高内聚、低耦合
可维护性的设计原则—— OO设计原则 – SOLID、GRASP
S——单一责任原则 
O——开放-封闭原则
L——Liskov替换原则
D——依赖转置原则
I——接口聚合原则

GRASP ——关于如何为“类”和“对象”指派“职责”的一系列原则

5.2 Design Patterns for Maintainability 面向可维护性的设计模式

Creational patterns ——工厂模式
Structural patterns ——代理模式
Behavioral patterns —— Observer,Visitor

工厂模式:
不直接创建ADT实例,定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,使一个类的实例化延迟到其子类
工厂模式——抽象工厂方法
提供接口以创建一组相关/相互依赖的对象,固定组合

代理模式:
某个对象比较“敏感”/“私密”/“贵重”,不希望被client直接访问 到,故设置proxy,在二者之间建立防火墙。隔离对复杂对象的访问,降低难度/代价,定位在“访问/使用行为”

Observer:
两个类之间互相委托,一个类对象状态的更新将会调用另一个类的方法更新其上该类的状态
Java 提供了相应的实现:Observable抽象类,Observer接口——实现不同更新方式

Visitor:
 将数据和作用于数据上的某种/些特定操作分离开来

在特定ADT上执行某种特定操作,但该操作不在ADT内部实现,而是delegate到独立的visitor对象,客户端可灵活扩展/改变visitor的操作算法,而不影响ADT

重点学习本章与第四章的所有技术的异同,比较分析,掌握正确使用

5.3 Maintainability-Oriented Construction Techniques 面向可维护性的构造技术

上一章的技术主要都是围绕继承和委托
本节将学习以下两个方面:
基于状态的构造技术
基于语法的构造技术

基于状态的构造技术
——类似于自动机的实现,不同的状态执行不同的操作,结果不一定相同
使用delegation,将状态转换的行为委派到独立的state对象去完成

基于状态的构造技术——备忘录模式——主要是记录状态,以便于回滚

关键:需要记录状态的ADT,备忘录(就是一条记录,记录ADT的状态),备忘录记录——记录集合,查找记录便于回滚

基于语法的构造技术:
设定格式要求,判断是否满足格式要求

重点:语法构造,判断是否满足要求

正则语法:简化之后 可以表达为一个产生式而不包含任何非终止节点
学会正确使用Java的Pattern相关

第六章—— Software Construction for Robustness

本章主要讲了第一章关于软件质量标准的两个重要标准——正确性、健壮性及实现

6.1 Robustness and Correctness 健壮性与正确性

本节主要讲了健壮性与正确性的重要性,二者之间的差异

6.2 Error and Exception Handling 错误与异常处理

本节内容——Java中错误和异常处理的典型技术——Error and Exception

主要讲了Error 与Exception区别,一些常见的Error和Exception
Exception主要分为RuntimeException和其他

异常处理机制的角度关于异常的分类 ——Checked and unchecked exceptions——主要是被编译器检查
Checked exceptions——编译器可帮助检查你的程序是否已抛出或处理了可能的异常

当要决定是采用checked exception还是unchecked exception的时候,问一个问题:“如果这种异常一旦抛出,用户会做怎样的补救?”

重点——自定义异常,异常抛出,捕获

6.3 Assertions and Defensive Programming 断言与防御式编程

上一节的错误与异常处理主要是针对健壮性,本节讲解第2种技术——断言、防御式编程,侧重于correctness

断言——发现错误尽快失败,避免错误扩散
在开发阶段的代码中嵌入,检验某些“假设”是否 成立。若成立,表明程序运行正常,否则表明存在错误

防御式编程——主要是防止引入错误
防御式编程技术:
Protecting programs from invalid inputs
Assertions 
Exceptions 
Specific error handling techniques 
Barricade  Debugging aids

6.4 Debugging 代码调试

前面主要讲如何防止错误引入,本节主要讲如果已经引入了错误,如何发现并消除

Debugging占软件开发的很大一个比重,非常重要

Debugging 过程:
重现
诊断
修复
反思

关于这些阶段有许多的相关技术方法

6.5 Testing and Test-First Programming 软件测试与测试优先的编程

测试是发现错误的一个重要技术,我们要以发现错误为荣
软件测试提高软件质量的重要手段
重点:学会测试用例编写——学会用等价划分和边界值分析方法为模块设计测试用例

第七章—— Concurrent and Distributed Programming

本章主要讲线程与进程的相关内容

7.1 Concurrency 并发

本节讲多线程的一些相关概念——线程、进程、时间切片、共享内存、消息传递,线程创建、交错与竞争

交错和竞争会产生许多不同的执行结果,有时会产生许多错误

重点——学会分析多线程的执行,判断执行结果

一些主动影响线程之间的interleaving关系的技术:sleep(),interrupt(),join()

7.2 Thread Safety 线程安全

上一节讲了线程之间的interleaving关系会产生许多意想不到的结果,关键是不同的线程之间共享了可变的数据,彼此之间存在对该数据的访问竞争并导致interleaving,导致postcondition可能被违反

因此本节主要讲了三种技术实现线程安全:
限制数据共享
共享不可变数据
共享线程安全的可变数据

因为interleaving关系关键是不同的线程之间共享了可变的数据,所以对于共享可变的数据,提出上面三种方法

重点——分析线程安全策略是否可实现线程安全

7.3 Locks and Synchronization 锁与同步

前一节的三种技术,前两种对于要分享可变的共享数据显然不可行,第三种方法对于复杂的操作也不可行,因此本节提出新的技术方法——锁与同步

使用锁机制,获得对数据的独家mutation权,其他线程被阻塞,不得访问;拥有lock的线程可独占式的执行该部分代码
synchronized (obj)

关键:锁住的实现部分
同步机制给性能带来极大影响 ,因此要慎重使用同步机制,尽可能减小lock的范围

锁——死锁
多个线程竞争lock,相互等待对方释放lock
关键:判断多线程之间是否存在死锁,如何解除

一些相关技术方法:
wait(), notify(), and notifyAll()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值