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

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

设计规约

1.规约的强弱
前置条件更弱,或后置条件更强的规约,是较强的规约。如果一个规约强于另一个规约,则可以用较强的代替较弱的。

2.规约越强,开发者的责任越重,使用者的责任越轻。如Lab1的GenerateMagicSquare,如果规约要求必须输入奇数(较强前置条件),则需要用户进行操作。如果不要求必须输入奇数(较弱前置条件),开发者就需要在程序中添加对输入奇数的操作。
3.某个具体实现,如果满足规约,则落在其范围内;否则在其之外。越强的规约,对应的面积越小。

抽象数据型(ADT)

1.ADT的特性:表示泄露、抽象函数AF、表示不变量RI。AF、RI用户不可见。
2.ADT是由操作定义的,和内部实现无关。

ADT类型和方法的分类

1.ADT可以分为可变和不可变数据类型。可变类型的对象提供了可改变其内部数据的值的操作(如StringBuilder);不可变数据类型的操作不改变内部值,而是构造新的对象(如String)。
2.抽象类型的方法分类:构造器、生产器、观察器、变值器。
生产器,例如String.concat(),以两个String对象为参数,返回一个新的String对象。
观察器,例如List.size(),返回int。
变值器,例如List.add(),改变对象属性。 !!!只在可变类型中出现

3.构造器可以实现为构造方法或者静态方法。实现为静态方法称为工厂方法,工厂方法属于类,而不属于某个具体对象。
4.返回void一定是变值器,如果返回void则必然改变了对象的某些内部状态。变值器不一定返回void。

表示独立性

用户使用ADT时无需考虑其内部实现,ADT内部表示的变化不影响spec和客户端。
违反表示独立性的例子:严格限制了people的类型

遵循表示独立性的例子:同时把people改为private

测试ADT

测试构造器、生产器、变值器:调用观察器查看结果是否满足规约
测试观察器:调用构造器、生产器、变值器产生或改变对象,查看结果是否正确

ADT不变量

1.不变量在任何时候都是true。
2.由ADT负责不变量,不变量和客户端的任何行为无关。
3.总是要假设用户有“恶意”破坏ADT的不变量(防御式编程)。
4.除非迫不得已,不要把希望寄托于客户端上,ADT有责任保证自身的不变量,并且避免“表示泄露”。最好的办法就是使用不可变的类型,彻底避免表示泄露。
5.如果一个类不是不可变的,改变属性的方式:
-通过属性中的操作
-表示暴露,方法返回属性的引用

RI和AF

1.抽象值构成的空间是客户端看到和使用的值(真实的数据)。ADT开发者关注表示空间R,客户端关注抽象空间A。

2.R空间到A空间满足的性质:
-满射,用户使用的数据必须在表示空间出现。
-未必单射,抽象空间的值可能对应表示空间的多个值
-未必双射,表示空间的值可能无法对应抽象空间的值
3.AF:R->A(抽象函数)给出R空间的数据,如何映射到A空间的解释。
RI:R->boolean(表示不变性)某个具体的表示是否是合法的。也可以将RI看成所有表示值的一个子集,包含了所有合法的表示值。同时可以将RI看作描述什么是合法表示值的条件。

4.选择某种特定的表示方式R,进而指定某个子集是合法的(RI),并为该自己中的每个值做出解释(AF),即如何映射到抽象空间的值。在设计ADT时,先确定AF再确定RI。
5.在所有可能改变rep的方法内都要检查RI是否满足。

有益可变性

1.对不可变ADT来说,它在A空间的抽象值是不变的。但R空间的表示值是可以变化的。
2.不可变类型的属性不一定不能改变。只要不影响A空间数据的变化,属性改变是可以的。

表示泄露的安全声明

给出理由证明代码并未对外泄露其内部表示。

总结

1.ADT规约里只能使用客户端可见内容来撰写,包括参数、返回值、异常等。如果规约里需要提及“值”,只能使用A空间的值。
2.ADT规约里不应该谈及任何内部表示的细节,以及R空间的任何值。
3.ADT的内部表示(private属性)对外部严格不可见。
4.在注释而不是Javadoc中写AF和RI,防止被外部看到而破坏表示独立性和信息隐藏。
5.表示泄露的风险:一旦泄露,ADT的内部表示可能在程序的任何位置发生改变,而不是限制在ADT内部,从而无法保证ADT不变量是否始终为true。
6.检测ADT保持不变量的三个标准:
-创建对象的时候满足不变量为true——对应creators、producers
-属性改变时满足不变量为true——对应mutators、observers
-没有发生表示泄露

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

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

相关文章

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这三个数字,但结果并不是我们今…

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

磕磕绊绊也算是完成了最后一个实验。记录一下实验中遇到的问题。 IDEA中SpotBugs的安装和使用 从网上找教程,都说IDEA没有使用版权。结果我直接在插件中就找到了。点击安装并重启即可。 使用时,选择需要操作的项目/包/类点击右键,就能看到S…

使用ML.NET模型生成器来完成图片性别识别

什么是ML.NET?ML.NET 使你能够在联机或脱机场景中将机器学习添加到 .NET 应用程序中。借助此功能,可以使用应用程序的可用数据进行自动预测。机器学习应用程序利用数据中的模式来进行预测,而不需要进行显式编程。ML.NET 的核心是机器学习模型…