面向对象编程前三次大作业总结
<h2 id="前言">前言</h2><p>本次大作业是第一个面向对象编程的实操练习,难度从中到难,层层递进。</p>
<ul>
<li><strong>OOP题目集01</strong><br>
大部分是作为前面Java程序练习的过渡用的练习题,题目简单,题型常见不复杂,能帮助我们学习更多方法运用于Java编程当中。<br>
第一次电梯调度程序也是基础的电梯类设计,初步了解题目的需求,为以后的迭代设计奠定基础。</li>
<li><strong>OOP题目集02</strong><br>
本次题目集对类设计有了更严格的要求标准,题目复杂度逐渐上升,涉及类的创建和使用,能够更好地加深面向对象编程思想。<br>
第二次电梯调度程序在第一次的基础上进行了迭代涉及,了解单一职责原则。</li>
<li><strong>OOP题目集03</strong><br>
本题目集需要解决更深层次的应用,涉及到类的继承等等。<br>
这次的电梯调度程序则进一步开始迭代性设计。</li>
</ul>
<h2 id="设计与分析">设计与分析</h2>
<p>由于能力上的不足等原因,有关单部电梯调度的程序未能成功调通(或未完成),故在此主要分析我代码上的缺陷不足和问题所在。</p>
<h3 id="题目集1单部电梯基础调度">题目集1:单部电梯基础调度</h3>
<h4 id="类图设计">类图设计</h4>
<p><img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122171620402-524829784.png" alt="image" loading="lazy"></p>
<h4 id="源码分析要点">源码分析要点</h4>
<p>首先,编译并运行之后显而易见的出现了错误:运行时错误,会一直循环打印,并且楼层数量始终为0,显然出现了很多逻辑错误。<br>
这边是用ai工具分析的情况:</p>
<ul>
<li>
<p>逻辑混乱<br>
在<code>Main</code>类中,使用字符串长度(<code>input.length()>=3&&input.length()<6</code>)来区分内部和外部请求不可靠。例如,外部请求<code><10,UP></code>长度为7,会被错误分类;内部请求如<code>100</code>(3字符)可能被误判为外部请求。<br>
<strong>改进建议</strong>:最好使用正则表达式或解析请求内容来区分类型</p>
</li>
<li>
<p>数据封装不足,违反OOP原则<br>
<code>Elevator</code>类的字段(如<code>IQ</code>、<code>OQ</code>)被声明为<code>public</code>,并在<code>Main</code>类中直接访问(例如<code>elevator.OQ.add(input)</code>),破坏了封装性。<br>
<strong>改进建议</strong>:将字段设为<code>private</code>,并通过公共方法(<code>addRequest(String request)</code>)来添加请求,内部根据请求类型自动分类</p>
</li>
</ul>
<h4 id="分析报告">分析报告</h4>
<p><img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122214015747-2078533346.png" alt="image" loading="lazy"><br>
<img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122220019519-967709518.png" alt="image" loading="lazy"></p>
<p>报告显示:<br>
<strong>代码质量指标:</strong></p>
<ul>
<li>分支覆盖率:27.6% - 测试覆盖率较低</li>
<li>注释率:21.7% - 注释相对充分</li>
<li>方法复杂度:平均每个方法7.06条语句</li>
</ul>
<p><strong>复杂度问题:</strong></p>
<ul>
<li>最大圈复杂度:4(标有*号,表示有方法较复杂)</li>
<li>平均复杂度:1.85(标有*号,超出理想范围)</li>
<li>最大嵌套深度:4层</li>
</ul>
<h3 id="题目集2单部电梯增强调度">题目集2:单部电梯增强调度</h3>
<h4 id="类图设计-1">类图设计</h4>
<p><img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122221131040-756461004.png" alt="deepseek_mermaid_20251122_af78b9" loading="lazy"></p>
<h4 id="源码分析要点-1">源码分析要点</h4>
<p>由于时间问题,我并没有完成最后的代码,因此以下是使用ai工具分析其他代码部分的结果:</p>
<ul>
<li>
<p>调度算法逻辑问题<br>
在<code>hasRequestsInDirection</code>方法中,条件<code>elevator.getCurrentFloor() == req.getFloor()</code>可能逻辑不正确,电梯当前楼层等于请求楼层时应该直接处理</p>
</li>
<li>
<p>方法复杂度依然偏高<br>
determineDirection()<code>和</code>hasRequestsInDirection()`方法逻辑较复杂。</p>
</li>
<li>
<p>缺少输入解析层</p>
</li>
</ul>
<h4 id="分析报告-1">分析报告</h4>
<p><img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122220421225-1488340415.png" alt="image" loading="lazy"></p>
<p><img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122220318317-275877900.png" alt="image" loading="lazy"></p>
<p>报告显示:<br>
<strong>代码质量指标:</strong></p>
<ul>
<li>分支覆盖率:17.8% - 测试覆盖率下降</li>
<li>注释率:9.3% - 注释比例减少</li>
<li>方法复杂度:3.10 - 方法规模明显减小</li>
</ul>
<p><strong>复杂度问题:</strong></p>
<ul>
<li>最大圈复杂度:4(标有*号,表示有方法较复杂)</li>
<li>平均复杂度:1.14(标有*号,但相比第一次的1.85显著降低)</li>
<li>最大嵌套深度:4层</li>
<li>平均嵌套深度:1.41层</li>
</ul>
<h3 id="题目集3单部电梯优化调度">题目集3:单部电梯优化调度</h3>
<h4 id="类图设计-2">类图设计</h4>
<p><img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122222928630-381840158.png" alt="deepseek_mermaid_20251122_9d724a" loading="lazy"></p>
<h4 id="源码分析要点-2">源码分析要点</h4>
<ul>
<li>重复请求过滤不完整<br>
虽然内部请求有去重,但外部请求没有。</li>
<li>楼层有效性检查缺失<br>
添加请求时没有检查楼层是否在有效范围内。</li>
<li>方向匹配逻辑可以优化<br>
在<code>shouldStop</code>和<code>removeRequests</code>中重复了相似的方向检查逻辑。</li>
<li>硬编码的初始输出<br>
Main类中硬编码了初始方向输出。</li>
</ul>
<h4 id="分析报告-2">分析报告</h4>
<p><img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122222748629-1405484697.png" alt="image" loading="lazy"><br>
<img src="https://img2024.cnblogs.com/blog/3642960/202511/3642960-20251122222807514-381669825.png" alt="image" loading="lazy"></p>
<p>报告显示:<br>
<strong>代码质量指标:</strong></p>
<ul>
<li>分支覆盖率:22.3% - 测试覆盖率有所改善,但仍偏低</li>
<li>注释率:22.3%</li>
</ul>
<p><strong>复杂度问题:</strong></p>
<ul>
<li>最大圈复杂度:3</li>
<li>平均复杂度:1.54(相比第二版的1.14有所上升)</li>
<li>最大嵌套深度:6层</li>
<li>平均嵌套深度:1.85层</li>
</ul>
<h2 id="踩坑心得">踩坑心得</h2>
<p>第一次设计最大的问题就是逻辑混乱复杂,所有功能都往一个类装,调度逻辑、状态管理、队列处理混杂在一起。<br>
第二次有了参考类图设计,结构方面稍微改善了点,但由于第一次未能打好基础,所以第二次也没有成功写出完整的程序。<br>
第三次终于能正常运行了,但依然存在答案错误,未通过测试点的问题,这说明我在新增功能时没有同步增加测试,而且嵌套深度过深,条件判断过于复杂了。<br>
随着程序的复杂度上升,应在注释方面多注意,方便未来调试。</p>
<h2 id="改进建议">改进建议</h2>
<p>可以针对架构设计、复杂度控制等方面进行改进,详细的前面已注明,不再多说。</p>
<h2 id="总结">总结</h2>
<h3 id="收获与成长">收获与成长</h3>
<p>通过本阶段的练习,我能够学会如何设计类以及合理进行职责划分,并且能从只关注功能到关注复杂度、覆盖率,学习了迭代优化思维,能够通过持续重构改善代码质量。</p><br><br>
来源:https://www.cnblogs.com/lrx0918/p/19255745
頁:
[1]