HIT软件构造课程3.2总结(Designing Specificaton)
本节转向“方法/函数/操作”如何定义
上一节是名词 这一节是动词
1.编程语言中的函数和方法
方法
使用者不需要知道方法内部如何实现,这叫做“抽象”。
参数
参数类型是否匹配,在静态检查时完成。
返回值
2.规约:程序用于沟通
(1)程序中的文档
java API
- 类的层次,类接口的实现列表
- 直接的子类,对于一个接口的实现类
- 类的描述
- 构造方法
- 能调用的所有方法
- 对于每个构造器和方法的详细说明,方法签名:返回类型,方法名,参数,例外情况。
设计文档
程序的沟通
代码中蕴含的设计决策:给编译器读
注释形式的涉及决策:给自己和别人读
(2)规约和契约(方法的)
规约(契约)
client:客户端,implementer:实现者
双方都要遵守
为什么做规约
客户端只需理解spec即可
规约可以隔离变化,无需通知客户端。规约可以提高代码效率(输入正确性由调用者保证)
扮演“防火墙”角色:调用者不需知道具体实现,实现者不需知道具体输入实现(解耦)
只说能做什么,不说具体实现
(3)行为等价性
站在客户端角度看行为等价性。
根据规约判断行为是否等价
(4)规约结构:前置条件和后置条件
规约结构
前置条件是需求,后置条件是效果。
前置条件约束客户端,后置条件约束开发者。
前置条件满足则后置条件必须满足。
Java中的规约
静态类型声明也是一种规约,据此可以进行静态类型检查。
方法前的注释也是一种规约,但是需要人工判定是否满足。
前置条件:@param 后置条件:@return @throws:避免重复,可以不写类型
规约可能讨论什么
可以讨论参数和返回值,例外情况,但是不能局部变量和私人领域。
可变方法的规约
可变方法会改变参数值。
除非在后置条件里面说明过,否则方法内部不应该改变输入参数。尽量少使用可变的对象。
可变对象让契约变得复杂
程序中可能有很多变量指向同一个可变对象,无法强迫类的实现和客户端不保存可变变量的别名。
可变对象减少了可变性
使用不可变的对象,在规约里面限定住。
(5)测试规约
黑盒测试
不知道内部实现。我不知道谁是错的,但是我知道怎么错。
(接口的规约override,不用再写一遍)
3.设计规约
(1)规约的分类
比较规约
判断哪个规约更好:规约的正确性、规约的强度、规约的陈述性。
规约的强度
规约强度大小:前置条件越弱规约越强,后置条件越强规约越强。
可以用强规约替代弱规约。
越强的规约,意味着开发者的自由度和责任越重,而调用者的责任越轻。
规约的确定性
给定一个的输入,输出是唯一的、明确的。
操作式和声明式规约
操作式规约:伪代码,声明式规约:只有初终状态。
声明式规约更有价值,内部实现的细节不在规约里呈现。放在代码内部注释里呈现。
声明式规约
(2)规约图解
某个具体实现,若满足规约,落在其范围内。
更强的规约,表达为更小的区域。
(3)设计一个好规约
规约的质量
- 规约应该是内聚的:规约做了两件事就要分开成为两个方法。
- 规约应该是信息丰富的:不能产生歧义。
- 规约应该足够强:开发者应该尽可能考虑各种特殊情况
- 规约也应该适当弱:太强了开发者实现不了。
- 规约应该使用抽象类型:List or Set
- 前置条件或后置条件:不写前置条件,就要在代码内部检查。开发者可以在规约里加入前置条件,把责任推给客户端。惯用的做法是:不限定太强的前置条件,而是在后置条件中抛出异常:输 入不合法
HIT软件构造课程3.2总结(Designing Specificaton)的更多相关文章
- HIT软件构造课程3.4总结(Object-Oriented Programming )
上一节学习了ADT理论,这一节学习ADT的具体实现:OOP 1.基本概念:对象,类,属性,方法 对象 对象是状态和行为的捆绑.java中,状态=成员变量,行为=方法. 类 每个对象都定义了一个类,类定 ...
- 麻省理工18年春软件构造课程阅读02“Java基础”
本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...
- 由软件构造引申的OOP与POP的心得体会
在大一初学C语言的时候,所解决的问题都是一些轻量级的简单问题,当时写过一个教学管理系统.这个教学管理系统的功能很简单,思想就是“流水线”:按部就班的实现所有流程.要完成整个教学管理系统,实际上就是完成 ...
- HIT2019春软件构造->Git&Github学习笔记
由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作 1.基本信息设置(设置签名) 命令 项目级别/仓库级别:仅在当前本地库范围内有效 git ...
- 哈工大软件构造Lab1(2022)
目录 一.实验目标概述 二.实验环境配置 1.安装编写java程序的IDE--IntelliJ IDEA 2.安装Git 3.安装Junit 4.GitHub Lab1仓库的URL地址 三.实验过程 ...
- 哈工大软件构造Lab2(2022)
(防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302https://blog.csdn.net/m0_61753302本人博客园博客(同步CSDN): ...
- 软件构造 Lab1
大二软件构造第一次实验 本人本次实验操作系统:macOS high Sierra 10.13.3 任务一:MagicSquare 对于本任务,主要需要实现两个方法,一个是isLegalMagicSqu ...
- 哈工大软件构造Lab3(2022)
(防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...
- 面向对象软件构造 (Bertrand Meyer 著)
Part A: The Issues 议题 第一章 软件品质 第二章 面向对象的标准 Part B: The Road To Object Orientation 通向面向对象之路 第三章 模块性 第 ...
随机推荐
- 搭建websocket消息推送服务,必须要考虑的几个问题
近年,不论是正在快速增长的直播,远程教育以及IM聊天场景,还是在常规企业级系统中用到的系统提醒,对websocket的需求越来越大,对websocket的要求也越来越高.从早期对websocket的应 ...
- java反序列化-ysoserial-调试分析总结篇(7)
前言: CommonsCollections7外层也是一条新的构造链,外层由hashtable的readObject进入,这条构造链挺有意思,因为用到了hash碰撞 yso构造分析: 首先构造进行rc ...
- node--非阻塞式I/O,单线程,异步,事件驱动
1.单线程 不同于其他的后盾语言,node是单线程的,大大节约服务器开支 node不为每个客户创建一个新的线程,仅使用一个线程.通过非阻塞I/O以及 事件驱动机制,使其宏观上看是并发的,可以处理高并发 ...
- vue 实现 裁切图片 同时有放大、缩小、旋转功能
实现效果: 裁切指定区域内的图片 旋转图片 放大图片 输出bolb 格式数据 提供给 formData 对象 效果图 大概原理: 利用h5 FileReader 对象, 获取 <input ty ...
- Vue进阶课堂之《从HTML到Pug》
是啥 Pug听起来或许比较陌生,但是如果说起她的前生,相信各位多少会有耳闻:Jade.每当你不停的敲打<><><><></></> ...
- Sublime text 3 运行python3
要在Sublime text3编译器中成功运行 python3,需要在编译器设置中将python3添加至编译器中 新建编译系统 编辑弹出的文件,添加如下内容: { "cmd":[& ...
- Java反射之成员方法的反射
上一篇介绍了Java反射之成员变量的反射,这次介绍成员方法的反射. [一]Method类 Method类中封装了所有java方法的属性,包括该方法是否私有,该方法的修饰符,返回值,参数,抛的错误等等. ...
- 建议11:增强数组排序的sort功能
sort方法不仅按字母顺序进行排序,还可以根据其他顺序执行操作.这时就必须为方法提供一个比较函数的参数,该函数要比较两个值,然后返回一个用于说明这两个值得相对顺序的数字.比较函数应该具有两个参数a和b ...
- (转)springBoot 配置信息一览
原文链接:https://cloud.tencent.com/developer/article/1360699
- 金三银四,还在为spring源码发愁吗?bean生命周期,看了这篇就够了
第一,这绝对是一个面试高频题. 比第一还重要的第二,这绝对是一个让人爱恨交加的面试题.为什么这么说?我觉得可以从三个方面来说: 先说会不会.看过源码的人,这个不难:没看过源码的人,无论是学.硬背.还是 ...