第一次Blog作业

前言

java课程的第一单元已经结束了,第一单元以模拟电梯运行程序为中心,题目难度较高,题量也较大,主要是在电梯运行过程中有很多难以注意到的点,主要考察了我们算法以及设计类的能力,在一次次的迭代中,我也曾因程序迟迟无法通过而痛苦不已,但在第一单元结束后才发现这样的一次次迭代让我受益良多。

设计与分析

  第一次电梯迭代程序

由于欠缺设计类的知识,在我的第一次电梯设计中,我只分出了电梯类以及Main类,这也就导致了在我的Main类中有着大量的代码冗余,以下是sourcemonitor的分析结果:

在左下角的图中,绿色的圆是推荐的代码平均数据,不难看出这段代码几乎每一项都是不达标的,当然这也是我刚开始设计较大规模java代码所无法避免的,其中复杂度是最为严重的问题,这一点在右下角的图中可以明显看出,图中的x轴表示代码块的深度。深度为0表示最顶层的代码块(如方法或类),深度增加表示嵌套的代码块(如方法中的条件语句、循环等)。而图中的y轴表示在特定深度的代码块中包含的语句数量,可以看出我的代码深度很高,这是因为我在代码中使用了大量嵌套的if-else语句,同时,这也是java初学者刚开始设计类时的通病。并且因为if-else嵌套语句使用过多导致我在编写是难以差错,所以,我并没有在规定时间内通过,但好在经过我之后不断的调试以及修改,终于还是通过了。

结合两张图进行分析,不难看出我第一次电梯迭代作业确实很糟糕。

  第二次电梯迭代程序

类图设计如下:

第二次电梯迭代中,考虑到我们对类设计经验的欠缺,老师给出了类图,并要求我们依照类图对我们的代码进行修改,由于第一次迭代作业代码设计的过于糟糕,导致我几乎是重写了整段代码,以下是sourcemonitor的分析结果:

从左下角的图中可以看出我代码相比于第一次的代码要优化了很多,在左下角的图中,除了最高复杂度之外,其余指标均降到了接近推荐区域的水平,但是在右下角的图中,我的代码深度依旧还是很高,这是因为我并没有对我代码的整体逻辑进行修改,我只是将代码按照老师发出的类图进行了分割。

  第三次电梯迭代程序

类图设计如下:

在第三次迭代作业中,对类的设计并没有进行太多的修改,更多的对电梯运行逻辑的修改,除此之外,只修改了电梯外部数据的输入方式,并加上了对输入数据的检查(数据是否合法,以及是否有重复数据),整体而言,第三次迭代作业是整个第一单元中我需要做的修改最少的,以下是sourcemonitor的分析结果:

从左下角的图中可以看出,我整体的代码数据并没有多少变化,这是因为输入方式的修改使得电梯的运行逻辑变得更加复杂,于是我不得不加上更多的语句用于调整,使得我的代码变得更为复杂。而在右下角的第二张图中,可以看出代码深度并没有变化,这是因为我并没有加入更多的if-else语句,而是在原有的语句中进行修改与添加。

踩坑心得

在三次的迭代作业中,我遇到了很多的问题,现在仅在此说一说我认为最容易犯的错误(也是我在编码过程中遇到最多的问题):

1.在调用Arraylist和Linkedlist的get方法之前一定要检查该链表或列表是否为空,否则在多个链表或列表中的一个突然转变为空时,可能会因为调用get方法而报错(java.util.NoSuchElementException),以我自身的代码为例子,在一个循环中(条件为两个链表均不为空)我在其中一个链表只剩一个元素的情况下,在循环的中间将该链表的最后一个元素移除(在这之后还会再访问这个链表),于是在之后的代码中就会出现访问空链表的情况,于是编译器便会报错。所以在使用链表时,要么在循环的最后进行元素的移除(但是有时候还需要将要移除的元素进行判断)或者在每次需要访问链表元素之前判断该链表是否为空。

2.有时在编写方法时,可能会遇见缺少return语句的报错(java中要求return语句,必须涵盖所有可能的情况,否则可能会报错),但是检查一遍下来发现自己并没有遗漏的情况,这往往是因为你没有考虑到出现异常的情况,这时你需要返回一个默认的值。

改进建议

1.减少if-else语句的使用,这样可以使代码的深度降下来,同时也可以使代码的逻辑更加简单明了。

