软件构造学习笔记-第四周

本周重点介绍了mutable和immutable的概念,有些抽象。对于immutable的数据类型来说,想修改其引用指向的值,必须使其指向新的内存区域,而不能在原有的内存区域做修改。mutable数据类型相反,可以在原来指向的内存区域进行修改。设计ADT时,尽量将小的数据型的ADT设置为immutable,提高程序健壮性。

静态/动态类型检查

1.数据类型:基本数据类型和对象数据类型的对比。

2.对象类型具有层次结构,除了Object类之外的所有类都有父类。Object是所有类的父类。Java中只支持单继承。
3.静态检查:在不运行程序的前提下的检测。Java是一种静态类型语言,所有变量的种类在编译阶段已经明确。在Eclipse中,静态检测在写代码的时候就已经进行,在不合法的位置会用标记指明。静态类型检查可以在编译阶段发现错误,避免将错误带入运行阶段,可以提高程序的正确性和健壮性。
静态检查可以发现的错误:语法错误、函数名/类名错误、参数数目错误、参数类型错误、返回值类型错误等。

4.动态检查:像Python一类的动态类型语言,在程序运行阶段才进行类型检查。动态类型检查>>静态类型检查>>无检查,因为动态类型检查可以针对具体的值进行检查(比如除数为0的问题)。静态检查是关于“类型”的检查,不考虑值;动态类型检查是关于“值”的检查。
动态检查可以发现的错误:非法参数值、非法返回值、越界、使用空指针等。

可变/不可变数据类型

1.改变一个变量:将该变量指向另一个值的存储空间。
改变一个变量的值:将该变量当前指向的值的存储空间中写入一个新的值。
2.final限定变量的指向是不可改变的。如果编译器不能确定final变量不会改变,就会提示错误,也是静态类型检查的一部分。
final类无法派生子类;final变量无法改变值和引用;final方法无法被子类重写。
3.不变对象:一旦被创建,始终指向同一个值/引用。
可变对象:拥有方法可以修改自身的值/引用。
String类是不可变类的一种。如果要改变一个String对象,则需要将引用修改后的存储空间。

StringBuilder是一种可变类。如果改变一个StringBuilder对象,则对原本存储区域的内容修改即可。

4.当一个值只有一个引用时,可变与不可变没有区别。当有多个引用时会有很大区别。

5.使用不可变类型时,对其频繁的修改会产生大量的临时拷贝(需要被回收);可变类型最小化拷贝,提高了效率。不可变类型使用时更加安全,在其它质量指标上的表现更好。使用时需要权衡折中。
6.可以通过防御式拷贝(比如返回一个新的对象)来修正可变类型造成的bug。但是大部分时候拷贝不会被客户端修改,会造成大量的内存浪费。如果使用不可变类型,就节省了频繁复制的代价,不可变可以比可变的效率更高,因为不可变从不做防御式拷贝。
7.将可变转换成不可变:
使用传入的引用->利用传入引用建立新的对象再使用(在方法中使用复制对象)
返回引用->返回新的对象(即返回一份复制)

Snapshot

1.属于三维视图的Run-time、Moment、Code层面,用于描述程序运行时的内部状态。便于交流和理解设计思路。
2.基本类型的值和对象类型的值在SnapshotDiagram中的表示

对象存储在堆中,用椭圆形状标明。基本数据类型和对象的引用存储在栈中。基本数据类型的标识符不会存放在栈中。
对于不可变对象,用双线椭圆。
String s = “a”;
s = s + “b”;

3.final限定引用(!!!)不可改变。引用不可变,但是引用指向的存储区域的值是可以改变的。对于不可变引用,用双线。可变的引用,也可以指向不可变的值。
例如:新建一个final的List称为a,可以使用add向a中添加值,但是不能让a指向另一个List。

可变类型 List Set Map

参考https://www.cnblogs.com/jxxblogs/p/11561629.html
1.List
大小可变(数组不可变)。
可以通过位置存储、访问数据。
List是接口,且成员必须是对象。
2.Set
Set是零或多个对象组成的无序集合,不允许元素重复。
Set是接口,成员是对象。
3.Map
和Python中的Dictionary类似,是由二元组(key-value)构成的。
不允许key值重复。
Map是接口。

