本节转向“方法/函数/操作”如何定义

上一节是名词 这一节是动词

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)的更多相关文章

  1. HIT软件构造课程3.4总结(Object-Oriented Programming )

    上一节学习了ADT理论,这一节学习ADT的具体实现:OOP 1.基本概念:对象,类,属性,方法 对象 对象是状态和行为的捆绑.java中,状态=成员变量,行为=方法. 类 每个对象都定义了一个类,类定 ...

  2. 麻省理工18年春软件构造课程阅读02“Java基础”

    本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议. 由于我们学校(哈工大)大二软件构造课程的大部分素材 ...

  3. 由软件构造引申的OOP与POP的心得体会

    在大一初学C语言的时候,所解决的问题都是一些轻量级的简单问题,当时写过一个教学管理系统.这个教学管理系统的功能很简单,思想就是“流水线”:按部就班的实现所有流程.要完成整个教学管理系统,实际上就是完成 ...

  4. HIT2019春软件构造->Git&Github学习笔记

    由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作  1.基本信息设置(设置签名)  命令        项目级别/仓库级别:仅在当前本地库范围内有效 git ...

  5. 哈工大软件构造Lab1(2022)

    目录 一.实验目标概述 二.实验环境配置 1.安装编写java程序的IDE--IntelliJ IDEA 2.安装Git 3.安装Junit 4.GitHub Lab1仓库的URL地址 三.实验过程 ...

  6. 哈工大软件构造Lab2(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302https://blog.csdn.net/m0_61753302本人博客园博客(同步CSDN): ...

  7. 软件构造 Lab1

    大二软件构造第一次实验 本人本次实验操作系统:macOS high Sierra 10.13.3 任务一:MagicSquare 对于本任务,主要需要实现两个方法,一个是isLegalMagicSqu ...

  8. 哈工大软件构造Lab3(2022)

    (防扒小助手) 本人CSDN博客: https://blog.csdn.net/m0_61753302 本人博客园博客(同步CSDN): 何以牵尘 - 博客园 (cnblogs.com)https:/ ...

  9. 面向对象软件构造 (Bertrand Meyer 著)

    Part A: The Issues 议题 第一章 软件品质 第二章 面向对象的标准 Part B: The Road To Object Orientation 通向面向对象之路 第三章 模块性 第 ...

随机推荐

  1. 利用GitHub制作在线炫酷简历

    首先我们先体验一下炫酷简历.然后决定我们要不要使用. https://jessezhao1990.github.... 如何使用本项目部署你自己的在线简历 1. 书写简历 在src文件夹里面有个con ...

  2. 响应式导航菜单(css+js)

    1.响应式导航菜单 先来看下效果图把: 当视口大于640px的时候,导航条会显示在外,当视口小于768px的时候,导航菜单需要隐藏起来!代码如下: <!doctype html> < ...

  3. NLP自然语言处理入门-- 文本预处理Pre-processing

    引言 自然语言处理NLP(nature language processing),顾名思义,就是使用计算机对语言文字进行处理的相关技术以及应用.在对文本做数据分析时,我们一大半的时间都会花在文本预处理 ...

  4. Html5 部分帮助文档 未完待续

     W3cSchoolH5帮助文档 Video属性 视频播放效果 Video标签 src视频得目录 controls属性提供添加 播放 和音量控件 当然呢 不设置宽和高得话 视频会很大 Video还可以 ...

  5. JAVA校内赛

    第一题: 问题描述 在计算机存储中,15.125GB是多少MB?答案提交 这是一道结果填空的题,你只需要算出结果后提交即可.本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分. ...

  6. Spring教程检视阅读

    Spring教程检视阅读 地址 可供参考的教程 <菜鸟学 SSH> <Spring Boot 那些事> <初识 Spring Security> <Sprin ...

  7. ES6—get 与 set

    在类里面可以去定义一些getter和setter,getter可以得到一些东西的方法,setter可以设置东西 class Chef{ constructor(food){ this.food = f ...

  8. Python习题集(三)

    每天一习题,提升Python不是问题!!有更简洁的写法请评论告知我! https://www.cnblogs.com/poloyy/category/1676599.html 题目 写一个小程序:控制 ...

  9. 《JavaScript 模式》读书笔记(3)— 字面量和构造函数1

    新的篇章开始了,本章开始,所有的内容都是十分有价值和意义的.本章主要的内容包括对象字面量.构造函数.数组字面量.正则字面量.基本值类型字面量以及JSON等.在大家的工作和实际应用中也有一定的指导意义. ...

  10. 大牛都在用的IDEA调试技巧

    导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点条件?那孩子懵了,想了好一会对我说没用过,甚至 ...