软件构造
HIT软件构造课程
yqy2001
THU
展开
-
7-3 锁与同步
一、同步要读写共享的数据。通过锁的机制,某个线程可以获得对数据的独家访问权,其他的线程则被阻塞,无法访问。线程使用acquire获得锁,release释放。同一时刻一个锁只能被一个线程所有,其他的线程如果要申请只能等正在使用的线程去释放。二、锁每个对象都可以作为锁。java中使用synchronized来对某个语句上锁,表示某一时刻只有一个线程可以执行这条语句,执行完自动释放锁:1、同步语句、代码块注意,如果要防止竞争,要用同一把锁(相同的对象)进行保护。例子,下图中所有的lock都是同一原创 2020-07-11 16:35:58 · 110 阅读 · 0 评论 -
7-2 线程安全
一、什么是线程安全要求ADT或方法在多线程中要执行正确。要求不违反spec,与线程如何调度无关,且不能为了线程安全而要求client满足某些要求。迭代器不是线程安全的,不能同时remove和迭代。**线程不安全的本质:**多个线程都去修改、访问某个共享的数据。保证线程安全的四个方法:限制数据共享,共享不可变数据,共享线程安全的可变数据,同步机制。二、限制数据共享1、将可变数据限制在单一线程内部,避免竞争。JVM内存机制:每个线程有自己的栈,且仅能访问自己的栈。基本的局部变量保存在线程栈中,对象原创 2020-07-11 16:22:56 · 113 阅读 · 0 评论 -
7-1 并发
一、什么是并发编程并发:多个计算同时运行、同一时刻多个应用运行。并发可以充分利用多核处理器。并发编程的两个模型:1、共享内存,并发的模块共享数据;2、消息传递,并发的模块通过传递消息来进行交互。二、进程、线程进程是一个正在执行的程序的实例,是私有空间,彼此隔离的。线程是一个程序的一部分,是程序内部的控制机制,一个程序可以包含一个或多个线程。1、进程进程拥有整台计算机的资源(虚拟的),多进程之间不共享内存,互不干扰,通过消息传递进行协作。一个应用可能包含多个进程。2、线程线程是虚拟CPU,线原创 2020-07-11 16:12:21 · 176 阅读 · 0 评论 -
6-3 断言与防御式编程
一、ADT的设计静态检查、动态检查、使用不可变的类型、值、引用等都有助于减少bug。bug是不可能完全避免的,要将bug限定在一个小范围内,使得程序尽早出问题。例如下图,前置条件要求x>=0,虽然说违反了前置条件方法怎么做都行,但最好还是今早报错。二、断言开发阶段在代码中嵌入,检验某些条件是否成立。如果断言失败,会抛出AssertionError。断言有两种形式,第二种中的message是在断言失败的时候抛出的信息:在控制流复杂时可以使用断言机制,确保程序永远不会执行到某个地方。但如果原创 2020-07-10 22:00:55 · 198 阅读 · 0 评论 -
6-2 错误与异常处理
一、错误与异常 Error和Exception是接口,下图中虚线圈起来的部分属于unchecked exception,剩余部分属于checked exception,unchecked类型编译器不管,其他的编译器会check,必须被捕获或者被抛出。 错误一般是指内部系统的问题,程序员一般对此无能为力,只能让程序gracefully地退出;异常则是程序导致的问题,可以捕获、处理。二、异常处理1、异常 异常指程序中出现的非正常事件。异常可以通过异常处理程序处理,也可以抛出异常、将信息传递给上原创 2020-07-10 21:57:44 · 285 阅读 · 0 评论 -
6-1 健壮性与正确性
一、健壮性与正确性1、健壮性指一个系统不正常的输入或不正常的条件下仍然能够表现正常的程度。面向健壮性的编程:可以处理未期望的行为和错误的终止;即使终止执行,也要展示错误信息;要假设用户是个白痴,可能有各种奇葩的输入。原则:1、封闭实现细节,限定用户的恶意行为;2、考虑各种极端情况。2、正确性指程序按照规约执行的能力,是最重要的质量指标。正确性确保程序永远不会给用户错误的结果,遇到错误情况直接报错退出;健壮性倾向于容错,遇到错误情况也要尽可能保持软件运行。3、健壮性vs正确性健壮性对用户友好原创 2020-07-10 21:52:46 · 894 阅读 · 0 评论 -
5-3 面向可维护性的构造技术
一、基于状态的编程1、状态模式对象有一个状态属性,并且可以变化。形式如下,context是某一个对象,它有属性state(状态),状态在一定的条件下会跳转至另一状态;用一个State接口来表示状态、定义状态间的转换:举个例子,下图是一个有状态的ADT,他可以变换自己的状态(move):状态类如下,每一个状态继承一个状态接口,有状态转换(move)、是否接收状态(accept)方法:注意,这里的状态类使用单例模式:1、构造函数要是private的;2、变量是静态的。2、备忘录模式记录某对原创 2020-07-09 18:19:48 · 121 阅读 · 0 评论 -
5-2 面向可维护性的设计模式
一、创造型的模式1、工厂方法模式 定义一个用于创建对象的工厂接口,其子类型来决定创建对象时实例化哪一个类。模式如下,Product是一个对象,其有子类ProductOne、ProductTwo等,定义一个工厂接口Creator,其有工厂方法factoryMethod,这样就可以利用工厂方法去创建对象。不同的工厂方法实例化接口Product不同的子类,但返回的都是接口类型,即Product: 一个例子: 静态工厂就不用new了:2、抽象工厂模式 提供接口以创建一组相关/相互依赖的对象原创 2020-07-09 16:09:37 · 106 阅读 · 0 评论 -
5-1 可维护性的度量和构造原则
1、软件维护修复错误、改善性能。修改后要进行回归测试,确保没有引入新的故障。2、可维护性的度量圈/环复杂度:独立路径的数量、代码行数、可维护性指数MI、继承的层次数、类之间的耦合度、单元测试的覆盖度3、模块化设计高内聚低耦合、分离关注点、信息隐藏。五个标准:1、可分解性,将问题分解成小问题;2、可组合性;3、可理解性;4、可持续性,发生变化时产生的影响较小;5、保护性,异常、错误的影响小。五个方法:1、直接映射;2、尽量少的接口;3、尽量小的接口,两个模块交换较少的信息;4、明显的接口;5、原创 2020-07-09 16:01:03 · 340 阅读 · 0 评论 -
4-2 面向复用的软件构造技术
1、设计可复用的类1.1 行为子类型和LSP子类型:相比于父类型,要有相同或更强的ADT(前置条件变弱或后置条件变强、更强的不变量);在java中表现为:子类型可以增加方法;子类型中重写的方法必须返回相同或子类型的返回值(协变);子类型中重写的方法必须接受相同类型的参数(逆变);子类型重写的方法不能抛出额外异常。例子:假如一个长方形类、一个正方形类,然后正方形类继承长方形类。长方形有一个方法setWidth:改变某条边的长度。这时正方形类就无法继承这个方法,因为会破坏规约。正方形类和长方形原创 2020-07-08 08:21:11 · 103 阅读 · 0 评论 -
4-3 面向复用的设计模式
设计模式:前人经验总结出来的设计方案,可复用创建型模式:告诉我们怎么更好的创建对象,第五章。结构型模式:研究结构,怎么把类、对象更好的组合在一起。行为类模式:研究对象、类怎么进行调度,怎么更好的分配职责、实现功能。一、结构性模式(1)适配器模式: 解决类之间接口不兼容问题,即类是以一种方式实现的,但用户想用一种不同的方式调用(例如签名不同)。 方法:通过增加一个接口,对已存在的类...原创 2020-04-23 10:05:18 · 297 阅读 · 0 评论 -
4-1 可复用性概述
1、什么是软件可复用? 使用现有的软件组件来快速实现需要的功能。软件可复用的两个方面: 1、开发层面:面向复用编程,开发成本高,缺乏针对性,性能差些; 2、使用层面:基于复用编程,复用时需要适配;为什么要可复用: 降低成本和开发时间;能被复用的模块都是可靠稳定的;标准化的,在不同应用中可保持一致。可复用的缺点: 开发可重用的组件需要额外的代价;缺乏针对性,性能差;复用时也...原创 2020-04-21 11:24:46 · 1229 阅读 · 0 评论 -
6-5 软件测试与测试优先的编程
本节目标:本节大纲:测试用例输入+执行条件+期望结果写测试用例、组织、执行、得到结果并评估好的测试用例:测试优先的编程写代码前先写测试,尽早发现问题流程:写测试用例,就是理解、修正、完善规格说明书的过程...原创 2020-03-04 22:38:11 · 227 阅读 · 0 评论 -
1-1 软件构造过程中的多维视图
本节目标:本节大纲:随着时间的推移,人们对软件的认识的变化:软件不能脱离外部环境:软件构造的多个维度:时间:瞬时(某一天某个时间点)、周期(变化情况)编码:构建开发(代码的结构、多少类、类与类之间的关系)、运行阶段(在电脑上的配置情况,占用多少内存等)代码和模块:代码(细致的组成,一个类中有多少种方法)、模块(宏观)构造阶段:(1)Build-time, Moment,...原创 2020-03-03 11:14:07 · 286 阅读 · 0 评论 -
1-2 软件构造的质量目标
本节框架:外部质量因素是非开发人员的,是使用者的感受,例如图形界面是否友好,使用是否方便;内部因素由开发人员控制,内部因素影响外部因素。外部因素主要的外部因素如下,下逐一说明:1、正确性:是需要首要保证的。是相对的概念,有条件的,规约之内,符合软件规格说明书,假定一个软件系统是分层开发的,每层都要确保自己层和自己的低层是正确的,亦即确保每层都是正确的。保证正确性的方法:形式化开发、测试...原创 2020-03-02 22:42:51 · 281 阅读 · 0 评论