迭代器 Iteration

1.主要用途是对集合进行遍历。iteraror有两个方法:next()返回集合中的下个元素,hasNext()测试迭代器是否达到集合末尾元素。

2.如果要遍历集合并删除指定元素的话,必须使用迭代器。
错误示范:

正确示范:

不可变类型

1.基本类型及其封装对象类型都是不可变的。
2.使用Collections.unmodifiableList、Collections.unmodifiableSet、Collections.unmodifiableMap方法将List、Set、Map包装成不可变类型。但是这种不可变是在运行阶段获得的,在编译阶段无法据此进行静态检查。即如果在编译阶段尝试修改包装类属性,编译器不会报错。

有关规约书写

1.规约是程序和客户端之间达成的一致。只讲“能做什么”,不讲“怎么实现”。规约不只是注释,还包括返回值、参数、方法名。

2.规约不包括方法具体实现的内容。规约中的方法都是public方法。代码中蕴含的设计决策针对编译器,而规约(注释)的设计决策针对读者。
3.行为等价性从用户视角出发,根据规约判断行为是否等价。如果两个函数符合同一规约,则它们等价。
4.前置条件:对客户端的约束,即在使用方法时必须满足的条件。
后置条件:对开发者的约束,方法结束时必须满足的条件。
如果前置条件满足,后置条件必须满足。前置条件不满足,方法可做任何事。
5.用@param规范化前置条件,用@return和@throws规范后置条件。

6.如果改变了输入数据(mutating methods),要在规约中明确指出。除非规约要求,否则不应修改输入参数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/307236.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

壹佰文章总结| 关于ASP.NETCore的分享之路

公众号不让放外网链接,点击【阅读原文】,去我的博客园,可以看对应的详细文章。(关于学习ASP.NET Core需要了解和掌握的知识点图)一言不合就来图,各位博客园小伙伴大家好,感觉好久没有写文章了&a…

软件构造学习笔记-第五周

本周讲了AF、RI、Safety from rep exposure、spec等概念。这些是辅助程序设计的重要部分,需要在代码中以注释的形式体现,可以显著提高代码可读性,明确设计的目的。必须要养成写的习惯!!! 设计规约 1.规约…

EFCore之SQL扩展组件BeetleX.EFCore.Extension

EFCore是.NETCore团队开发的一个ORM组件,但这个组件在执行传统SQL的时候并不方便,因此BeetleX.EFCore.Extension的设计目的是让EFCore执行传统SQL更简单方便。引用在使用组件之前需要引用它,可以通过以下地址获取最新版本https://www.nuget.o…

软件构造学习笔记-第六周

这周的重点是重载和重写。重载要求两方法的签名必须不同,而重写则要求两方法的签名必须相同。重载可以发生在同一个类中,也可以发生在父类和子类中;重写必须发生在父类和子类中。接口/抽象类不具有构造方法,只有将内部的抽象方法全…

云原生时代,.NET5必将称王!

“ 随着互联网持续高歌猛进,相关技术名词也是层出不穷。微服务、容器化、DevOps、ServerLess、FaaS,这两年最火的,当属云原生Cloud Native!当下大部分企业还在追逐微服务架构落地,而下一代的架构云原生已如火如荼。程序…

软件构造学习笔记-实验2

P1 1.设计目标 首先对图的ADT进行两种实现(从边和顶点出发),然后选择一种实现的ADT,根据输入的文件构建语料库,再利用构建的语料库,对输入字符串进行插入操作,并返回修改后的字符串。 2.有关AF…

海棠读社小程序研发(.Net Core版)

今天这篇博文是介绍海棠读社小程序开发的技术博文,由于博主是技术出身,开发过小程序和公众号,所以从决定做海棠读社开始就写代码了。因为只有技术和文化相结合,更能使传统文化大放异彩,更好地传播、讲好中国故事。漓江…

软件构造学习笔记-第七周

