首页 > 其他分享 >软构复习3

软构复习3

时间:2023-05-23 20:36:19浏览次数:36  
标签:复习 后置 规约 前置条件 软构 数据类型 方法 客户端

第四章 数据类型与类型检验

数据类型:

基本数据类型:int,double,long,boolean,char;对象数据类型:String;

区别:

 

静态类型检查:编译阶段报错,对类型的检查

语法错误,类名/函数名错误,参数数目错误,参数类型错误,返回值类型错误

动态类型检查:对值的报错

非法的参数值,非法的返回值,越界,空指针

 

不变性:

不可变数据类型:一旦被创建,其值不能被改变;

只能通过创建一个新的空间存储新的值来达到改变值的效果

final作为前缀:不能改变其地址,即:不可变的引用

故若不可变数据类型前用final,该变量不可更改

final+类:无法派生子类

final+变量:该变量无法改变值/引用

final+方法:该方法无法被子类重写

不变对象:一旦被创建,始终指向同一个值/引用

可变对象:拥有方法可以修改自己的值/引用

String是一个不可变对象

当有多个引用时,差异就出现了:

 

使用不可变类型,对其频繁的修改会产生大量的临时拷贝,需要垃圾回收,但安全

可变类型:适合于在多个模块之间共享数据

解决办法:防御式拷贝

 

Snapshot图

描述程序运行时的内部状态,便于刻画各类变量随时间变化

注意看PPT

抽象数据类型每个字段都有指向

一个列表的每一个index也都有指向

 

Final StringBuilder :一个不可变的引用和可变的值

 

第五章 设计规约

方法:规约+实现

规约:程序与客户端达成的一致,在调用的时候双方否必须遵守;客户端无需阅读调用函数的代码,只需理解spec即可;只讲“能做什么”不讲“怎么做”

行为等价性

站在客户端视角看行为等价性;

根据规约:这两个函数符合这个规约,故他们等价

规约

前置条件,对客户端的约束,在使用方法时必须满足的条件;

后置条件,对开发者的约束,方法结束时必须满足的条件;

如果前置条件满足了,后置条件必须满足;如果前置条件未被满足,方法可以做任何事情;

静态类型声明是一种规约,可据此进行静态类型检查;

Param:前置条件;throws和return:后置条件

方法的规范可以讨论方法的参数和返回值,但它不应该讨论方法的局部变量或方法类的私有字段。应考虑到该规范的读者是不可见的实现。

可变的方法

除非在后置条件里声明过,否则方法内部不应该改变输入参数;即:除非spec必须如此,否则不应修改输入参数;

尽量避免使用mutable的对象:

程序中可能有很多变量指向同一个可变对象(别名);

只能靠spec来保证类的实现体和客户端不保存可变变量的别名;

尽量使用不可变的数据类型:eg. String

 

设计规约

规约的确定性:一个输出or在一组输出中选择

规约的陈述性:描述了输出是什么还是明确的说明了如何计算输出

规约的强度:

spec变强:更松的前置条件+更严格的后置条件

越强的spec意味着程序员责任更重,客户端责任更轻

图示:程序员可以在规约的范围内自由选择实现方式,客户端无需了解具体使用了哪个实现;更强的规约表达为更小的区域

 

规约的质量

内聚的,描述的功能应单一简单易理解,若规约做了两件事,要分离开形成两个方法;

不能太弱,应尽可能考虑到各种特殊情况,在后置条件中作出处理;不能太强,给开发者增加了实现的难度;

可以在规约中使用抽象类型,给方法的实现体和客户端更大的自由度(eg.用List而不是ArrayList);

是否使用前置条件取决于:

check的代价:若检查的代价太大,就写入前置条件,把责任交给客户端;也就是,可以不检查前置条件,因为是客户的责任

关于参数的合法性,倾向于不写在前置条件里,而是将其放入后置条件,当参数不合法时就抛出异常,并尽可能的fail fast。

方法的使用范围:如果只在类的内部使用该方法(private),那么可以不使用前置条件,在使用该方法的各个位置进行check,责任交给内部client;如果在其他地方使用该方法(public),那么必须要使用前置条件,若client端不满足则方法抛出异常。

