软件构造知识点总结(二)规格说明、异常与不变类型

软件需求规格说明书 email:leafsunshin@163.com 时间:2019-09-23 软件需求规格说明书 1.引言给出对本说明书的概述。 1.1目的-编写本文档的目的 1.2文档约定——描述本文档的排版约定,解释各种符号的意义。 1.3各类读者的阅读建议——对本文档各类读者的阅读建议。 1.4软件的范围描述软件的范围和目标。 1.5参考文献编写本文档所参考的资料清单。 2.综合描述 这部分描述软件... 阅读详情

软件构造知识点总结(二)规格说明、异常与不变类型

1.规格说明

规格说明是团队合作中的关键点。如果没有规格说明,就没有办法分工实现各种方法。规格说明就像一份合同:实现者的义务在于满足合同的要求,客户可以依赖这些要求工作。事实上,我们会发现就像真的合同一样,规格说明对双方都有制约:当合同上有前置条件时,客户有责任满足这些条件。

在这里插入图片描述

如上图所示,规格说明就好像一道防火墙一样将客户和实现者隔离开。它使得客户不必知道这个单元是如何运行的(不必阅读源码),也使得实现者不必管这个单元会被怎么使用(因为客户要遵守前置条件)。这种隔离造成了“解耦”(decoupling),客户自己的代码和实现者的代码可以独立发生改动,只要双方都遵循规格说明对应的制约。

1.1规格说明的结构

一个规格说明一般含有以下两个“条款”:

  • 一个前置条件,关键词是requires
  • 一个后置条件,关键词是effects

其中前置条件是客户的义务(谁调用的这个方法)。它确保了方法被调用时所处的状态。而后置条件是实现者的义务。如果前置条件得到了满足,那么该方法的行为应该符合后置条件的要求,例如返回一个合适的值,抛出一个特定的异常,修改一个特定的对象等等。

由于Java对于注释文档有一些要求,所以Java的规格说明一般遵循以下结构:

/**
*@param xxxxxx
*@param xxxxxx
*@return xxxxxx
*@throws xxxxx
*/

其中参数的说明(前置条件)以 @param作为开头,返回的说明(后置条件)以@return 作为开头,可能抛出的异常以@throws 作为开头。

同时应该注意的是使用Null值很容易发生错误,同时它们也是不安全的,所以在设计程序的时候尽可能避开它们。在这门课程中——事实上在大多数好的Java编程中——一个约定俗成规矩就是参数和返回值不是null。 所以每一个方法都隐式的规定了前置条件中数组或者其他对象不能是null,同时后置条件中的返回对象也不会是null值(除非规格说明显式的说明了可能返回null,不过这通常不是一个好的设计)。

1.2测试与规格说明

在测试中,我们谈到了黑盒测试意味着仅仅通过规格说明构建测试,而白盒测试是通过代码实现来构建测试。但是要特别注意一点:即使是白盒测试也必须遵循规格说明。 你的实现也许很依赖前置条件的满足,否则方法就会有一个未定义的行为。而你的测试是不能依赖这种未定义的行为的。测试用例必须尊徐规格说明,就像每一个客户一样

1.3规格说明的强度

定义:规格说明S2强于(等于)规格说明S1,如果:

  • S2的前置条件弱于或等价于S1的
  • S2的后置条件强于或等于S1的后置条件

如果S2强于S1,那么任何S2的实现方法都可以拿来实现S1,并且在程序中可以安全的用S2的模块替换S1模块。

在设计时,要权衡好规格说明的强度,既要足够“弱”,这里指前置条件较弱,对客户端的限制较小;也要足够“强”,这里指后置条件要足够强,作为一个负责任的程序员,除了对满足前置条件的输入返回正确的结果外,对于不满足后置条件的输入,要做出对客户端友好的反应。

2.异常

请看另一篇博客:浅析Java异常处理

3.mutable与immutable

mutable类型:当你尝试修改这种变量的值的时候,你真正修改了这个值本身。例如StringBuilder、StringBuffer等

immutable类型:当你给修改这种变量的值的时候,实际的值是无法修改的(内部实现时使用final修饰成员变量)。如果使用某些方法修改成功了,那并不意味着出现了矛盾,因为实际上修改成功是因为方法内部新建了一个对象,然后将修改的值写进这个新变量,再修改原变量的指针,指向新变量。(这也是为什么String是immutable类型,但实际操作时可以修改的原因)例如String,以及所有的基本类型变量及其包装类。是值的不变性。

由于immutable类型比mutable类型安全,所以一般在进行软件构造时,我们提倡使用immutable类型变量。

