oop第二次博客

write_by_23201707_gongjunjie

一:前言

本次博客主要是对pta上4-6次题目集的总结
这次的pta题目集将上次的答题判题的题目又迭代了一次,但是它还是永远的离开了我们~~
那么后面两次题目集则是使用电路问题取代了我们又爱又恨的答题判题题目集
那么废话不多说,下面正式进入我们对三次题目集的分析~~

二:关于三次pta作业

先说一下答题判题4吧,这次的答题判题也很有意思,它加了多选题和填空题,这刚开始可是让我头大,多选题其实还好,
可以将答案保存后进行对比,而后给分,但是填空题的给分方式刚开始可是难到我了,一开始简单的就是想用equals方法进行对比检查,然后给分,但是感觉似乎有点简单了,
但是后面也是先这样写上了,因为是继承了一个抽象类要实现方法,但是不知道怎么实现,就先硬着头皮写了,但是没想到竟然真的就是这样的!!!那只能狠狠拿下,这次的答题判题
较上次加上了多态的使用,依然还是有错误的输入,但是经过上次题目集的熏陶,这次也是简单的将其拿下了。
电路问题就要好好说一下了
这个题目集真的是等的花都谢了

但是在五一假期期间我也是看了很多遍这个题的初稿,但是我当时想了很复杂的电路,感觉写不出来程序,但是因为他说这次题目只有串联,所以我直接写了一个串联的程序,
显然这个程序在下一次题目集让我狠狠的感受到了代码的险恶

那么这次串联的题目集也是很快就拿下了,但是值得注意的是这次的题目集需要按一定的顺序输出电器,所以还要小小的排序就解决了
第六次的题目集可是让我改了半天,还顺便复习了一下高中物理知识,这确实是狠狠赚到
知识点:
1.类的设计,这几次的题目集让类的设计变得极为重要,让我感受到了一个好的设计真的是能够很快的写完程序
2.正则表达式的使用,经过上次的磨炼,对于正则表达式的掌握还是较为熟练了一点的
3.抽象类和多态
4.使用list,可以简化一些程序
题量:
1.题目量个人感觉还行,可以应付的过来
2.这几次的测试点还是比较人性的,没有很难想到的测试点
难度:
难度的话,其实第四次的题目集因为刚开始使用多态,多少是有点生疏的,所以可能会感觉难一点吧,后面第五次因为只有串联所以感觉还好,第六次本人觉得难度最大的是求每个电器自己的分压,这个我也是苦思了很久,终于将其求出

三:关于设计与分析

第四次pta作业

关于类设计

这次的类设计和上次的没什么大区别,只是处理问题的逻辑发生了一些改变,类图如下

可以看到类间关系还是比较复杂的,但是其实主要的业务逻辑我都放在了Control类里面,但是我写了一个抽象的Content题目类,后面有三个具体的题目类继承他,一个是单选题,一个是多选题,还有一个判断题,然后可以使用多态,定义一个子类的对象赋给父类的引用,这样可以减少代码的重复

分析代码

这次的主要逻辑依然是放在了Contorl类中,这个类是用来是联系各个类的,达到解耦的效果,可以说是初步实现一下迪米特法则吧(虽然似乎也没完全实现),但是还是要多加练习,让后面的程序更加的灵活多变才行,而Control类中有一个函数就显得十分重要,那便是输出,但是感觉好像没有达到单一职责原则,现在来看果然是有很多不足啊
int judge = content[Integer.parseInt(paper[g].getContentNum()[i])].score(answer[j].getAnswer()[k].getAnswer());
这行代码本人觉得是这次题目集写的最好的一行,使用了多态,感觉多态真的很好用,这个就让每个题目的正确与否都返回了一个特定值,然后根据这个值来给每个题目打分,然后输出。

每个题目类都会有这个函数,这个是单选题的,然后比较复杂一点的自然是多选题,所以主要看一下多选题的

点击查看代码
    @Override
    public int score(String studentAnswer){
        String[] a = new String[100];
        String[] parts = studentAnswer.split("\\s+");
        int[] flag = new int[parts.length];
        int count = 0;
        for (int i = 0; i < parts.length; i++) {
            flag[i] = 0;
            for (String s : this.standardAnswer) {
                if (Objects.equals(parts[i], s)) {
                    flag[i] = 1;
                    break;
                }
            }
        }
        int b=0;
        for (int i = 0; i < this.standardAnswer.length; i++) {
            if(standardAnswer[i]!=null){
                count++;
            }
        }
        for (int j : flag) {
            if (j == 0) {
                return 0;
            }
        }
        if(parts.length==count){
            return 1;
        }
        else {
            return -1;
        }
    }

主要逻辑是将传进来的答案进行拆分,然后用一个大小为答案数量的数组记录是否答案是否正确,正确则为1,不正确则为0,然后如果有数组有一个值为0的话就返回0,答案错误,如果没有0,就判断长度,如果长度相等就返回1,答案正确,如果不相等就返回-1,部分正确,因为前面的判断已经保证到这个判断的时候只会是答案个数小于标准答案,所以不用考虑大于的情况,然后其他的判断和上次题目集没什么变化,写完之后就可以满分了
下面是SourceMonitor的代码分析

可以看到Control类和Mian类的复杂度较高,因为主要功能就是放在这两个类里面,所以单一职责原则还是不够,后续的设计还是需要修改的

踩坑心得

关于踩坑,个人感觉这次的题目的测试点还是比较正常的也没有什么测试点,把正常逻辑写完之后应该差不多了,但是要说的一点是,对于选择题信息的提取有一些问题,如果只用分组的话可能会提取到一些没有用的东西,所以这一块我使用的是切割

改进建议