标签:复习,后置,规约,前置条件,软构,数据类型,方法,客户端
From: https://www.cnblogs.com/777-Song/p/17426295.html

相关文章

  • 关于软件构造第一部分(PPT0、1、3)的总结复习
     学而时习之,不亦说乎?在学习新知识的路上,我们应时时复习,总结所学知识,归纳吸收以建立自己的知识体系。故此,我现在对软件构造这门课的第一部分进行一些总结 一、软件构造的多维度视图:共有三个维度:1.按阶段划分:构造时/运行时视图,2.按动态性划分:时刻/阶段视图,3.按构造对象层次划分......
  • 复习C语言小问题
    1:强制类型转换的问题2:空间配置器的原理以及作用。3:复习C语言是支持隐式类型的转换的,但是这个转换的过程比较的“简陋”只用一个赋值运算符就完事了,但是有些类型转换是比较危险的,比如静态变量强制转换位非静态变量,因为静态变量存在寄存器中,编译器取的时候是寄存器中取得,如果用指......
  • []复习]cityengine2019/2022导入shp数据生成福田区建筑群
    时间是一把杀猪刀和人工智能比起来我太弱了.很无助.无法给自己升级系统.cityengine2019目前载入那种地区线上数据是行不通了,2022可以整一个邮箱试用一个月.https://www.esri.com/zh-cn/arcgis/products/arcgis-cityengine/trial/professionals我整了一个万能无线邮箱,无法注册,......
  • 第一章:复习与引申
    第一章:复习与引申1.关于矩阵秩的常见性质2.关于矩阵等价的常见性质3.关于向量组的极大线性无关组和秩......
  • C初级指针复习
    C初级指针复习:内存:内存中的每一个位置都由一个独一无二的地址标识每一个内存位置都包含一个值值和类型:不能简单地通过检查一个值的位来判断它的类型,为了判断值的类型(以及它的值),必须观察程序中这个值的使用方式,值的类型并非值本身所固有的一种特性,而是取决于它的使用方式NULL......
  • 软构复习2
    第二章 测试优先的编程测试&debug测试目标:证错  debug:识别错误并改正 测试等级:单元测试:函数级别;集成测试:多个类、包、组件、子系统系统测试:系统 静态测试&动态测试:靠眼睛看&撸起袖子使劲干静态测试:没有执行程序的情况下,检查源代码、语法和数据流动态测试:用给定的......
  • 软件构造复习(一)
    最近在复习软件构造,知识点感觉比较多,有些记不住的就在这里写一下以便回顾,如果有幸能帮到别人那就更好了。测试、异常、健壮性测试测试的等级按被测试部分的规模分为单元测试、集成测试、系统测试、验收测试回归测试:一旦程序被修改,重新执行之前的所有测试 黑盒测试/白盒测......
  • 软构笔记-7-面向对象的编程
    目录软构7基本概念Interface在interface中使用default方法继承与重写重写AbstractClass抽象类Polymorphism,subtypingandoverloading多态、子类型、重载三种多态Overloading重载重载的规则Overridingvs.Overloading子类型多态继承和子类型:层次结构一瞥软构7本章......
  • 软构学习-5、6-设计规约、抽象数据类型(ADT)
    目录5设计规约行为等价性Spec结构Spec强度比较Diagrammingspecifications6抽象数据类型(ADT)操作的抽象类型分类:RepresentationIndependence5设计规约本章大纲:方法的规约前置/后置条件欠定规约、非确定规约陈述式、操作式规约规约强度及其比较如何写出好的规约......
  • 软构笔记-8-ADT和OOP中的“等价性”
    目录软构8ADT的等价操作不可变数据类型的等价性==vs.equals()可变数据类型的等价性软构8本章大纲:理解特性之间的等价关系站在观察者角度,利用AF,定义不可变对象之间的等价关系引用等价性和对象等价性可变数据类型的观察等价性和行为等价性理解Object的契约,正确实现等......