20373222李世昱第四单元总结

第四单元架构部分

基本逻辑架构

最基本的思想便是基于parentid让他的归属对象建立管理他的容器,然后主类存最顶层的类,这样要得到某一得到某一层次的对象便可以逐层下降的索要。询问,检查异常等方法让类自己提供,主类只负责选中所要求的类以及汇总结果

输入逻辑

由于输入时乱序的,有可能某个对象所指向的parent还没有读入,他自己先读进来,所以这里可以休整一下顺序,每次读入的对象,要求他几乎所有携带的id对象(如parent,source,target)等先进行处理,处理完毕的对象将自己id汇报,下次优先处理如果已经处理则直接跳过。(关联关系和end要另外处理,否则可能死循环)

算法逻辑

这里的查询大部分都是简单图论算法,继承深度等可以直接递归实现,稍微复杂一点的比如ROO3寻找环可以先遍历入度为0的点,然后dfs去搜索环,被搜索的点会记录下来,没找到一个环就记录所有成员id并退回,此外由于他可能成完整的环还要检查没有被搜过的点再次dfs,直到所有点都被搜索过。

四个单元的演进

一单元:

一单元,也是我认为oo味道最浓的地方,学到了递归下降的崭新思路,自己从一无所有搭建了完整的高智能的计算器。其中递归下降把语句拆分成逻辑树的思想,还为下学期编译的学习奠基了基础。论学到东西一单元和做出能跑的程序的成就感,一单元绝对榜上有名,当然消耗的时间也一骑绝尘。
一单元我觉得设计中最精髓的部分就是设计的“算子接口”(详情移步至第一单元总结),将所有的结构都视为算子,要求该结构有自我更新的能力和将自己信息转变为hashmap的能力,从而在代码中无需关心具体的结构是什么。
本着学以致用的心理,我仿照递归下降的方式反向写了数据生成器,测试强度也很高

部分生成数据如下:
1
f(x,y,z)=-+(---0)0
-+-0*sum(i,1,10,x
2)-+(--+2+++0-0)1
2
f(x,y,z)=-+y
1
z1-+0*x2
g(x,y,z)=-++2z**0
++(-+-0
2)-0
3
f(x,y,z)=-0
g(x,y,z)=+-1--0
h(x,y,z)=+-y**2
1++-0
--cos(sin((-+x1-++0*x1)))--(--x**1+--4)
这部分数据是通过调整参数大幅度缩短项目长度以及增加01出现的概率得到了,大量随机的这种数据够覆盖一些很极限的情况。

第二单元

第二单元是完整的认识了一个新东西:多线程。这里提个小建议,感觉如果学完os的线程再回来理解多线程会理解更深刻一些。
二单元是确确实实学到多线程的知识了,以及课上实验讲述的流水线模型等多线程协作架构也很有意思,我第二单元想让电梯更加的自由受控,选择的是统一调度的方式,把电梯抽象为图,节点是某楼层某座的坐标点,电梯的繁忙程度影响边的权重,这样通过合适的参数可以直接用最短路算法让每个人选择最优的方法,这次尝试确实很有挑战性,但是性能不是很理想,具体原因在第二单元博客中分析了,详情请移步。总体而言,第二单元算是我们认识多线程安全问题以及架构的指引,个人认为还是很有必要的一单元
第二单元我的数据生成逻辑转变为逻辑关联测试,每生成一个请求尽可能生成与之有关联的请求,如顺风,抢占等来区分开不同算法的性能,我在本地与一位自由竞争的同学比对的时候确实有的数据点有奇效可以快20%,说明确实有区分度,可惜调参太玄学(

第三单元

第三单元全部学习内容就是读懂JML语言,一种离散化的语言,架构基本不需要自己想,学到的就是认识了形式测验以及未来可能的正确性保证的代码方式,我个人觉得这些内容分配3周有些浪费,不如让给第一单元。
第三单元测试程序思路就是根据JML条件反写全覆盖,三单元博客详细论述了,再次不再重复

几个建议

个人认为1单元是最体会面向对象的部分,但是一单元难度层次设计有问题,第二次作业耗时耗力,第三次作业却只需要改动几行,并且考虑到一单元是刚开学的学生第一次接触oo,所以建议如下:
适当减少3单元课时,反过来增加到第一单元,同时适当降低梯度和第一次作业难度,尽可能让更多学生适应

另外,作业中常常说要思考迭代性考虑,而实际迭代的方向不知道也很难处理,所以不如在每次作业中透露下一次作业迭代的方向,比如第一次作业最后,可以说之后有可能加入sin(x) e^x ln(x)让学生在第一次设计中就对之后设计有所思考

此外,研讨课的主题(只知后两个单元)应该让学生有交流的需求和需要,比如第一单元的化简处理,第二单元的架构,调度处理等,三四单元如无研讨必要可以尝试换位其他方式

posted @ 2022-06-22 00:23  zdfwqc  阅读(46)  评论(0编辑  收藏  举报