1.个人觉得单一职责没有做好,应该将类和函数都做的更加单一,提高代码的复用性
2.答卷类也可以抽象(如果有下次迭代的话)
3.可以写一个工厂类,用来生成对象,遵循单一职责原则

第五次pta作业

关于类设计

第一次迭代类设计还不是很复杂,只是实体类有点多,毕竟有很多电器,这次的迭代也是等了很久才来啊
直接上类图

可以看到类间关系并不是很复杂,这次的类设计主要是抽象类,然后具体的类继承,抽象了控制类和被控制类,开关和调速器继承控制类,风扇和灯继承被控制类,这些电器后面迭代都会加,
所以要先做好准备,达到开闭原则,然后我还建了一个工厂类,本来是想用工厂设计模式的,但是写着写着就不像样了,所以干脆魔改了一下工厂类,只用一个函数当工厂,然后写几个函数用来
对输入的信息进行处理

分析代码

这次题目的输出部分和改变电压部分使用了多态,然后还有就是因为输出需要一定的顺序输出,所以我就先对数组进行了排序,然后按一定顺序输出,这次的业务逻辑其实没有很难,每个电器的引脚好像都没能用的上,因为是串联所以一定是顺序输入,不需要再关心引脚的问题,这样处理让题目简单的多,然后是这次的题目集的输出有一些规则,输出时不能用保留小数输出,因为那样的话会四舍五入,但是题目要求是直接去掉小数部分,所以要将double类型直接强转为int类型,然后进行输出,这样就会直接去掉小数部分

输出部分我也做了多态的使用,这样又可以简化代码
下面是SourceMonitor的代码分析

可以看到只有工厂类和Agent类的复杂度较高,其他的类复杂度都是比较低的,这样就很好的遵循单一职责原则,对于类的设计更好了
输出部分先对数组排序,然后按照题目要求顺序输出

踩坑心得

这次题目集其实写完大概逻辑差不多就结束,不过还是有两个小点需要注意
1.关于调速器的档位,因为这次迭代的调速器是四个档位,所以在调档的时候如果大于第四档就不再往上调,如果降档,则降到0档不能再往下降
2.第二个就是输出问题,需要按照一定的顺序

改进建议

1.对于类的设计应该再加个串联还是并联的抽象类,为下次迭代做准备
2.对于工厂类的使用,没用做到很好的单一职责,应该做一下改进

第六次pta作业

关于这次的pta,可要好好说一下,我的代码在这次的迭代迎来了很大的修改,果然是设计的还不够好啊

关于类设计

这次的类设计是较为庞大的,因为有很多的实体类,之间又有所关联,就会比较复杂
先看BeContorlled类的继承

可以看到有很多的电器继承BeContorlled这个抽象类

1.我在这次的题目集又加上了电路的抽象类,让串联和并联类继承,然后还做了一个chang类,用来对电器的修改信息进行储存,大概算是一个小小的设计
2.可以看到设计了一个Agent类,用来解耦,遵循迪米特法则和单一职责原则

分析代码

1.首先要分析的是输入这块,我做了一个工厂类,将创建对象给了工厂,然后工厂类的其他方法对输入的信息进行处理
2.Agent类对业务信息进行处理,整个代码逻辑都是这个来完成
3.关于如何求每个电器的电压,我的逻辑是先求整个电路的总电阻,然后求出电器自己的那条路的总电阻,用自己的电阻比上这条路的总电阻在乘上这条路的电压,就是这个电器的电压,那首先的问题就是如何求电阻
4.求电阻分成两部分,一个是被控制类,直接就可以求出电器的电阻,一部分是电路,这就需要看是并联还是串联,然后根据自己的求电阻的方法求电阻,最后都加起来就是总电阻,需要注意的是有一路的开关没有闭合的情况
下面是求并联的电阻

下面是求串联的电阻

这些方法都会一层一层的进入,直到求出所有电阻
5.求分压,就是将每一部分的分压求出,然后再求每个电器的分压
6.关于求电器的转数和亮度,因为要按照一定顺序输出,所以需要先将电器的这些东西算出,然后保存,后面排完序再输出
7.需要注意的是求电器的转数和亮度不能用电流求,因为会有误差,如果有小数的话,小数乘上小数就会有很大的误差
8.SourceMonitor的分析结果

可以看到依然是工厂和代理类的复杂度较高,但是较上次有降低,因为采用了多态,使很多业务可以在每个类中完成

踩坑心得

1.如果有一路的开关没有闭合,当传回电阻时不能传0,因为并联电路会用到电阻的倒数,会让数据出现问题,所以直接传一个负数,在并联电路里求电阻的时候如果是负数就不考虑这条路
2.不能用电流求电器的转数或者亮度,会有误差

改进建议

1.应该考虑有什么设计模式比较合适,可以将设计模式运用起来
2.多运用策略模式,减少if-else的使用

总结

学习到的内容

1.学到了很多设计的时候需要注意的东西,各个类之间的关系,抽象类的设计,都需要考虑
2.学到了很多设计模式,在设计的时候深刻感受到了一个好的设计所带来的好处
3.能够熟练运用多态解决问题,减少代码重复

感想

总的来说,经过这几次的pta的磨炼,我感觉我的代码的能力还是有了很大的提升,面对一个问题时可以深入思考,努力解决问题
但是这三次的类设计并不够好,需要进行更改,为下一次的迭代做准备,要多研究研究设计模式,争取下次作业能够有更好的设计
个人认为老师们的教学方法还是很好的,可以学到很多东西,虽然过程比较艰辛,但是收获很多,可以学到很多知识
关于oop的第二次blog就到此结束,下次再见

posted @   破疑  阅读(45)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示

目录导航