307
社区成员
发帖
与我相关
我的任务
分享在接触学习JML的过程中,我感受到了从自然语言定性描述需求 向 特定语言定量描述实现的转变
简单来说,自然语言(指导书)描述的定性需求,即使添加再多的限制条件,也会造成代码理解上的歧义,因为自然语言无法点对点的和代码中的每个变量、函数联系起来
JML作为一种特定语言,可以定量描述每个方法的 前提条件、后置条件、不变量和过程,在方法实现的过程中不会出现歧义,也不会带来不符合期望的副作用
与外置的规格语言相比,JML内嵌在Java中并且支持静态审查,规避了很多冗余操作
很多方法功能关键难点并不在于实现过程,而是实现过程中带来污染数据的副作用,通过JML定量限制可以有效避免
在JUnit测试中,如果只是单纯的覆盖所有分支的测试程序,用LLM可以很轻松的生成所有分支情况,但实际的复杂程序中往往需要测试更复杂的交叉情况,这种情况下大模型生成的静态测试程序覆盖的范围就不够广泛了
人为构造JUnit可以有效解决这种情况,但实际体验上就是人为构造样例,如果我能快速人为构造有效的JUnit测试,其实就不需要显化写出来了,可以直接进入我的代码逻辑里去修复bug,所以我感觉JUnit测试核心功能还是静态测试所有分支
在迭代中发生变化的方法,我采用的是让本地agent直接在初始阶段进行一次新JML与旧代码的静态分析,标注出哪些已有方法发生变化,然后结合新JML进行修正,然后再去实现完全新增的方法。
性能瓶颈在三次作业中没太遇到,我的经验是能用效率更高的容器就不用效率的低的
在第二次作业的cleanSpam函数中我出现了一个分支未处理的bug,具体bug内容是当清除评论的关键词为空(清除所有评论)时,代码未处理这种情况,出现这种bug的根本原因还是JUnit测试的覆盖率没有覆盖完全,导致漏过了这种分支
我在U3的作业中主要使用的agent,在规格驱动开发中,agent来进行所有方法代码的具体实现,我负责给出架构设计并审查他给出的代码,因此效率和架构问题不会出现大模型不受控制的出现问题的情况
test部分我交给大模型进行尽量全的分支静态覆盖,这个地方我由于疏忽没有进行代码审查,出现了比较严重的问题,这方面给我的警示是使用大模型提高效率是必然,但一定要保证生成的代码在自己的控制之下
在击鼓传花游戏中,我们组出现了自然语言和JML描述不一致的情况,我觉得把JML翻译成代码要比把自然语言翻译成JML要好写的多,在多人组队编程中我认为应该经历 自然语言讨论-> JML规范讨论 -> 代码实现,防止出现不同人在自然语言转化成JML的描述不一致和描述错误