2.我发现很多重复的代码段可以用方法来替代。这样一来,不仅提高了代码的复用性,也让我在修改功能时更加方便,只需要改动方法内部的逻辑即可,而不用在多处进行修改。这样做提高了我的工作效率,也让代码看起来更加整洁。

总结

  学习到了什么

在这三次迭代作业中我学到了很多:

   1.我对Java的基本语法有了更深入的了解。这包括了对变量、数据类型、控制结构、循环、数组和异常处理等核心概念的掌握。我现在能够更加自信地编写出结构清晰、语法正确的代码。

   2.我开始建立起面向对象的设计思路。我理解了类和对象的概念,学会了如何定义类、创建对象以及如何使用继承、封装和多态等面向对象的核心特性。这让我在设计程序时能够更加注重模块化和代码的可重用性。

   3.我认识到了代码可拓展性的重要性。在编写代码时,我更加注重代码的结构和组织,以便于未来的维护和扩展。我学会了如何编写易于理解和修改的代码,这对于长期项目来说是非常宝贵的。

   4.我学会了如何使用SourceMonitor等代码分析工具。这些工具帮助我分析代码的复杂度、评估代码质量,并提供了改进代码结构的建议。通过这些工具,我能够更客观地评估自己的代码,并采取相应的措施来提高代码质量。

   5.我学会了如何使用枚举(在 Java 中,枚举(Enumeration,简称 Enum)是一种特殊的数据类型,它允许将变量限定为预定义的常量集合中的一个。枚举提供了一种类型安全的方式来定义一组命名的常量,这些常量代表了同一类型(即枚举类型)的不同值。)

   6.我学会了如何使用静态方法(在 Java 中,静态方法(Static Method)是一种属于类而不是类的实例的方法。这意味着你可以通过类名直接调用静态方法,而不需要创建类的实例。静态方法通常用于实现工具类或实用程序类中的功能,这些功能通常与类的状态无关。),在我的代码中,我主要用于在Main类中的main方法中调用Main类中的方法(main方法是静态的,所以想要在其中调用同类中的方法的话,该方法也需要是一个静态方法)

  需要改进的地方

   1.我意识到自己在Java编程中对一些类和方法不够熟悉,这让我在解决问题时缺乏灵活性。我需要更深入地了解Java的常用类和方法,以便在实际项目中更有效地应用它们。通过查阅官方文档、阅读相关书籍、参加在线课程或工作坊可以提高这方面的知识。

   2.我发现自己在编写代码时过于依赖if-else结构,这可能导致代码变得复杂和难以维护。我应该寻找更简洁的方法来判断逻辑,比如使用状态模式、策略模式等设计模式,或者利用Java 8引入的函数式编程特性,如Lambda表达式和流(Streams),来简化条件判断和数据处理。

   3.在设计类方面,我需要提高自己的能力,减少对老师提供的类图的依赖。我可以通过学习面向对象设计原则,如SOLID原则,以及参与更多的项目实践来提高自己的类设计能力。同时,我也应该尝试自己进行需求分析和系统设计,从而培养独立思考和设计的能力。

   4.对于Java设计原则,我需要更加熟悉,以便编写出更规范的代码。设计原则是指导软件开发的重要准则,可以帮助我编写出易于理解、维护和扩展的代码。通过学习和实践这些原则,我可以提高代码质量,减少未来可能出现的问题。

  对课程组的建议

   1.在设计题目或项目任务时,我们应该努力使它们更加贴近现实生活中的场景和问题。这样做不仅能够提高参与者的兴趣和参与度,还能帮助他们更好地理解和应用所学知识。通过模拟真实世界中的情况,参与者可以在一个安全的环境中实践和测试他们的理论,从而在解决实际问题时更加得心应手

   2.在设计题目时可以多给一些测试用例,特别是一些正常情况下难以想到的(一些比较容易想到的测试点,比如输入的值很多时,是否还是正确的,以及能否将重复的输入信息略过,这种比较正常的测试点可以不给出,但是如同当输入时只有一个一楼时应该输出什么就应当给出),如果学生因为一个很小的点,而不断的尝试,但他最后仍然无法提交正确时,他的感觉会如何呢,诚然,适当的让学生思考有哪些自己没有考虑到的测试点是一件好事,但这些需要学生自己探索的测试点不应该太过于难以想到,这样让学生自己试错,会极大的浪费学生的时间。

posted @ 2025-04-19 11:19  方的一匹  阅读(41)  评论(0)    收藏  举报