2020春季学期哈工大软件构造学习心得三
Abstract Data Type (ADT) and ObjectOriented Programming (OOP)
前言
前两章回答了:什么是“高质量的软件”、 如何从不同维度刻画软件、软件构造的基本过程和步骤
本章:软件构造的理论基础——ADT ;软件构造的技术基础——OOP
程序设计语言中的数据类型
Java有几种基本数据类型
- int (for integers like 5 and -200, but limited to the range ± 2^31, or roughly ± 2 billion)
- long (for larger integers up to ± 2^63)
- boolean (for true or false)
- double (for floating-point numbers, which represent a subset of the real numbers)
- char (for single characters like ‘A’ and ‘$’ )
对象数据类型
- String字符串表示字符序列
- BigInteger表示任意大小的整数
基本数据类型 | 对象引用类型 |
---|---|
Immutable 不可变的 | 可变或不可变 |
在栈中分配内存 | 在堆中分配内存 |
代价低 | 代价高 |
将基本类型包装为对象类型,通常是在定义集合类型的时候使用它们,一般情况下,尽量避免使用,一般可以自动转换
Overloading operators/operations 重载
同样的操作名可用于不同的数据类型
对于Java中的数值原语类型,算术运算符+、-、*、/重载严重。
java是静态类型语言
所有变量的类型在编译时(在程序运行之前)是已知的,因此编译器也可以推断出所有表达式的类型。在编译阶段进行类型检查
相反,类似Python的动态类型语言在运行阶段进行类型检查
对bug的捕捉能力:静态类型检查 >> 动态 >> 无检查,原因是静态类型检查可在编译阶段发现错误,避 免了将错误带入到运行阶段,可提高程序正确性/健壮性
Static checking | Dynamic checking |
---|---|
语法错误,类名/函数名错误,参数数目错误,参数类型错误,返回值类型错误, | 非法的参数值,非法的返回值, 越界, 空指针 |
关于“类型”的检查,不考虑值 | 关于“值”的检查 |
一些真正应该动态检查的错误根本就不会被检查
例如,整数除法:5/2不返回分数,它返回一个截断的整数。整数溢出。如果计算结果太正或太负而无法适应这个有限的范围,它会悄悄地溢出并返回一个错误的答案。(无静态/动态检查!)
可变性与不变性
改变一个变量:将该变量指向另一个值的存储空间
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
不变性:重要设计原则
不变数据类型:一旦被创建,其值不能改变
不变对象:一旦被创建,始终指向同一个值/引用
可变对象:拥有方法可以修改自己的值/引用
如果是引用类型,也可以是不变的(要使引用不可变,请使用关键字final声明它):一旦确定其指向的对象,不能再被改变
如果编译器无法确定final变量不会改变,就提示错误,这也是静态类型检查的一部分。
尽量使用 final变量作为方法的输入参数、作为局部变量。
final类无法派生子类;final变量无法改变值/引用;final方法无法被子类重写
因为字符串String是不可变的,一旦创建,字符串对象总是具有相同的值,要在字符串末尾添加内容,必须创建一个新的字符串对象
StringBuilder是可变类型的一个示例。它具有删除字符串部分、插入或替换字符等方法。此类具有更改对象值的方法,而不仅仅是返回新值:
当只有一个引用指向该值,可变性与不变性没有区别使用
不可变类型,对其频繁修改会产生大量的临时拷贝(需要垃圾回收),但不可变类型更“安全”, 在其他质量指标上表现更好
可变类型最少化拷贝以提高效率,使用可变数据类型,可获得更好的性能,也适合于在多个模块之间共享数据
例,使用时间Date进行引用比较等
使用时间Date时,使用包中的一个类java.time.:LocalDateTime、Instant等。它们的规范都保证它们是不可变的。或者通过防御式拷贝,返回一个全新的Date对象,大部分时候该拷贝不会被客户端修改,可能造成大量的内存浪费。如果使用不可变类型, 则节省了频繁复制的代价
安全的使用可变类型:局部变量,不会涉及共享;只有一个引用 ;如果有多个引用(别名),使用可变类型就非常不安全
Software construction: transformation btw views
快照图(Snapshot diagrams)表示程序在运行时的内部状态——其堆栈(正在进行的方法及其局部变量)和堆(当前存在的对象)
快照图为我们提供了一种可视化的方法来区分更改变量和更改值之间的区别:
当您分配给变量或字段时,您正在更改变量箭头指向的位置。你可以把它指向另一个值。
当你给一个可变值的内容赋值时,比如数组或列表,你就是在改变这个值里面的引用。
不可变对象:用双线椭圆,如String s = “a”; s = s + “b”;
Java提供了不可变的引用:只分配一次而从不重新分配的变量。
要使引用不可变,请使用关键字final,如果Java编译器不相信您的final变量在运行时只被赋值一次,那么它将产生编译器错误。所以final对不可变的引用进行了静态检查。在快照图中,不可接受的参考(最终)用双箭头表示。
引用是不可变的,但指向的值却可以是可变的。可变的引用,也可指向不可变的值
对象是值,在快照图中用圆圈表示,不可变的对象有一个双边框,表示它从不更改其值。
引用是指向对象的指针,由快照图中的箭头表示,不可变引用是带有双线的箭头,表示不能移动箭头以指向其他对象
2020春季学期哈工大软件构造学习心得三相关推荐
- 2020春季学期哈工大软件构造学习心得一
前言: 今年是特殊的一年,由于新冠病毒的爆发,导致我们无法正常开学,所以网上开课如期进行,其中软件构造是这学期我们要面临的巨大挑战. 准备工作: 上学期末得知本门课程需要学习Java语言进行编程,所以 ...
- 2020春季学期哈工大软件构造学习心得二
前言 上一章主要讲了软件构造的结果形态以及如何是一个"好"的软件 这一章主要学习软件开发遵循着一个什么样的过程 - 软件生命周期与配置管理 From 0 to 1,from 1 t ...
- 2020春季学期哈工大软件构造学习心得五
面向对象的编程 面向对象的标准 "准备更改"和"为重用而设计"的泛型(泛型):应该可以用表示任意类型的形式泛型参数编写类. 继承:应该可以将一个类定义为继承自另 ...
- 2020春季学期哈工大软件构造学习心得四
程序设计语言中的函数和方法 参数类型是否匹配,在静态类型检查阶段完成 返回值类型是否匹配,也在静态类型检查阶段完成 规约:交流编程 Spec给"供需双方"都确定了责任,在调用的时候 ...
- HIT-2022年春季学期《软件构造》Lab 1实验心得
目录 2022年春季学期计算学部<软件构造> 课程Lab 1实验心得 1.实验目标概述 2.实验环境配置 3.实验过程 3.1 Magic Squares 3.2 Turtl ...
- 哈工大软件构造学习笔记1 Views and Quality Objectives of Software Construction
先要搞清楚软件构造的对象是什么,如何刻画,在关注如何构造. 1,Five key quality objectives of software construction 软件构造的五个关键质量目标 容 ...
- HIT软件构造-学习心得
伪代码编程 伪代码是指某种用来描述算法.子程序.类或完整程序的工作逻辑的.非形式的.类似于英语的记法. 1. 用类似英语的语句来精确描述特定的操作 2. 避免使用目标编程语言中的语法元素 这点是关键, ...
- 2022哈工大软件构造lab1小结(知识点)
哈工大软件构造lab1小结 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 问题一 使用的库 异常处理机制 字符串内容检查 写入文件 问题二 problem 3:画一 ...
- 哈工大软件构造期末知识点总结
哈工大软件构造试题构成: 1.30-45分的选择题,10-20题 2.55-70分的简答与设计题,5-6题 考试知识点(不全面): 1.git工具的知识点 2.Java设计模式(一共有23个,主要考察 ...
最新文章
- SignalR系列续集[系列8:SignalR的性能监测与服务器的负载测试]
- Linux--根文件系统的挂载过程分析
- 5天玩转mysql视频教程_六天带你玩转MySQL
- 解决“第一次偶然出现的异常”问题
- python 线性拟合 图_python线性拟合
- 2013-2-19 Android之ActionBar学习(转)
- arch linux界面优化,ArchLinux美化之界面美化
- pcl_view简单使用
- BCDboot 命令行选项
- python | prophet的案例实践:趋势检验、突变点检验等
- 教学系列CentOS安装和配置无线网卡
- 汽车厂自制的流水线边 物料亮灯防错系统
- Focal Loss 安装与使用 TensorFlow2.x版本
- windows中docker 安装和使用
- NetBeans工具学习之道:NetBeans IDE Java 快速入门教程
- mysql假死_win7系统假死的5种情况和处理方法
- PyTorch学习率衰减策略:指数衰减(ExponentialLR)、固定步长衰减(StepLR)、多步长衰减(MultiStepLR)、余弦退火衰减(CosineAnnealingLR)
- 类似obs直播工具有哪些_如何使用OBS直播职业玩家之类的游戏
- 微信小程序中尺寸单位rpx及样式的用法
- itchat和php,Python使用itchat 功能分析微信好友性别和位置