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

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

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. 5行js代码搞定导航吸顶效果

    一.HTML布局 首先写HTML布局 <body> <div id="wrap"></div> </body> 二.CSS样式 给点 ...

  2. 桌面运维之Windows快捷键,每一个工程师都是“快捷键”的工程师!

    1.win快捷键 首先教大家win7新增的3D效果: Win + Tab 快速切换已打开的程序(和Alt+tab一样的效果) Win + Home 将所有使用中窗口以外的窗口最小化 Win + Spa ...

  3. 峰哥说技术: 05-Spring Boot条件注解注解

    Spring Boot深度课程系列 峰哥说技术—2020庚子年重磅推出.战胜病毒.我们在行动 05 峰哥说技术  Spring Boot条件注解 @EnableAutoConfiguration开启自 ...

  4. A. Reorder the Array

    You are given an array of integers. Vasya can permute (change order) its integers. He wants to do it ...

  5. ant tree 展开key的集合

    这次有个功能 ant的tree 展开 点击子节点 新增节点之后 数据能够照常展开 有几种方法 我能想到的 因为ant 有个expanded 只要设置为true就能展开了,但是这边有个陷阱,就是仅仅设置 ...

  6. Markdown For EditPlus插件发布(基于EditPlus快速编辑Markdonw文件,写作爱好的福音来啦)

    详细介绍: Markdown For EditPlus插件使用说明 开发缘由 特点好处: 中文版使用说明 相关命令(输入字符敲空格自动输出): EditPlus常用快捷键: 相关教程: English ...

  7. selenium+Python 将登录模块化

      公共模块化:(登录) login.py   from selenium import webdriver from time import sleep   class login(): def u ...

  8. jupyter 安装问题 building 'zmq.libzmq' extension error: Microsoft Visual C++ 14.0 is required. Get it with "Microsoft Visual C++ Build Tools": http://landinghub.visualstudio.com/visual-cpp-build-tools

    1.用pip install jupyter 安装到一半就报错 错误提示: building 'zmq.libzmq' extension error: Microsoft Visual C++ 14 ...

  9. 基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)

    前言 回顾上一篇文章<使用Swagger做Api文档 >,文中介绍了在.net core 3.1中,利用Swagger轻量级框架,如何引入程序包,配置服务,注册中间件,一步一步的实现,最终 ...

  10. SpringBoot2整合Redis多数据源

    配置文件属性 spring: redis: database: 1 host: 192.168.50.144 port: 6379 password: timeout: 600 #Springboot ...