JML规格驱动开发总结

24371113-刘鑫杰 24371113-刘鑫杰 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区

通过本单元的学习,我主要接触了以下几类JML语法构造:原子表达式、量词、前置条件、后置条件、不变式以及异常行为。这些语法构造为精确描述程序行为提供了基础。

 

规格驱动开发的核心价值在于将自然语言转化为机器能够理解并执行的语言,从而有效确保设计者的本意被清晰表达,没有二义性。我认为规格驱动开发有几点优势:首先是契约式设计,调用者需要保证前置条件满足,被调用者需要保证后置条件满足,这种契约思想让调用方和实现方都有了明确的责任边界;其次是便于测试,规格本身就是最精确的测试预言,可以根据JML规格逐条检查代码的正确性;第三是延迟过程设想,将延迟过程设想的面向对象原则扩展到了方法设计阶段,可以描述方法预期的功能而无需考虑具体实现;最后是工具链支持,JML拥有OpenJML、JMLUnit等丰富的工具链。

 

在JUnit测试的实践中,我接触并使用了黑箱测试、白箱测试、单元测试和压力测试等方法。黑箱测试根据不同的输入检测输出是否正确,但难以覆盖所有情况;白箱测试直接检查代码逻辑;单元测试针对特定方法构造测试点;压力测试对时间复杂度较高的方法进行大量调用。在为本单元编写JUnit测试时,我总结了以下经验:严格对照JML规格,不仅检验ensures后置条件,还要检查pure、assignable等语句,例如pure方法调用前后状态应一致;利用官方包提供的便利方法,如User.strictEquals()判断对象相等,避免大量遍历检查;兼顾正确性与性能,简单方法用白箱测试,复杂度高的方法结合黑箱和白箱;关注边界值测试,对int类型参数特别关注INT_MAX、0、INT_MIN等边界。我的测试策略主要是自己构造测试样例加JUnit单元测试,尽量覆盖每个分支,并与同学进行对拍验证正确性。但自己构造测试数据存在难以全面覆盖和对时间复杂度控制不足的问题。

 

本单元的三次作业是完全迭代开发的。第一次作业实现Network、Person、Group三个基础类,核心功能是构建社交网络框架,包括人的管理、关系的建立、连通性查询和连通块数量查询,关键是用并查集优化图操作。第二次作业在原有基础上新增了硬币经济体系,用户拥有硬币属性,可以对视频进行点赞、投币、转发和评论等互动操作,同时引入了粉丝勋章系统,用户可以为关注的UP主购买勋章。这一阶段的难点在于事务性操作的处理——多个操作需要同时成功或同时失败,以及各种新增异常类(如VideoUnmatchedException、InvalidCoinsException、InsufficientCoinsException、DuplicateMedalException等)的正确抛出。第三次作业进一步细化了消息类型,新增了通知消息、红包消息、表情消息等,并引入了智能推荐系统,需要实现推荐视频和推荐UP主的功能,难点在于最短路径求解和推荐算法的效率优化。

 

在迭代过程中,已有方法和容器的变化体现在多个方面:功能扩展方面,如互动相关方法从无到有的完整新增;属性新增方面,User类在第一次作业中只有基本个人信息,第二次作业新增了coins、watchedVideos、likedVideos、medals、contributors、contributions等属性,第三次作业又新增了typeCounts和videos;容器选择也需要随需求调整,从最初的ArrayList到后续大量使用HashMap实现O(1)查找。为了发现这些变化,我仔细阅读每次作业的新增JML规格,对比新旧规格找出新增和修改的方法,关注异常类的变化(第一次作业有少量异常,第二次新增8个异常类,第三次又新增5个)。

 

发现程序性能瓶颈的方法包括:进行压力测试,构造大规模数据观察运行时间;分析算法复杂度,特别关注规格中使用量词或遍历容器的方法;动态维护代替实时计算,将频繁查询的指标降为O(1);选择合适的容器,如使用HashMap实现O(1)查找。

 

在本单元作业中,我遇到的Bug主要有三类:异常处理顺序问题,在数据操作之前未完成所有异常判断,导致部分数据已存入后才抛出异常,这在第二次作业的事务性操作中尤其致命;照搬JML导致性能问题,如直接按JML遍历实现某些查询方法在大规模数据下超时;容器选择不当,初期使用ArrayList存储人员导致查找O(n),后改为HashMap。这些Bug的根本原因是对JML规格理解不够深入,忽略了做什么与怎么做的区别;对异常处理流程认识不足,特别是对事务性操作中回滚语义的理解不到位;以及缺乏性能意识,初期只关注功能正确性而忽视大数据量下的表现。

 

在击鼓传花研讨课活动中,我发现了JML规格在传递过程中的一些问题:边界条件模糊,不同人对同一条规格理解不同;前置条件遗漏,导致异常处理不完整;后置条件不完整,对异常情况下的状态变化描述不足。需求和边界在传递过程中确实会发生变化,因为每个人基于自己的经验和认知理解规格,存在偏差和曲解。基于这次研讨课的感悟,我认为在多人组队编程中应该采取以下措施来统一理解、减少信息差:建立统一的规格文档,使用JML等形式化语言消除二义性;定期进行规格评审,让每个成员阅读和解读规格;建立Code Review机制,确保实现与规格一致;编写单元测试作为规格的活文档,作为团队沟通的桥梁;明确接口契约,让调用方和实现方都有明确的责任边界。

 

