????第①单元
知道要写博客实在太开心啦,因为我就喜欢写些奇奇怪怪的东西,然后沉迷于把它变得越来越??里胡哨(雾
杂谈 废话 和 心路历程 废话
大二下是来6系的第二个学期了,依然频繁地为同学们的强大感慨不已(同时觉得自己菜的不行)
开学不满一周,就能分明地看出来OO这门课和别的课不太一样。
起初在寒假的时候,我以为这有是一门类似于c语言或数据结构的课,教你一些语言或以语言为载体教你一些初级算法。后来寒假的pre2,3一出来我懵了,我以为要学的东西竟然已经要求你在寒假自学完成了?!于是本人承受了来自OO的第一波打击。不过这波打击后劲不够足,它只使我在寒假奋发图强了一天,一天之后我就想通了:),我必是追不上大佬们的进度了,那我还是慢慢来吧,于是我又享受老年生活了??
慢慢悠悠写完pre后,我了解了JAVA关于面向对象的特点和常用概念,感到疑惑,这不就是面向对象吗,这要学一学期吗。于是本人在开学后承受了来自OO的第二波打击。打击主要来自全世界最可爱的诸彤宇老师??虽然到现在还没见过诸老师本人,但本人小心求证、大胆推测诸老师打字速度一定很快,一定是一个十分认真负责的人,坚持每天鼓励我们熬夜勤奋学习,偶尔还教教我们地理啥的,让我奇怪的知识又增加了。
正如标题所说,以上都是废话(显然),诸老师一再强调这门课的难度,我方收到持续性伤害。再加上评论区的大佬们层出不穷的智慧结晶,让我深深地意识到我too young too simple,触发了被动技能【我太菜了,再不学就挂了】
第一次作业--简单多项式导函数的求解
- 创建了两个类 Expression 以及 Item 并没有考虑到扩展性,只考虑到本次作业中表达式一定由指数幂的项组成,故创建了 指数幂 以及由其组成的 表达式 两个类。但事实上在阅读讨论区后(在此由衷表扬讨论区机制同时赞美耕耘奉献的大佬们)意识到我该重构了,但是怕这次互测出事子,决定下次再重构吧。反思自身是对接口的相关知识仍然过于薄弱。
知识点杂记技
我的输入法告诉我“杂技”比“杂记”更合适,我仔细这么一想,有道理!这些在实践中零碎摘取的小知识点不就像在OO大舞台上展演的绝活一般嘛???♀?!
BigInteger
类是JAVA中用来处理大数运算的有力武器,但注意它与String类一样属于不可变类型,对其做的任何修改都会产生新的对象,即不能通过调用它的方法来改变自身的属性- 在用
matcher.group()
之前一定要先用matcher.find()
,否则报错No match found
- 调用
split()
的时候一定要注意会不会split()
出空的数组,防止越界 - 在迭代容器的过程中如果对容器进行修改就会导致
java.util.ConcurrentModificationException
异常,具体分析https://www.cnblogs.com/dolphin0520/p/3933551.html,在补充接口知识后进行探究 - 构建自动评测姬?????
- 黑盒评测姬
比较常规的评测方法,借助python语言灵活实现(当年测p6用c语言写又臭又长的数据生成器用掉的时间比p6本身还长,反思得出:“菜的人总是瞎忙活“的结论,比如我现在在这自言自语、自娱自乐)
- 数据生成
使用python中的
xeger
第三方库生成数据耗费了大量时间研究输出到文件里查看为什么会乱码——当python写入文件时,默认使用的
utf-8
编码,在win上打开会乱码,因为win默认编码是gbk
。反正一会要用脚本实现自动化,于是直接改为print()
结果并> in.txt
解决了这个问题。之后编写bat文件编译运行.py文件并输出到in.txt,vscode每次执行python文件都显示了向终端输入的命令,并没有明白是什么意思,直接copy过来用了。(vscode的各种配置真实把我搞懵了,东西太多了)
- 编译运行java
需要用bat文件逐行读入in.txt的内容并且输入给java文件,需要掌握批处理循环读入以及编译运行java的相关操作
读了一篇博文,发现真正的强者初学java是不用eclipse、idea这种开发工具的??感谢OO课程组还没有变态到这个程度
中文注释会让事情变得更麻烦,还是默认gbk的问题
对java的文件流还是很陌生,光输出到文件这个动作就不停被卡。最后用了输出重定向,注意这里三个点:
- 文件名最好是绝对路径具体到文件而不是文件夹
- append=true
- autoflush=true 典型it can run, but why? 但模模糊糊知道大概什么意思吧,似乎存在缓冲区的东西不flush就会被下次覆盖掉?
System.setOut( new PrintStream( new BufferedOutputStream( new FileOutputStream("E:\\Java\\OO-hom1\\src\\out.txt",true)),true));
- 代值计算结果
分总结上图指导书中给出的判定方法,在测试正误过程中主要有以下几个方面需要考虑:
- 圈定数据范围
- 数据量/每次
- 测试方法 指导书采用为表达式赋值的方式检验表达式运算是否正确
- 判据 指导书这里为什么这么判断我怎么不太明白。我们知道浮点数的计算是不精确的,但是为什么要除以这样一个
- 对错误测试数据的处理 本例中考虑的十分深远,如果仅限于第一次作业应该没有人不用表达式正常求导做,因此不会出现不可导的点。但这一步仍十分重要。有时错误的数据会使程序陷入死循环中,此时如果在程序中加入检测模块,并且重新生成数据,制定一定的判断标准(如本例中的最多重试五次)会使测试程序健全很多!
- 对拍
这一步和上一步在一个.py文件里实现
- 生成bat文件
批处理你会了吗???
- 数据生成
- 白盒评测姬
- 总结分析:
- 黑盒评测机使用的是过程式编程,我们可以把任务明晰地分成几步,每一步单独编写一个过程函数来实现。那么为什么不用c语言实现?那当然是因为python灵活且有丰富的库(但用不熟python的本人写起来这叫一个费劲,什么东西都是现查,哎我太菜了)到这里我不禁在想,对于自动化测试这种应用向的程序,我们是不是也能用面向对象的编程方式实现呢?
我们可以将每个数据点(在本例中是一行表达式)都包裹成一个类,其成员变量有自己的表达式,求导式;方法根据正则表达式构造表达式,计算求导式,输出表达式,代值计算求导式并返回结果。大体上他与我们程序中写的类区别在于表达式自动生成而不是由读入产生,计算求导式使用默认正确的第三方库。我们可以由后者生成数据输给前者,后二者一起计算、代值、比较。回过头来一看,这根本就是又写了一个实现方式然后左手和右手对拍,看起来不大行。
个人认为面向对象思想下的程序很重要一部分就是实现对象过程中对类的部署,如果你的测试程序也用一样的方法部署,只是计算方法不一样,或许并不能测出来架构中存在的问题(本例中它只能测出来你用java写的求导是不是写对了),这完全就是上上学期和上上上学期的考察内容(自动加密,如果是间谍就看不懂?????)
还有一个原因,在于我们现在借用的是python的第三方库,你在python和java两种语言里 左 右 为 男,难免要用到批处理调停,先编译运行哪个,谁的输出给谁做输入,都是你必须要思考的问题,自然而然地映射到了“流程”之上,这时候你在用python再面向对象一下至少在本题中显得没有必要。
?爱情也是一样的道理?,如果你是一个bat(您是个电商巨头? 只有奶茶妹妹这种的才配得上您!)想要找对象,在两个追求者之间左 右 为 男,那你最好只选一个当对象,另一个当作流程化的工具人就行(???为了自圆其说已经没有三观了)但如果你实在精力旺盛、闲的没事干,那你两个都当对象也不是不行(?)
这时候你可能要想了,小孩子才做选择题,大人我都要!
说的不无道理(根本就是在自言自语啊喂!)
那我能不能让这俩人合个体(...),这样我看似只有一个对象,却拥有有两个对象的极致体验??这就引出了我们的白盒评测姬(原来黑盒评测姬变身之后美白了!!我的魔仙彩石呢??)
以上又有一大堆废话(显然),我发现我废话的产出速度远大于正经话。讲废话的时候我高产似母猪,讲正经话的时候我是一位思维枯竭的程序员。这个故事告诉我们:
今天讲废话,明天变母猪??做人,要从说人话开始
- 由此我们过渡到在java内部实现评测(没想到吧,我讲这些是为了过渡)毕竟跨语言对我这种语言知识贫瘠的人来说很不友好,小脑瓜转不起来。thanks to 评论区大佬(再次感慨及感谢)为我们介绍了一种叫JUnit的工具 (大佬总是把我一些听都没听说过的东西玩的贼溜)
- 黑盒评测机使用的是过程式编程,我们可以把任务明晰地分成几步,每一步单独编写一个过程函数来实现。那么为什么不用c语言实现?那当然是因为python灵活且有丰富的库(但用不熟python的本人写起来这叫一个费劲,什么东西都是现查,哎我太菜了)到这里我不禁在想,对于自动化测试这种应用向的程序,我们是不是也能用面向对象的编程方式实现呢?
- 黑盒评测姬
未 完 待 续
原文地址:https://www.cnblogs.com/hello-code/p/12381078.html