自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 7.3 锁与同步

▪ 了解如何使用锁来保护共享的可变数据▪ 能够识别死锁并知道防止死锁的策略▪ 了解监视器模式并能够将其应用于数据类型1 同步数据类型或函数的线程安全性:当从多个线程使用时,无论这些线程是如何执行的,都能正常工作,无需额外的协调。原则:一个并发程序的正确性不应该依赖于时间的偶然性。▪ 有四种策略可以确保代码的并发安全:–限制:不要在线程之间共享数据。–不变性:使共享数据不可变。–使用现有的线程安全数据类型–同步:防止线程同时访问共享数据。▪ 前三种策略的核心思想:– 避免共享 ➔ 即使

2020-06-10 19:03:38 232

原创 7.2 线程安全

1 什么是线程安全▪ 竞争条件:多个线程共享同一可变变量,而不协调它们正在做什么。 ▪ 这是不安全的,因为程序的正确性可能取决于其低级操作的时间安排。▪ 如果从多个线程使用数据类型或静态方法时其行为正确(无论这些线程如何执行),并且不要求调用代码进行额外的协调,则该数据类型或静态方法是线程安全的。▪ -“行为正确”意味着满足其规范并保持其rep不变量;-“无论线程如何执行”意味着线程可能在多个处理器上,或者在同一个处理器上有时间间隔;-“没有额外的协调”意味着数据类型不能

2020-06-09 15:20:32 197

原创 7-1并发

1什么是并发编程?并发,即同时发生多个计算例如一个网络中的多个计算机,一台计算机上多个应用程序,网站处理多个用户,云计算;GUI前台和后台必须同时进行为什么需要并发?这是由于近几年单核的计算速度不再按照摩尔定律提升了,为了运算的更快,必须将一个计算分成并发的部分§共享内存:并发模块通过在内存中读写共享对象进行交互。§消息传递:并发模块通过通信信道相互发送消息进行交互。模块发送消息,每个模块的传入消息排队等待处理。§共享内存模型示例:–A和B可以是同一台计算机中的两个处理器(或处理器核心),共享

2020-06-08 17:34:05 356 1

原创 6-4 debugging

1 什么是bug?什么是debug?bug:–程序中的一种错误,它导致程序以非预期或非预期的方式执行。–包含大量错误和/或严重干扰其功能的错误的程序称为错误。–详细说明程序中错误的报告通常称为错误报告、故障报告、问题报告、故障报告、缺陷报告等。为什么会出现bug?–代码错误–未完成的需求或不够详细–对用户需求的误解–设计文档中的逻辑错误–缺少文档–没有足够的测试当防御式编程和测试都没能抵挡bug时,你就不得不进行调试了什么是debug?▪ 调试是识别错误的根本原因并加以纠正的过程。

2020-06-08 12:25:10 253

原创 6.3 断言与防御式编程

1 复习:设计ADT第一道防线:使bug不可能▪ 对付bug的最好办法是通过设计使它们不可能。–静态检查:通过在编译时捕获错误来消除许多错误。–动态检查:Java通过动态捕获数组溢出错误,使其不可能发生。如果试图使用数组或列表边界之外的索引,Java会自动生成错误。–未选中的异常/运行时错误-不可变:不可变类型是一种值一旦创建就永远无法更改的类型。–不可变值:按final,可分配一次,但从不重新分配。–不可变引用:按final,这使引用不可访问,但引用指向的对象可能是可变的或不可变的。▪ 如

2020-06-07 23:31:10 683

原创 6.2 错误与异常处理