那如何将自己定义的的变量修改为immutable类型?

一般可以考虑使用flnal关键字进行修饰。但是使用final关键字时,应该注意:

final引起的效果是引用的不变性,所以如果final修饰的是一个基本数据类型的变量(数值型,字符型,布尔型),由于这些变量的值本身就无法修改,加之引用不变性,这个值就变成常量无法修改了;而如果修饰的是一个引用变量(类,接口,数组),那么指向该变量的指针就无法修改了,但是该指针所指向的那个对象还是可以变的,就像你记住了人家的门牌号,但你不能管人家家里人员数量。

(另外:java中的全局变量是由public修饰的static成员变量)

软件需求规格说明书(SRS)深入解析 摘要: SRS(软件需求规格说明书)是定义系统功能、性能与接口的核心文档,为开发、测试、项目管理提供依据。标准结构包括引言、总体描述、功能/非功能需求、接口等模块。撰写需确保清晰、可验证、无歧义,避免模糊术语。示例展示学生注册模块的需求写法,强调性能与安全性要求。推荐使用Confluence、StarUML等工具辅助编写,交付时需包含主文档、原型图及需求跟踪矩阵。SRS应兼具技术性与管理性,作为沟通桥梁和验收标准。 阅读详情

相关推荐

软件需求规格说明书(SRS)标准模板

《软件需求规格说明书(SRS)框架解析》摘要: 本文档系统阐述了SRS的标准结构,包含7大核心部分:1)引言(目的、背景和术语);2)总体描述(产品定位与用户特征);3)功能需求(模块化功能说明);4)非功能需求(性能、安全等指标);5)接口需求(用户/硬件/软件接口);6)其他技术要求;7)附录(图表与参考资料)。重点突出了功能需求模块的标准化描述模板(FR-01),以及安全需求中的HTTPS通信、SHA-256加密等关键指标。该框架为软件开发提供了明确的需求基准,涵盖从业务背景到技术实现的完整链条,是确

moton2017的博客 2890