总结本单元的学习,我深刻体会到了规格驱动开发的价值和挑战。JML为程序的正确性提供了严格的数学保证,也为团队协作提供了清晰的契约。但规格驱动开发并非银弹,需要我们既要忠实于规格,又要超越规格去思考架构和性能问题。通过三次迭代作业,我学会了如何阅读和理解JML规格,如何根据规格编写正确的代码,以及如何通过JUnit测试验证代码的正确性。更重要的是,我认识到在规格驱动开发中,算法优化、容器选择和架构设计同样重要,规格告诉我们要做什么,而如何高效地做到,是我们作为开发者需要思考的问题。

 

...全文

相关推荐

BUAA_2025春季学期面向对象设计与构造课程全周期作业实验源码与心得体会深度归档仓库_包含递归下降表达式求导多线程电梯系统JML规格化设计UML类图辅助正向建模四个单元完整代码.zip

BUAA_2025春季学期面向对象设计与构造课程全周期作业实验源码与心得体会深度归档仓库_包含递归下降表达式求导多线程电梯系统JML规格化设计UML类图辅助正向建模四个单元完整代码.zip

taozodew123

弱电网下光伏并网逆变器序阻抗建模仿真复现扫频法【序阻抗判断稳定性】

内容概要:本文聚焦于弱电网条件下光伏并网逆变器的序阻抗建模与稳定性分析,系统阐述了基于扫频法的阻抗特性仿真与复现方法。通过构建正负序阻抗模型,深入剖析逆变器在弱电网环境中的动态响应特性,结合锁相环、电流环等关键控制环节对系统阻抗的影响机制,采用序阻抗稳定性判据评估多机并网或复杂电网条件下的系统稳定裕度。研究在Simulink平台中实现激励信号注入、频率响应采集与阻抗曲线绘制,为高比例新能源接入背景下并网系统的稳定性分析提供了可靠的仿真手段与理论支撑,尤其适用于SCI级别论文成果的复现与拓展验证。; 适合人群:电力电子、新能源并网技术及相关领域的硕士/博士研究生、科研人员,以及从事光伏逆变器、微电网稳定控制开发的工程技术人员。; 使用场景及目标:①掌握扫频法在电力电子装置阻抗建模中的具体实施流程;②理解并应用基于序阻抗的稳定性判据进行系统稳定边界分析;③用于高水平学术论文(如SCI期刊)中阻抗建模与稳定性分析部分的仿真复现与方法验证; 阅读建议:建议读者结合文中所述方法与提供的参考文献,自主搭建Simulink仿真模型,逐步完成扰动信号设计、数据采集、傅里叶分析及阻抗拟合全过程,深入探究控制参数变化对系统阻抗特性和稳定性的具体影响,强化理论与实践的融合能力。

欢多天天写代码

三相并网逆变器虚拟阻抗+统一有源阻尼策略SVPWM+SPWM调制仿真

内容概要:本文档系统性地介绍了三相并网逆变器的核心控制技术及其在复杂电网环境下的仿真应用,重点涵盖虚拟阻抗与统一有源阻尼策略在SVPWM和SPWM调制方式下的实现方法,旨在提升逆变器的稳定性与电能质量。内容包括无功功率扰动孤岛检测、中点电位平衡控制、低电压穿越(LVRT)、模型预测控制(MPC)、正负序分离、电网前馈控制等关键技术,并扩展至风储联合调频、微电网下垂控制、虚拟同步发电机(VSG)、构网型逆变器等多种典型电力系统应用场景。所有技术均配有基于Simulink/Matlab平台的完整仿真模型、参考文献及说明文档,强调理论分析与仿真实践的深度融合,突出科研中“借力”与创新思维的重要性。; 适合人群:电气工程、自动化、新能源等相关专业的研究生、科研人员及从事电力电子与可再生能源系统开发的工程师;具备MATLAB/Simulink仿真基础和电力系统专业知识的技术人员。; 使用场景及目标:①开展三相并网逆变器控制策略的研究与优化设计;②复现高水平学术论文中的控制算法;③完成毕业课题、科研项目或工程仿真验证;④掌握虚拟阻抗、有源阻尼、SVPWM/SPWM调制、MPC、VSG等核心技术的建模与实现方法;⑤支撑微电网、构网型变流器等前沿方向的科研攻关。; 阅读建议:建议按照资源目录结构化学习,优先选择与自身研究方向契合的内容模块,结合提供的仿真模型、参考文献和说明材料进行实操演练,注重从理论推导到仿真实现的全过程理解,充分利用共享网盘资源深化技术掌握,提升科研效率与创新能力。

欢多天天写代码

chromedriver-win32-159.0.8133.0(Canary).zip

chromedriver-win32-159.0.8133.0(Canary).zip

LCG元

计算机“101计划”《人工智能引论》教学大纲+课件+实训案例

计算机“101计划”《人工智能引论》教学大纲+课件+实训案例

qq_38220914
评论
收藏 已收藏
分享
返回顶部