1 Java中的错误与异常所有异常对象的基类是java.lang.Throwable语言,以及它的两个子类java.lang.exception和java.lang.ErrorError描述了Java运行时系统中很少发生的内部系统错误和资源耗尽情况(例如,VirtualMachineError、LinkageError)。–不应抛出此类对象。–如果发生这样的内部错误,除了通知用户并尝试优雅地终止程序外,几乎无能为力Exception描述了由程序引起的错误(例如FileNotFoundExcepti

2020-06-07 22:17:08 273

原创 6.1 健壮性与正确性

1 什么是健壮性和正确性?健壮性:“系统或部件在无效输入或压力环境条件下能够正常工作的程度”面向健壮性的编程:一种专注于处理意外终止和意外操作的编程风格。它需要代码通过显示准确和明确的错误消息来优雅地处理这些终止和操作。这些错误消息允许用户更容易地调试程序。健壮性原则:偏执狂(Paranoia)–程序员假设用户正在破坏他们的代码,并假设自己编写的代码可能会失败或工作不正常。总是假定用户恶意、假定自己的代码可能失败▪ 愚蠢-程序员假设用户会尝试错误、虚假和格式错误的输入。把户想象白痴,可输何东西–因

2020-06-07 11:31:14 1013

原创 5.3 面向可维护性的构造技术

除了前面介绍的几种设计模式,还有基于状态的构造技术和基于语法的构造技术。1 基于状态的构造技术基于状态的程序设计▪ 基于状态的编程是一种使用有限状态机(FSM)来描述程序行为的编程技术,即使用“状态”来控制程序流。–例如,对于电梯,它可以是停止、向上移动、向下移动、停止、关闭门和打开门。▪ 每一种都被认为是一种状态,接下来发生什么取决于电梯的当前状态。–如果电梯刚刚关门,接下来可能发生什么情况?它可以停止,向上或向下移动。–当电梯停下来时,你期望下一个动作是开门、向上或向下移动。如果在AD

2020-06-07 11:03:48 139

原创 5.2 面向可维护性的设计模式

1 创造模式(1) 工厂方法模式该模式定义用于创建对象的接口,但让子类决定实例化哪个类,即将类的实例化延迟到子类。当我们无法预测需要创建哪个子类时,定义一个用于创建对象的接口,让该接口的子类型来决定实例化哪一个类,从 而使一个类的实例化延迟到其子类。优点:不需要将类绑定到客户端代码缺点:需要工厂类该方法遵循开闭原则(2) 抽象工厂模式抽象工厂模式:提供接口以创建一组相关/相互依赖的对象, 但不需要指明其具体实现类抽象工厂创建的不是一个完整的产品,而是一类产品,产品的创建流程都是

2020-06-06 22:26:14 160

原创 5.1可维护性的度量与构造原则

1 软件维护和演化什么是软件维护?▪ 软件维护在软件工程中是指在软件产品交付后对其进行修改,以纠正错误、提高性能或其他属性。维护是软件生命周期中最困难的方面,需要高超的诊断,测试和文档记录技能。需要测试修改是否正确,检查回归错误,新增测试用例;通常情况下需要维护的代码没有足够的文档和测试用例,工程师必须从源代码中推断出错误。软件维护包括四个类型:▪ 纠正性维护,占比25%——交付后对软件产品进行的反应性修改,以纠正发现的问题;▪ 适应性维护,占比21%——交付后对软件产品进行的修改,以保持软件

2020-06-06 18:51:28 383

原创 4.3面向复用的设计模式

除了Framework,4-2节所讨论的其他复用技术 都过于“基础”和“细小”,有没有办法做更大 规模的复用设计?本节:介绍几种典型的“面向复用”的设计模式大纲▪结构模式–适配器通过将自己的接口包装在现有类的周围,从而允许具有不兼容接口的类一起工作。– Decorator在对象的现有方法中动态添加/覆盖行为。– Facade为大量代码提供了简化的界面。▪行为模式–策略允许在运行时即时选...

2020-06-06 14:31:19 337

原创 java logging的使用

1.构造一个java logging通过类名和Logger类的getLogger方法获得该类的日志2.使用logger进行记录:默认在控制台输出,可以通过该方法设置不在控制台输出通过该方法可以将日志内容记录在文件中setFormatter方法是设置日志的自定义格式通过继承Formatter来定义自己的格式类,例如返回“[”+ 记录时间+ “]: “+记录日志信息+”\n”;之后在异常发生的地方调用logger的info方法传入异常信息即可记录异常,在用户操作的时候调用logger的inf

2020-06-03 14:10:47 388

原创 4.2 面向复用的软件构造技术

大纲▪ 设计可重用类-继承和重写-重载-参数多态性和泛型编程-行为子类型和Liskov替换原则(LSP)-组合和委托▪ 设计系统级可重用库和框架——API和库——框架——Java集合框架(示例)1设计可重用类在OOP中设计可重用类▪ 封装与信息隐藏▪ 继承和重写▪ 多态性、子类型化和重载▪ 通用程序设计▪ 行为亚型与Liskov替代原理(LSP)▪ 授权和组成...

2020-04-29 14:01:47 263

原创 4-1可复用性的度量、形态与外部表现

▪ 软件复用的优缺点▪ 再利用组件▪ 通用可重用组件的特性大纲▪ 什么是软件重用?▪ 如何衡量“可重用性”?▪ 可重用组件的级别和形态-源代码级重用:模块级别的复用:类/抽象类/接口库级别的复用:API/包系统级别的复用:框架▪ 可重用性的外部观察-类型变化-例行分组-实现变化-表示独立-分解常见行为1什么是软件重用?▪ 软件重用是使用现有软件组件实现或更新软件...

2020-04-29 10:06:49 671

原创 HeadFirst设计模式笔记

1.当一个超类具有可能在子类中具有变化的方法时,不要使用继承,而是使用接口,单独设计一个该方法的接口,将该方法委托给该类之外的方法类去实现。例如鸭子超类,鸭子有飞行和呱呱叫方法,但每种不同的鸭子可能会飞也可能不会飞,可能呱呱叫也可能吱吱叫或者不会叫,这时候我们需要设计飞行接口和叫声接口,用不同的具体飞行方法实现类来继承接口,鸭子超类中只需要设定接口参数,之后在具体类中使用多态即可。此时如果要修...

2020-04-22 10:39:48 319

原创 3-5ADT和OOP中的“等价性”

本次课程的目的▪ 理解等价关系的性质。▪ 理解根据抽象函数和观察定义的不可变类型的相等性。▪ 区分引用相等和对象相等。▪ 区分不同类型的严格观察和行为平等。▪ 理解对象协定,并能够正确地为可变和不可变类型实现Equals大纲▪ 等价关系▪ 不可变类型的相等性▪ ==对等于()▪ 不可变类型的相等性▪ The Object Contract▪ 可变类型的相等性▪ 自动装箱与...

2020-04-03 09:31:19 215

原创 3-4 面向对象的编程OOP

本次课程的目的▪ 将抽象数据类型的接口与其实现分离,并使用Java接口类型强制分离。▪ 用接口定义adt,并编写实现接口的类。大纲▪ 基本概念:对象、类、属性、方法、接口和枚举▪ 面向对象的封装与信息隐藏的显著特征继承与重写多态,子类型与重载、静态与动态调度▪ Java中一些重要的对象方法▪ 设计好的课程、▪ 面向对象的历史▪ 摘要1基本概念:对象、类、属性和方法对象▪...

2020-04-01 10:54:33 191

原创 3-3 抽象数据类型ADT

本次课程的目的▪ 抽象数据类型和表示独立性:使我们能够将如何在程序中使用数据结构与数据结构本身的特定形式区分开来。抽象数据类型解决了一个特别危险的问题:客户对类型的内部表示进行假设。–我们将了解为什么这是危险的,以及如何避免。–我们还将讨论操作的分类,以及抽象数据类型的一些良好设计原则。▪ 不变量、rep暴露、抽象函数(AF)和表示不变量(RI)–通过抽象函数和表示不变量的概念,对类实...

2020-03-25 10:06:44 1055

原创 3-2设计规约

一.程序设计语言2中的函数/方法。规范:通信编程为什么需要规范行为等价规范结构:先决条件和后决条件测试 验证规范3.设计规范分类规范图表规范质量规范4.摘要总结本次讲座的目的▪ 了解方法规范中的先决条件和后决条件,并能写出正确的规范▪ 什么是前置条件和后置条件,它们对方法的实现者和客户机意味着什么▪ 了解不确定的规格,能够识别和评估不确定性▪ 理解声明性规范和操作性规...

2020-03-20 09:26:11 334

原创 3-1数据类型与类型检验

大纲1编程语言中的数据类型2静态与动态数据类型检查3易变性和不变性4快照图5复杂数据类型:数组和集合6有用的不可变类型7摘要本次课程目的1.了解编程语言中数据类型、静态和动态类型检查的基本知识2.理解可变/不变的数据类型3. 可变数据类型的危险性4. 使用不变性来提高正确性、清晰度和易变性——不变数据类型的优越性5. 使用快照图演示程序执行期间特定时间的状态。 ——用Sn...

2020-03-18 09:22:46 335

原创 2-2 软件构造的过程、系统和工具

大纲▪ 软件构建的一般过程:设计编程/重构调试测试构建发布-编程/重构-评审和静态代码分析-调试(转储和日志记录)和测试-动态代码分析/分析▪ 狭义的软件构建过程(Build):验证编译链接测试包安装部署-构建系统:组件和过程-构建变量和构建语言-构建工具:Make、Ant、Maven、Gradle、Eclipse本次讲座的目的▪ 了解软件构建的一般过程(设计编程...

2020-03-13 08:56:07 504

原创 2-1 软件生命周期与配置管理

目的▪ 了解软件开发的一般过程▪ 了解传统软件过程模型的原理,包括线性和迭代模型(瀑布、增量、原型、螺旋和V模型)▪ 认识和实践敏捷开发▪ 了解软件配置管理(SCM)▪ 学习如何将Git用于日常的SCM任务(用于个人开发的基本命令,用于协作开发的高级命令)大纲▪ 软件开发生命周期(SDLC)▪ 传统的软件过程模型(瀑布、增量、Vmodel、原型、螺旋)▪ 敏捷开发和极限编程(XP...

2020-03-11 11:12:59 1013

原创 6-5软件测试与测试优先编程

目的:1.了解测试的价值,了解测试优先编程的过程2.通过划分方法的输入和输出空间,找到其边界,并选择好的测试用例,能够为方法设计一个测试套件3.能够通过测量代码覆盖率来判断测试套件4.了解并知道何时使用blackbox与whitebox测试、单元测试与集成测试以及自动回归测试什么是软件测试?软件测试是为利益相关者提供有关被测产品或服务质量的信息而进行的调查。–这是执行程序或应用程序的...

2020-03-01 14:06:30 587

原创 1-2 软件构造的质量目标

课件翻译2:本节课程目的:1.To know quality factors to be cared in software construction软件构造过程中应考虑的重要质量指标▪ To understand the consequences if quality objectives cannot be achieved 如果达不到期望的质量目标,会有什么后果▪ To know ...

2020-02-23 16:13:06 504

原创 1-1软件构造的多维度视图

课件翻译课程目的:了解软件系统的三维构成▪ 了解用什么模型来描述软件系统的形态和状态▪ 把软件构建看作不同视图之间的转换多维软件视图-按阶段:构建和运行时视图-按动态:时刻和周期视图-按级别:代码和组件视图–每个视图的元素、关系和模型构建时间(Build time):概念(idea)需求(requirement)设计(design)代码(code)可安装/可执行包(in...

2020-02-22 11:15:53 704

原创 CSAPP大作业-hello的一生

CSAPP大作业-hello的一生摘 要本文通过介绍一个简单程序Hello的一生,详细分析了一个程序由诞生到执行再到消亡的典型过程。虽然程序执行的过程在程序员眼中只是屏幕上的显示的字符串,但在短短几ms内,程序却经历了预处理,编译,汇编链接,进程管理,IO管理,内存分配与回收等等一系列复杂的流程。同时也在本文中梳理了书本的知识,由hello的一生将整本书的内容连贯起来。关键词:程序人生;计...

2019-12-28 20:26:25 470 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除