分析软件需求说明书利弊(附某人的…

来到新公司,我挺不习惯的一点是要求写软需文档。之前呆过的公司都不需要写软需。其中还有一家是通过cmm3认证的呢。怎么通过的?临时抱佛脚专人写软需呗。开发不看测试不看。给谁看?评委呗。由此知道国内cmm3认证有多水了吧。既然软需的拥护者和反对者为数都不少。所以我觉得软需是否有用不是个判读黑与白的问题。而是需要权衡弊大于利或者利大于弊的问题。     软需的利简单说就是有章可循,理想情况下开发按照软

runyon的博客 645

单片机笔记十二:华大HC32L136超低功耗设计实战

本文详细介绍了华大HC32L136单片机的超低功耗设计实战,包括深度睡眠模式下仅0.5μA的电流消耗、五种功耗模式的对比与配置、外设使用技巧及硬件级优化方法。通过实际项目案例,展示了如何利用ARM Cortex-M0+内核的HC32L136显著延长电池寿命,适用于智能门锁、额温枪等低功耗设备。

weixin_29189373的博客 394

【软件测试】导致软件缺陷的最大原因是软件需求规格说明书

导致软件缺陷的最大原因是软件需求规格说明书。 因为软件缺陷产生的原因有很多,典型的原因如下: 软件本身的复杂性开发人员的问题需求的变化进度的压力对文档不重视沟通不畅偏差的累积 各种来源导致缺陷会广泛分布在软件开发的各个阶段,需求规格说明书、软件设计、代码中都可以看到缺陷的身影。特别是由于需求的变化和人们对文档的轻视,导致需求规格说明书中的缺陷通常会占缺陷总数一半还多。

柳婼 の blog 1万+

山东大学软件测试实验2——系统功能测试

​ 给出一个被测试的 Web 应用系统(SUT)。http://211.87.232.162:8080/注:友情链接不用延伸测试。针对被测试的 Web 应用系统进行功能测试,发现其存在的缺陷。 ​

m0_74033391的博客 2409

GEE:哨兵时间序列遥感数据和动态阈值方法计算物候时期EOS/SOS(2)

本文将分享和解释论文《Improved Estimates of Arctic Land Surface Phenology Using Sentinel-2 Time Series》中使用到的基于阈值估算北极地区的植被物候,特别是北极地区的植被季节开始和结束的日期(SoS和EoS)的方法和代码。该方法使用的是使用哨兵2数据,并实现了两种阈值方法( 无平滑的阈值方法、平滑后的阈值方法)。

养乐多的博客 2971

软件构造笔记——可变性的危害

Risks of mutation Risky example #1:passing mutable values 以下为一个计算list中各数之和的方法: /** @return the sum of the numbers in the list */ public static int sum(List<Integer> list) { int sum = 0; ...

DuanChenjie的博客 356

Amazon Skills:51个AI技能赋能亚马逊运营,从选品到广告全链路分析

在电商运营领域,数据分析和自动化工具正成为提升效率的关键。其核心原理在于将专业经验转化为结构化指令,使AI能够执行标准化流程。这种技术价值体现在降低专业门槛、提升决策效率,尤其适用于亚马逊这类数据驱动的电商平台。通过将选品、关键词研究、FBA费用计算、PPC广告优化等运营框架编码为可执行指令,AI助手能够模拟专家思维进行市场分析。Amazon Skills项目正是这一理念的实践,它提供51个覆盖运营全链路的技能模块,让卖家在自然对话环境中获得专业分析支持,实现从市场研究到利润核算的自动化工作流。

weixin_27134143的博客 1302

软件构造 5:规格说明

为什么要使用规格说明 在编程中,很多让人抓狂的bug是由于两个地方的代码对于接口行为的理解不一样。虽然每一个程序员在心里都有一份“规格说明”,但是不是所有程序员都会把他们写下来。最终,一个团队中的不同程序员对于同一个接口就有不同的“规格说明”了。当程序崩溃的时候,就很难发现问题在哪里。简洁准确的的规格说明使得我们远离bug,更可以快速发现问题所在。 规格说明对使用者(客户)来说也是很有用的,它们使得使用者不必去阅读源码。如果你还不相信阅读规格说明比阅读源码更简单易懂的话,看看下面这个标准的Java规格说

tran5ient的博客 372

损失函数大汇总(五十三)(Boundary Loss附公式推导与代码)

摘要 Boundary Loss是一种针对图像分割任务的新型损失函数,特别适用于高度类别不平衡的细粒度分割场景。与传统的区域型损失(如Dice、交叉熵)不同,它通过计算预测边界与真实边界之间的距离来优化模型,更关注边界精度而非区域重叠。核心思想是利用距离图(distance map)将边界约束转化为区域积分形式,实现端到端训练。具体实现中,损失函数为预测概率与距离图的点积,梯度仅取决于距离图,具有明确的空间引导性。相比区域型损失,Boundary Loss能更好处理小目标、细长结构等边界敏感任务,可与Dic

悦学共鸣,温柔以待,汇聚光芒,共同成长 239

人群仿真软件:Pathfinder_(14).与其他软件的集成与互操作

在人群仿真软件的二次开发中,与其他软件的集成和互操作是非常重要的。通过数据导入导出、接口调用和脚本编写,可以显著提升仿真的准确性和实用性。Pathfinder提供了多种数据格式的支持和丰富的API,使得与其他软件的集成变得简单高效。无论是建筑模型的导入、仿真结果的导出,还是实时数据的交换,Pathfinder都能满足用户的需求。

kkchenjj的博客 1017

软件构造第三章3.2:规格说明

规格说明的结构 一个规格说明含有以下两个“条款”: 一个前置条件,注释是requires 一个后置条件,注释是effects 其中前置条件是客户的义务(谁调用的这个方法)。它确保了方法被调用时所处的状态。 而后置条件是实现者的义务。如果前置条件得到了满足,那么该方法的行为应该符合后置条件的要求,例如返回一个合适的值,抛出一个特定的异常,修改一个特定的对象等等。 规约的意义 规约描述了方...

SJk1170300905的博客 275

论deepseek软件底层原理

如处理医学文本时,将任务分配给擅长医学知识处理的专家,避免通用模块处理的低效性,极大提升计算效率与任务处理的针对性。教师模型复杂且强大,学生模型结构简单。协作处理:多模块协作时,建立数据流通与交互机制,各模块按顺序或并行处理数据,不断传递与更新中间结果,共同完成复杂任务。(一)输入处理与任务判断 输入预处理:接收输入数据,如用户文本提问,首先进行清洗,去除噪声数据、特殊字符等。任务分类:通过MoE架构“路由器”,依据输入数据特征,判断任务所属领域与类型,如文本分类、情感分析等,为后续处理模块选择提供依据。

欢乐打代码! 2738

麻省理工18年春软件构造课程阅读06“规格说明”

本文内容来自MIT_6.031_sp18: Software Construction课程的Readings部分,采用CC BY-SA 4.0协议。 由于我们学校(哈工大)大二软件构造课程的大部分素材取自此,也是推荐的阅读材料之一,于是打算做一些翻译工作,自己学习的同时也能帮到一些懒得看英文的朋友。另外,该课程的阅读资料中有许多练习题,但是没有标准答案,所给出的答案均为译者所写,有错误...

a_18067的博客 296

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

《软件需求规格说明》的正文格式

《软件需求规格说明》的正文格式(模板)

ALittleShip 8374

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

(P51)异常:异常与继承,异常与指针,异常规格说明,C++标准库异常层次

文章目录1.异常与继承2.异常与指针3.异常规格说明4.C++标准库异常层次 1.异常与继承 如果异常类型为C++的类,并且该类有其基类(基类也是一个异常类),则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面 eg:P51\01.cpp #include <iostream> #include <string> using namespace std; class MyException { public: MyException( const c

喜欢打篮球的普通人 564

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

咱们一起学C++ 第三百一十二篇深入剖析C++异常规格说明

大家好!C++学习之路充满挑战,但每一次突破都能让我们收获满满。今天,咱们一起深入研究C++中的异常规格说明,希望通过分享与交流,大家能更好地掌握这一重要知识点,在编程技能上实现共同进步。异常规格说明在C++编程里十分关键,它能让代码在异常处理方面更加清晰、可靠。

wj_rdk的博客 1405

咱们一起学C++ 第三百一十三篇C++异常规格说明与异常安全深度解析

大家好!在C++编程的学习过程中,我们总会遇到各种复杂的知识点,今天咱们就来深入探讨异常规格说明和异常安全这两个重要概念。我希望通过分享学习心得,能和大家一起攻克这些难题,在C++的学习道路上共同进步,提升我们的编程技能。

wj_rdk的博客 903

[文档] 软件需求规格说明书

软件需求说明规格书

梦醒贰零壹柒 1万+

【C++】 外传篇 2_函数的异常规格说明

函数的异常规格说明 问题: 如何判断一个函数是否会抛出异常,以及抛出哪些异常? C++ 提供语法用于声明函数所抛出的异常 异常声明作为函数声明的修饰符,写在参数列表后面 /** 可能抛出任何异常 */ void func1(); /** 只能抛出的异常类型: char 和 int */ void func2() throw(char...

weixin_33766805的博客 128

从零开始学C++之异常(三):异常与继承、异常与指针、异常规格说明

一、异常与继承 如果异常类型为C++的类,并且该类有其基类,则应该将派生类的错误处理程序放在前面,基类的错误处理程序放在后面  C++ Code  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28

Meditation 3539

71-函数的异常规格说明

注:博客中内容主要来自《狄泰软件学院》,博客仅当私人笔记使用。 测试环境:Ubuntu 10.10 GCC版本:9.2.0 一、函数的异常规格说明 1)问题 如何判断一个函数是否会抛出异常,以及抛出哪些异常? 1、给函数声明抛出异常 2、查看文档 2)C++提供语法用于声明函数所抛出的异常 3)异常声明作为函数声明的修饰符,写在参数列表后面 /*可能抛出任何异常*/ void func1(); /*只能抛出的异常类型:char和int*/ v...

