- 博客(16)
- 收藏
- 关注
原创 软件构造课笔记:第12章——面向正确性与健壮性的软件构造
异常是代码将错误或异常事件传递给调用它的代码的一种特定方式。其他异常:由外部原因造成,非运行时异常,是程序员无法完全控制的外在问题所导致的,即使在代码中提前加以验证(文件是否存在),也无法完全避免失效发生。异常也可以使用throws声明或try/catch进 行捕获,但大多数时候是不需要的,也不应该这么做—— 掩耳盗铃, 对发现的编程错误充耳不闻。然后,使用您的方法的代码将不得不处理该异常(如果无法处理,则可以选择声明它抛出异常)。异常出现的时候,要做一些试图恢复它的动作而不要仅仅的打印它的信息。
2024-06-21 23:38:16
782
原创 软件构造课笔记:第11章——面向可复用性和可维护性的设计模式
有新的具体产品类 加入时,可以在工厂类里修改或增加 新的工厂函数 (OCP),不会影响客户端代码。当 client 不知道要创建哪个具体类的实例,或者不想在 client 代码中指明要具体 创建的实例时,用工厂方法。定义一个用于创建对象的接口,让其子类来决定实例化哪一个类,从而使一个 类的实例化延迟到其子类。通过增加一个接口,将已存在 的子类封装起来,client面向接口编程,从而隐藏了具体子类。解决方案:将通用接口实现为要扩展的对象,添加功能,但将主要责任委派给底层对象。为对象增加不同侧面的特性。
2024-06-21 17:06:18
465
原创 软件构造课笔记:第10章——面向可维护性的构造技术
解析树的叶子用终端标记,表示已解析的字符串的部分。为了描述一系列符号,无论它们是字节、字符还是从固定集合中提取的其他类型的符号,我们使用一种称为语法的紧凑表示。1959年6月,Backus Normal Form (BNF)首次提出,以递归形式描述 语言的各种成分,凡遵守其规则的程序就可保证语法上的正确性。但模块自身的代码是不应被修改的,扩展模块行为的一般途径是修改模块的内部实现。模块化编程是一种设计技术,它强调将程序的功能分离为独立的、可互换的模块,使得每个模块都包含执行所需功能的一个方面所需的一切。
2024-06-17 23:24:13
840
原创 软件构造课笔记:第9章——面向复用的软件构造技术
定义泛型类型时,会自动提供一个对应的原始类型(非泛型类型),原始类型的名字就是去掉类型参数后的 泛型类型名。两个类之间的这种形式的关系被称为“使用-一种”关系,其中一个类使用另一个类,而没有将其实际合并为属性-例如,它可以是一个参数或在方法中本地使用。委派只是指一个对象在其功能的某个子集上依赖于另一个对象(一个实体将某些东西传递给另一个实体)委派/委托:一个对象请求另一个对象的功能,例如,分拣机正在将功能委托给某个比较器。-子类将只有必要的方法来委托给超类对象的方法,而不是继承所有的超类方法。
2024-06-17 20:12:05
645
原创 软件构造课笔记:第8章——ADT和OOP中的“等价性”
对于抽象数据类型,抽象函数(AF)解释了如何将具体表示值解释为抽象类型的值,我们看到了抽象函数的选择如何决定如何编写实现ADT的每个操作,抽象函数AF:内部表示→抽象表示。站在外部观察者角度:对两个 对象调用任何相同的操作,都 会得到相同的结果,则认为这 两个对象是等价的。现实中的每个对象实体都是独特的,所以无法完全相等,但有“相似性”,在人类语言和数学中,“绝对相等”是存在的。使用AF作为等式的定义,我们说a等于b当且仅当AF(a)=AF(b)映射到同样的结果,则等价。由抽象函数引发的关系是等价关系。
2024-06-17 11:44:10
499
原创 软件构造课笔记:第7章——面向对象的编程
泛型编程围绕“从具体进行抽象”的思想,将采用不同数据表示的 算法进行抽象,得到泛型化的算法,可以得到复用性、通用性更强 的软件。泛型编程是一种编程风格,其中数据类型和函数是根据待指定的类型编写的,随后在需要时根据参数提供的特定类型进行实例化。如果使用子类的对象来调用该方法,则将执行子类中的版本。区分一个设计良好的模块和一个糟糕的模块的一个最重要的因素是它对其他模块隐藏内部数据和其他实现细节的程度。行为:对象支持的操作,在Java中,这些被称为方法,方法只是OO为函数说话,调用方法=调用函数。
2024-06-17 11:10:56
699
原创 软件构造课笔记:第6章——抽象数据类型(ADT)
通过前提条件和后置条件充分刻画了ADT的操作,spec规定了client和implementer之间的契约,明确了client知道可以依赖哪些内容,implementer知道可以安全更改的内容。法”的 (RI) 选择某种特定的表示方式 R ,进而指定某个子集是“合 ,并为该子集中的每个值做出“解释” (AF) —— 即如何映射 到抽象空间中的值。抽象类型:强调“作用于数据上的操作”,程序员和client无需关心数据如何具体存储的,只需设计 / 使用操作即可。操作的行为应该 是内聚的。
2024-06-17 01:37:40
910
原创 软件构造课笔记:第5章——设计规约
(2) 方法的使用范围 ,那么可以使用前置条件 会保证前置条件 ) ( 方法内部 ,在使用该方法的各 个位置进行 check —— 责任交给内部 client 如果在其他地方使用该方法 法内部检查输入是否满足 ) (public);一个好的“方法”设计,并不是你的代码写的多么好,而是你对该方 法的spec设计的如何。太弱的spec,client不放心、不敢用(因为没有给出足够的承诺)。“方法”是程序的“积木”,可以被独立开发、测试、复用 使用“方法”的客户端,无需了解方法内部具体如何工作 — “抽象”
2024-06-16 23:26:09
1690
原创 软件构造课笔记:第4章——数据类型与类型检验
数据类型:一组值以及可以对其执行的操作变量:用特定数据类型定义,可存储满足类型约束的值所有非原始类型的根类型都为Object如果省略了extends语句,则默认继承自Object一个类是其所有父级类的一个具体类型,类可以从它的父级类中继承可见的字段和方法,类可以覆盖继承的方法来改变它们的行为。
2024-06-16 20:27:39
1407
原创 软件构造课笔记:第3章——软件构造过程与配置管理
重构会带来短期的时间/工作成本,以获得长期的利益,并对您的系统的整体质量进行长期的投资。建模语言:建模语言是任何人工语言,可以用来表达由一组一致的规则定义的结构中的信息、知识或系统的语言,目的是可视化、推理、验证和交流系统的设计。瀑布过程:线性推进,阶段划分清楚,整体推进 ,无迭代 ,管理简单, 无法适应需求 ,增加/变化。增量过程:线性推进,增量式(多个瀑布的串行),无迭代,比较容易适应需求的增加。形态上划分:基于语言学的构造语言,基于数学的形式化构造语言,基于图形的可视化。
2024-06-16 19:57:15
632
原创 软件构造课笔记:第2章——软件测试与测试优先的编程
当你有一大堆未经验证的东西时,不要把测试留到最后,将测试留到最后只会使调试时间更长而且更痛苦,因为bug可能在代码中的任何位置。具有高代码覆盖率的程序,通常用百分比衡量覆盖度,代码覆盖度越低,测试越不充分但要做到很高的代码覆盖度,需要更多的测试用例,测试代价高。包含输入,执行条件,期望结果。因为暴力穷举不可能,仅靠偶然的个例测试没有太大意义,必须有严密的逻辑进行全面测试。黑盒测试试图发现以下类型中的错误:不正确或缺失的函数,接口错误,数据结构或外部数据库访问中的错误,行为或性能错误,初始化和终止错误。
2024-06-16 16:16:47
585
原创 软件构造课笔记:第1章——软件构造的多维度视图和质量目标
版本控制(Version Control),也称为源代码控制,是一种管理计算机文件及其变更历史的系统,广泛应用于软件开发、文档编辑等需要跟踪文件变更的领域。版本控制系统(VCS)允许团队成员协同工作,记录每次文件的修改,回溯到任何版本,比较不同版本之间的差异,并在出现冲突时进行合并和解决。包括三种相互关联的形式:面向词汇的源代码,面向语法的程序结构(例如,抽象语法树(AST)),面向语义的程序结构(例如类图)构造的重点:先要搞清楚:软件构造的对象是什么、如何刻画,然后再关注:如何构造。
2024-06-16 01:20:52
306
原创 软件构造课笔记:第0章——开发高质量的软件系统
这门课的目的在于在高级语言程序设计的基础上,认识软件构造的质量标准与目标,学习软件 构造的基本过程,从而具备面向质量目标的复杂软件构造方法与能力,深入学习抽象数据类型ADT 与面向对象编程OOP,初步掌握面向关键质量目标(可理解性、可维护性、可复用性、健壮性、时 空性能)的软件构造基本技术,了解软件代码重构和面向更复杂软件系统的高级构造技术软件构造课:软件系统=构造复杂数据结构+对复杂数据结构的组合使用。
2024-06-16 00:05:48
173
原创 哈工大计算机系统ICS2024大作业-hello程序的一生
本论文旨在通过运用在计算机系统课程中所学知识,在复习与回顾的基础上,逐步分析hello.c程序在预处理,编译,汇编,链接,加载到执行到回收等过程。通过使用Linux系统下的工具,来分析hello程序的一生,并借此了解c语言程序的执行流程和执行时各硬件的工作情况,对计算机系统编译源文件、运行进程等机制进行较深入的分析和介绍。
2024-06-13 10:51:24
557
空空如也
scanf设置读取整型时,读取到符号出现的问题
2022-12-22
TA创建的收藏夹 TA关注的收藏夹
TA关注的人