25202108-盛钰玲-作业集4~6的总结性Blog

(1)前言
第四次PTA
1、作业学习到的相关知识点
本次作业以数字电路模拟系统为载体,重点考察接口、抽象类、工厂模式、正则匹配、静态代码块、多级分层架构与链式数据传递等高阶面向对象知识点,是对前三次作业类设计思想的全面升级。
什么是接口多实现与接口继承?本次定义了基础信息、引脚管理、计算接口三大基础接口,并通过GateJieKou统一继承多个父接口,解决多接口分散管理的问题,实现接口功能聚合,让子类只需实现统一总接口,规范了各类逻辑门的通用行为。
抽象类的应用理解?本次将所有逻辑门的公共属性和通用方法统一抽取到抽象电子电路父类中,实现代码复用,子类只需要重写专属的computeOutput计算方法,符合模板设计思想,避免大量重复代码。
工厂模式的理解与使用?本次自定义门工厂接口与各类逻辑门专属工厂类,通过静态Map集合绑定门类型与对应工厂,根据输入字符串自动匹配、创建对应逻辑门对象,实现对象创建与业务逻辑解耦,不需要大量if-else判断实例类型。
静态代码块的作用?使用static静态代码块在类加载时一次性完成工厂对象的初始化存入Map,全局共享、只加载一次,提升程序运行效率,熟悉了静态资源的初始化时机。
正则表达式匹配的使用?通过Pattern与Matcher正则匹配不同逻辑门的输入格式,自动解析门编号、引脚数量,实现字符串自动化解析对象,解决了自定义格式文本解析难题。
集合的深度应用?大规模使用ArrayList存储逻辑门、输入引脚、连接信息,替代固定数组,实现数据动态新增、动态遍历,解决了前几次作业数组固定长度的局限性,适配任意数量电路元件。
分层思想的落地?代码严格分层:各类逻辑门、工具、输入数据封装、主程序层,各司其职,彻底摆脱前期main方法冗余的问题。
链式迭代计算思想?实现信号逐级传递迭代计算,通过循环不断检测未计算完成的电路门,完成信号逐级赋值、运算、传递,模拟真实数字电路的信号流转过程。
排序规则自定义实现?输出阶段根据门类型优先级、编号大小手动实现冒泡排序,掌握了业务自定义排序的实现方式,理解业务排序逻辑的编写思路。
2、题量:
本次依旧为单道综合大作业,代码量大幅提升,总代码行数约550行,包含抽象父类、五大逻辑门子类、多个工具类、接口类、工厂内部类、数据封装类等数十个功能模块。相比第三次作业,模块更多、分层更细、文本解析与迭代计算逻辑更复杂,题量大,综合性极强。
3、难度:
本次作业难度为四次作业之最,难度偏难。不再是简单的类创建与数据传递,涉及设计模式、正则解析、迭代循环计算、分层架构、多接口继承等高阶知识点。需要同时兼顾格式解析、对象创建、信号流转、迭代运算、自定义排序、边界过滤等多重逻辑,代码耦合度控制、逻辑梳理难度大,对面向对象的设计思维要求极高,需要反复调试信号传递逻辑才能保证程序正常运行。
第五次PTA
1、作业学习到的相关知识点
本次作业在第四次数字电路模拟程序的基础上进行功能迭代拓展,新增三态门、译码器、数据选择器、数据分配器四类组合逻辑器件,进一步深化了接口抽象、工厂设计模式、多类型引脚管理、多格式输出规范等面向对象高阶知识,同时巩固了信号迭代传递、正则解析、集合工具类的使用。
多类型引脚的规范设计怎么实现?本次新增带控制引脚的器件,需要按照控制引脚、输入引脚、输出引脚的固定顺序规划引脚编号,不同元器件引脚数量、引脚用途各不相同,通过在抽象父类中统一管理引脚数组、引脚总数量、输出起始引脚位置,子类根据自身器件类型初始化引脚结构,实现不同元器件引脚的统一管控,避免引脚编号混乱。
工厂模式的进阶应用?在原有工厂注册逻辑上优化正则匹配注册表,将九类逻辑门的正则规则与对象创建逻辑统一存入静态Map,根据输入的元器件字符串自动匹配正则、解析编号、控制引脚数等参数,批量完成不同类型门电路的实例创建,大幅减少冗余的类型判断代码,让新增元器件时仅需要新增正则与创建类即可,符合开闭设计原则。
多输出引脚器件如何封装?前四次作业中逻辑门均只有单个输出引脚,本次译码器、数据分配器存在多路输出,通过HashMap存储引脚编号与对应电平值,统一管理多路输出数据,既可以快速查询单个引脚电平,也能批量遍历所有输出引脚,适配多输出器件的运算结果存储需求。
三态门高阻态的业务逻辑如何实现?控制引脚作为器件的开关信号,当控制引脚电平无效时,直接清空当前器件所有输出结果,标记器件未完成运算,在后续输出阶段直接忽略该器件,模拟电路中断开的高阻无效状态,让程序贴合真实数字电路运行规则。
译码器的编码运算逻辑?先校验三个控制引脚的电平是否满足器件工作条件,只有S1为1、S2与S3电平均为0时译码器才正常工作;读取多路输入引脚的二进制编码,将编码值对应位置的输出引脚置0,其余输出引脚统一置1,同时单独设计输出规则,仅打印唯一低电平的引脚序号,区别于基础逻辑门的输出格式。
数据选择器与数据分配器的原理落地?数据选择器通过控制引脚的二进制编码选中一路输入信号直接输出;数据分配器则根据控制编码将单路输入信号分配至指定输出引脚,其余引脚置为无效值,使用 “-” 符号标识,需要按照引脚顺序拼接字符串格式化输出,锻炼了自定义业务格式的编码能力。
引脚内外编号的转换思路?题目中用户输入使用外部引脚序号,程序内部存储使用从0开始的数组下标,专门封装内外引脚转换工具方法,对基础门电路、带控制引脚的复杂器件做差异化转换规则,避免输入解析、信号连接时出现引脚索引越界、匹配错误的问题。
迭代信号传递的优化处理?在原有循环迭代运算的基础上,增加旧输出与新输出的比对逻辑,当器件输出电平发生改变时,才向下一级元器件传递信号;若器件输出清空变为无效状态,同步向下级撤销引脚赋值,精准模拟电路中电平变化的联动过程,防止无效电平持续传递引发逻辑错误。
自定义多规则排序的落地?按照九类元器件规定的固定先后顺序排序,同类元器件再根据编号升序排列,通过封装类型优先级方法定义器件输出顺序,结合冒泡排序完成元器件有序输出,严格遵循题目指定的输出排序规范。
字符串解析的健壮性优化?对输入的引脚连接字符串做异常捕获、格式校验,分割参数后判断数组长度、数字格式合法性,非法的引脚编号、元器件名称直接跳过解析,避免格式异常导致程序崩溃,提升输入解析模块的容错能力。
2、题量:本次作业属于第四次数字电路项目的迭代升级,总代码行数约 780 行,在原有抽象接口、工厂类、解析器、计算器、打印机等基础类之上,新增四类复杂元器件子类,重构引脚管理、输出打印、内外引脚转换模块,同时扩充正则匹配规则、多格式输出分支逻辑,类的数量进一步增加,业务规则繁杂,题量偏大。
3、难度:本次作业难度为困难级别,相比第四次作业难度再次提升。不仅需要吃透四类新增组合逻辑器件的硬件工作原理,还要针对九类元器件设计差异化的引脚结构、运算规则、输出格式;需要兼顾开闭原则、单一职责优化原有代码结构,同时处理内外引脚转换、多路输出存储、无效电平撤销、多格式打印等复杂分支逻辑,对面向对象设计能力、业务抽象能力、边界异常处理能力都提出了很高的要求,需要反复调试信号流转、格式输出、排序规则才能满足全部测试样例要求。
第六次PTA
1、学习到的相关知识点:
本次作业是数字电路模拟系列的第四次迭代升级,核心围绕组合设计模式实现子电路封装复用,同时新增全局语法异常校验模块,既巩固了前面接口、抽象类、工厂模式、信号迭代传播的设计思想,又对面向对象组合复用、程序健壮性、异常优先级处理有了更深层次的实践理解,但不知道为什么一直是83分。
什么是组合设计模式?本次将基础逻辑门作为叶子节点、子电路作为组合容器节点,统一继承顶层组件接口,让子电路和普通逻辑门对外提供一致的调用方式,主电路无需区分当前元件是基础门还是封装后的子电路,就能完成引脚赋值、信号运算、结果读取,实现电路模块的复用、嵌套调用,完美解决重复电路多次编写的冗余问题。
子电路的标准化结构设计:子电路需要单独定义外部输入引脚、外部输出引脚,内部可以包含任意基础逻辑门与连接关系;通过C编号:INPUT、OUT四段标识完成子电路定义,子电路内部元件命名与主电路相互隔离,引用时通过子电路编号-外部引脚名的格式完成跨电路信号传递,实现内外电路解耦。
多层级信号传递机制:信号不仅需要在主电路内部逐级迭代传播,还要支持主电路向子电路输入引脚赋值、子电路内部完成信号运算后,将运算结果通过子电路输出引脚回传给主电路。本次通过封装独立的子电路信号传播类,设置最大迭代次数防止循环电路死循环,每轮传播先重置所有引脚电平再重新赋值运算,保证带反馈电路信号收敛稳定。
枚举类型的规范化使用:使用枚举统一管理门类型编码、引脚类型,替代零散的字符判断,封装类型匹配、类型描述静态方法,降低硬编码带来的出错概率,让门类型统一管理、易于扩展新增器件,提升代码可维护性。
多接口拆分与职责细化:将组件信息、信号输出、引脚连接、子电路外部操作、电路读写、连接管理、错误上报等功能拆分为多个细粒度接口,每个接口只定义一类行为,遵循单一职责原则;通过多接口实现让不同组件按需实现所需能力,避免臃肿大接口带来的冗余方法。
全局语法异常优先级校验规则:梳理五类异常的固定优先级,从多输入、无输入、无输出、输入输出顺序颠倒、引脚信号冲突依次判定,单行连接语句出现多个异常时仅抛出优先级最高的错误;全局逐行扫描输入文本,只要前置行存在异常直接终止解析并输出错误信息,不再处理后续电路逻辑。
双向连接映射表设计:同时维护正向连接Map目标引脚到来源引脚与反向连接Map来源引脚到所有目标引脚,既可以快速校验同一个输入引脚是否被多个信号源赋值,也能在信号更新时批量向下游所有目标引脚同步电平,大幅简化信号遍历传递的逻辑。
内外引脚、跨域引脚解析封装:分别封装普通元件引脚、子电路外部引脚的解析工具类,统一不同格式引脚字符串的读取、拆分、类型判定逻辑,区分电路系统层面的输入输出与硬件元件本身的输入输出,避免引脚类型判定混淆引发的校验异常。
自定义工具类分层思想:将元件创建、引脚信号读写、电路语法校验、组件排序、信号迭代传播、子电路数据存储全部封装为独立工具类与数据持有者类,主电路只做调度统筹,各类工具各司其职,代码分层清晰,便于后续迭代扩展时序电路、异常容错处理。
组件多维度排序规则:输出阶段先按照门类型固定顺序排序,同类型按照元件编号升序,子电路内部元件需要先按照子电路编号排序,再执行元件编号排序,通过自定义排序器提取元件末尾数字编号,实现题目要求的有序输出格式。
2、题量:本次作业属于系列迭代综合项目,总代码行数超 1300 行,新增枚举、大量细粒度接口、子电路全套存储与管理类、全局语法校验类、双向连接映射容器、多层信号传播工具类,同时重构原有引脚解析、信号读写、全局传播模块,需要兼容前五版所有基础门逻辑,新增子电路嵌套、异常校验两大核心业务,类数量达到三十余个,题量偏大。
3、难度:本次作业难度为困难级别,是整个系列中设计复杂度最高的一次。不仅需要吃透组合模式的设计思想完成子电路封装复用,还要设计严谨的双向连接结构实现异常冲突检测;需要兼顾主、子双电路的多层级信号迭代传播,处理循环电路收敛边界;同时严格按照异常优先级、输入输出类型判定规则编写语法校验逻辑,极易出现引脚类型误判、异常优先级颠倒、子电路信号无法回传、循环迭代死循环等 bug,对面向对象设计能力、边界逻辑把控、业务规则拆解能力要求极高。
(2)设计与分析
1.PTA第四题的设计与分析
第四题类图:
image
image
image
image
第四题SourceMontors生成的报表:
image
总行数:487
有效代码语句数:218
最大圈复杂数:5
平均圈复杂数:1.59
最大嵌套深度:4
分析:
本次代码总行数 487 行,有效代码语句 218 行,能看出存在不少空行、注释、冗余临时代码,实际核心业务逻辑并不繁杂。最大圈复杂度 5、平均圈复杂度 1.59,搭配最大嵌套深度 4,说明代码里出现了多处循环、多分支判断,部分方法执行路径偏多,可读性有所下降,需要对复杂方法做逻辑拆分。本次遵循单一职责原则,拆分出输入解析、信号运算、语法校验、结果打印等多个功能类,同时通过接口、工厂模式解耦,类职责划分清晰,相比之前作业进步明显;并且使用List、Map动态集合存储数据,不再依赖定长数组。
心得:本次练习加深了我对接口编程、类之间聚合/依赖等关系的理解,合理拆分类之后,主类代码简洁易维护。但代码仍存在冗余内容较多、部分方法嵌套层级偏高的问题,后续需要精简无效代码,拆分高复杂度方法,收紧成员变量访问权限,进一步提升代码封装性与可读性。
2.PTA第五题的设计与分析
第五题类图:
image
image
image
image
image
第五题SourceMontors生成的报表:
image
总行数:683
有效代码语句数:514
最大圈复杂数:25
平均圈复杂数:4.34
最大嵌套深度:9
分析:本次项目总行数 683 行,有效代码 514 行,代码体量相比前几次作业大幅增加,业务逻辑更加复杂。最大圈复杂度达到 25、平均圈复杂度 4.34,同时最大嵌套深度为 9,说明存在某个方法包含大量多层循环、多分支条件判断,代码执行路径极多,可读性、可调试性较差,违背了单一职责原则,高复杂度方法需要拆分为多个小型工具方法。本次一共 35 个类,通过接口、工厂、管理器等模式完成业务分层,严格遵循单一职责原则,将电路解析、信号运算、子电路管理、语法校验、结果输出等功能拆分,各类职责独立、代码解耦性强,同时大量使用Map、List动态集合管理数据,架构设计相比之前更加规范。
心得:经过多次迭代,我熟练掌握了面向接口编程、工厂模式等设计思想,对类之间聚合、依赖、组合等 UML 关系理解更加透彻,分层设计有效避免了主类代码臃肿。但本次代码暴露出明显缺陷:部分方法嵌套层级过深、分支过多,圈复杂度严重超标,后续需要对高复杂度方法做功能拆分,精简嵌套层级;同时可以适当精简冗余临时变量与闲置代码,进一步优化代码可读性与可维护性。
3.PTA第六题的设计与分析
第六题类图:
image
image
image
image
image
第六题SourceMontors生成的报表:
image
总行数:1326
有效代码语句数:1376
最大圈复杂数:22
平均圈复杂数:2.43
最大嵌套深度:9
分析:本次项目代码规模达到1326行,有效执行语句1376行,共划分52个类,整体架构分层更加精细,通过接口、工厂、管理器等设计模式完成功能解耦,严格遵循单一职责原则,各类功能边界清晰,代码复用性与扩展性大幅提升。最大圈复杂度为22,存在单一方法包含大量分支、循环逻辑,同时最大嵌套深度达到9层,该方法可读性较差,调试维护难度高;平均圈复杂度2.43处于合理区间,说明绝大多数方法的分支控制简洁规范,仅个别方法需要重构优化。注释占比2.9%,注释量偏少,部分复杂逻辑缺少说明,不利于他人快速理解代码设计思路。
心得:经过多轮迭代,我熟练掌握了面向接口编程、多种设计模式的落地使用,对UML 类图中四类关系的实践理解更加深刻,通过高内聚低耦合的类拆分,有效规避了主类代码臃肿的问题。本次代码存在两处明显优化点:一是需要对圈复杂度 22 的复杂方法进行拆解,拆分出多个私有工具方法,降低嵌套层级与分支数量;二是需要为核心业务类、复杂逻辑方法补充关键注释,提升代码可读性。后续开发中会继续优化代码结构,平衡架构设计与代码简洁性。
(3)踩坑心得:
1.第四道PTA的踩坑心得
坑一:正则表达式编写不规范,多种逻辑门的正则匹配规则分组位置设计混乱,解析时 Group取值错位,导致门类型、引脚数量、元件ID读取错误,元件创建失败。根源是对正则捕获分组的使用不熟练,后续通过逐个调试Matcher分组下标、单独校验每一类门的正则表达式才修复。
坑二:引脚赋值时没有做重复赋值校验,同一个输入引脚被多条连接重复赋值,信号出现冲突覆盖,电路运算结果异常。最开始只做了引脚初始值- 1的判断,没有考虑多条线路指向同一引脚的场景。
坑三:忘记重置已计算过的逻辑门运算标记,信号多次迭代传播时门电路不会重新计算输出,导致后续电路信号更新滞后,循环传播始终无法收敛,出现死循环类的运算错误。
坑四:初期没有使用接口统一约束各类门元件行为,每个逻辑门类自定义方法名,工厂创建时需要大量类型判断分支,代码违背单一职责与开闭原则,后期重构接口才实现统一管理。
2.第五道PTA的踩坑心得
坑一:子电路内部信号传播时没有每次迭代重置所有引脚信号,上一轮运算残留的引脚值干扰新一轮信号传递,导致子电路输出结果错乱,调试很久才发现需要每次循环将所有输入引脚重置为初始-1。
坑二:子电路内外引脚名称映射出错,外部引脚与内部引脚编号没有做转换处理,直接使用外部引脚编号去匹配内部引脚,出现引脚找不到、赋值失效的问题。
3.第六道PTA的踩坑心得
坑一:全局信号迭代循环没有设置最大迭代次数上限,遇到环形电路依赖时会无限循环传播信号,程序卡死,后来增加最大迭代阈值终止循环才解决。
坑二:输出排序规则理解偏差,先按门类型排序、再按元件数字编号排序、最后按子电路编号排序,最初只做了名称字符串排序,数字没有自然排序,输出顺序不符合题目要求。
坑三:语法校验工具类中输入引脚、输出引脚的正则判断规则不完善,子电路的输入输出引脚识别逻辑缺失,非法线路连接没有被拦截,导致冲突报错无法正常捕获。
(4)改进建议
第四次PTA作业改进建议
1.正则与工厂模式问题:正则表达式分组设计混乱,各类逻辑门捕获下标不统一,元件解析极易出错;初期未用接口约束门电路行为,工厂类分支过多违背开闭原则。
改进:统一规范所有逻辑门正则捕获分组下标,单独封装正则常量类;提取顶层GateJieKou接口统一约束所有门的行为,利用工厂模式消除大量 if 类型判断分支。
2.引脚信号处理问题:缺少引脚重复赋值校验,同一引脚被多路信号覆盖导致运算异常;运算完成后未标记已计算门,信号迭代无法更新结果。
改进:引脚赋值前先判断引脚初始值必须为 - 1,禁止重复赋值;每次信号迭代前重置门电路已计算标记,保证输入变化后可以重新运算。
3.代码冗余问题:项目存在大量冗余临时变量、闲置空逻辑方法,拉高代码总行数,降低可读性。
改进:删除无用冗余成员与闲置方法,精简空执行冗余代码段;对重复的引脚遍历、信号读取逻辑抽取为公共工具方法。
第五次PTA作业改进建议
1.子电路信号迭代问题:每次信号迭代没有重置引脚初始值,上一轮残留信号干扰本次运算;内外引脚编号未做转换映射,引脚赋值失效。
改进:每次子电路信号传播前将所有输入引脚统一重置为 - 1;单独封装内外引脚编号转换工具方法,外部引脚自动映射为内部下标。
2.类之间关联设计问题:子电路内部元件、外部连接关系分散存储,信号传播需要遍历多个集合,查询效率低。
改进:用双向 Map 维护线路正向、反向连接关系,只需一次遍历即可完成信号下发;子电路内部封装独立的数据持有类统一管理引脚、元件、连接。
3.语法校验覆盖不全问题:子电路输入、输出引脚的合法性校验缺失,无法捕获子电路引脚的信号冲突。
改进:完善引脚类型判断规则,区分全局外部引脚、门输入引脚、门输出引脚、子电路内外引脚四类场景,全覆盖线路冲突校验。
第六次PTA作业改进建议
1.输出排序规范问题:仅做字符串字典序排序,未按照「门类型→元件数字编号→子电路编号」自然排序,输出格式不符合要求。
改进:自定义比较器,先按门类型优先级排序,再提取元件末尾数字做自然升序,最后按子电路编号排序。
2.代码可读性问题:核心复杂业务方法缺少注释,关键设计逻辑无说明;注释整体占比偏低,不利于后期维护。
改进:为工厂、信号传播、语法校验等核心类与复杂方法添加功能注释,关键分支逻辑补充行内说明。
(5)总结
一、阶段学习回顾
第四次作业我通过接口、工厂模式拆分类,遵循单一职责实现代码解耦,但正则、引脚校验存在漏洞。第五次作业利用聚合、组合等关系完成子电路建模,使用集合替代固定数组,不过出现了高圈复杂度、多层嵌套的代码问题。第六次作业完善了全局信号处理、格式排序与语法校验,代码规范性明显提升,但仍存在注释不足、冗余代码多等问题。从把所有代码写在主方法,到分层架构、面向接口开发,我的面向对象设计能力得到稳步提升。
二、掌握的知识
学会面向接口编程、工厂设计模式,使用枚举、静态工具类规范代码开发。
熟练运用List、Map等集合存储业务数据,掌握正则表达式解析复杂输入。
能合理使用依赖、聚合、组合、关联四类类间关系完成业务建模。
学会用 SourceMonitor、UML 类图分析代码质量,定位并优化高复杂度代码。
严格遵循封装原则,私有化成员变量,通过 getter 保护内部数据。
三、待提升方向
复杂代码重构能力不足,不会高效拆分高圈复杂度、多层嵌套的方法。
未使用自定义异常处理错误,仅靠条件判断拦截异常场景。
只会手动测试代码,需要学习 JUnit 单元测试来覆盖各类边界用例。
缺少代码精简、编写注释的编码习惯。
四、课程改进建议
非常感谢老师循序渐进的作业安排,让我系统掌握了面向对象的设计思想与代码优化方法。现在程序设计基础课程已经结束了,我认为老师们的课程可以不一上来就设置这么难的题目,可以设置5~10道简单语法题帮助我们先巩固语法,再上难度,其他方面都挺不错的,尤其是现在各个作业都延长了时间。

posted @ 2026-06-22 09:31  盛钰玲  阅读(5)  评论(0)    收藏  举报