第一大剑豪——索隆 315

HIT软件构造课程复习——第三章ADT&OOP第二节设计规格说明

主要内容:1.规格说明,前置/后置条件2.行为等价性3.规约的强度一、规格说明,前置/后置条件1.documentation包括类层次结构和已实现接口的列表,直接子类,类的描述,构造器摘要,方法摘要列(出了我们可以调用的所有方法),每种方法和构造函数的详细描述。记录假设:向下写入变量的类型会记录一个关于它的假设:例如,这个变量总是引用一个整数。-ava实际上在编译时检查这个假设,并保证在您的程序中...

qq_38828473的博客 489

Mit软件构造学习心得

在学习软件构造课程之前,我对于编程工作的理解就是简单的写一写代码,改一改bug。但学完这门课后我对于编程有了更加深刻的认识。 软件构造基本过程 首先在宏观上软件的生命周期基本可以划分为:需求收集和分析,可行性分析,系统分析,软件架构设计,编写代码,测试代码,整合代码,打包交付,运行和维护。但在具体实现过程又有不同的方式,比如传统的瀑布模型和现在比较流行的敏捷开发。 对于瀑布模型,其核心思想是按工序将问题化简,将功能的实现与设计分开,便于分工协作,即采用结构化的分析与设计方法将逻辑实现与物理实现分开。并基本严

dark_souls的博客 539
上一篇: 软件构造知识点总结(一)静态检查与测试
下一篇: 软件构造知识点总结(三)Java多线程、线程安全
Joe_hsj
博客等级 码龄8年 6粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值