本周只有一节课,内容较少。对于不可变类型的相等比较,需要重写equals和hashCode方法,实现观察等价性。对于可变类型,不建议重写以上两方法,按照默认比较方式(比较内存地址)即可。 可变类型的相…

asp.net core监控—引入Prometheus(五)

上一篇博文中说到Prometheus有四种指标类型:Counter(计数器)、Gauge(仪表盘)、Histogram(直方图)、Summary(摘要),并且我们做了一个Counter的Demo&#xff0c…

软件构造学习笔记-第八周

本周重点是Liskov可替换原则。它要求父类和子类的行为一致性,子类要有更强的不变量、更弱的前置条件、更强的后置条件。在该原则的要求下,每个子类都可以对父类进行替换。这在开发过程中会带来极大的便利,在实验3中学习并运用该原则。 有关复…

C# 中的只读结构体(readonly struct)

翻译自 John Demetriou 2018年4月8日 的文章 《C# 7.2 – Let’s Talk About Readonly Structs》[1]在本文中,我们来聊一聊从 C# 7.2 开始出现的一个特性 readonly struct。任一结构体都可以有公共属性、私有属性访问器等等。我们从以下结构体示例来开始讨论&#x…

软件构造学习笔记-第九周、第十周

因为本周五开始五一假期,所以只有一节软件构造课。因为内容还属于创建模式、结构模式、行为模式。将该堂课的内容整合到本博客中。本周的重点是程序开发模式,在写代码之前首先充分考虑采用哪种模式更有利于开发、维护。采用合适的设计模式帮助理清思路&a…

回顾 | 使用Visual Studio Code进行端到端应用程序开发

点击蓝字关注我们,获得更多课程吧~微软Reactor 为帮助广开发者,技术爱好者,更好的学习 Python,数据科学,机器学习,AI,区块链等技术,将每周三到周六,组织 3~5 场线上分享活…

软件构造学习笔记-第十一周

本周的内容是,比较各个设计模式的区别和联系,并介绍了状态模式和备忘录模式,以及正则表达式。正则表达式用于对文本文件的处理。在实验3中有一项要求是对输入文本进行解析,构造航班。要求表达式不仅要读入合法数据,还要…

实现 OutOfMemory​

通过代码实现 OutOfMemoryIntro来尝试写一个发生 OutOfMemoryException 的代码吧,开启煞笔代码第三篇 —— OutofMemoryOutOfMemoryOutOfMemory 顾名思义就是内存不足,在 .NET 中当内存不足的时候就会抛出 OutOfMemoryException 的异常。想要触发 OutOfM…

软件构造学习笔记-实验3

本次实验要求从五项要求(航班管理、高铁车次管理、操作系统进程管理、大学课表管理、学习日程管理)里完成三项要求,并且尽量实现复用。 面向可复用性和可维护性的设计:PlanningEntry 1.首先设计一个类CommonPlanningEntry来实现…

用 Span 对 C# 进程中三大内存区域进行统一访问 ,太厉害了!

一:背景 1. 讲故事前段时间写了几篇 C# 漫文,评论留言中有很多朋友多次提到 Span,周末抽空看了下,确实是一个非常????????的新结构,让我想到了当年的WCF,它统一了.NET下各种零散的分布式技术&#…

福利 | 全网疯传免费领,一整套算法课程,拿走不谢!

算法对于程序员而言,到底有多重要,这已经是一个老生常谈的话题了。我看过很多有潜力且非常努力的程序员,在进阶高级工程师或架构师的路上,栽在了“算法”上,说实话,我并不意外。如果说得功利和实际一些&…

软件构造学习笔记-第十二周

本周介绍了异常以及异常的处理。Java的异常机制将处理异常的代码整合到一个代码块中,而不是通过if-else进行处理,提高了代码整体的简洁性。同时,异常机制可以更加详细地说明错误类型、引起错误的位置、错误信息,对程序健壮性十分有…

C#中LINQ与数据管道

假如有一个集合,里面有数字1-10,现在想实现从这10个数字中取出偶数数字,然后将得到的偶数乘以10,最后输出前三个。代码如下:代码非常的简单,最后会得到20、40、60这三个数字,但结果并不是我们今…