BUAA_OO_2023 第一单元总结

阳婧月-20231005 学生 2023-03-19 19:36:04

BUAA_OO_2023 第一单元总结

程序设计结构

  • HW1

  1. 类图

    在第一次作业中我使用表达式-项-因子的逻辑结构,用lexer读取字符串,在parser中进行解析。以factor类作为接口,根据题目的文法要求,建立了各种基本因子类和表达式(因子)类。用Unit类(单项式结构)进行最终化简结果的储存和运算,在Factor类中定义calculate函数,实现因子转化成Unit对象,对表达式调用calculate,再通过calculate调用Unit类中的multiply和multiplyList函数可以将表达式各项中的因子相乘并化简,从而将表达式的最终各个因子统一地保存在一个Unit类型的ArrayList中,最后使用Unit类中的print的函数输出。
    解析表达式的具体处理:①空字符:在创建lexer对象之前,输入表达式之后直接去掉空字符。②前置0处理:在lexer中读取整数时去掉前导0。③连续的正负号处理:根据文法,在一个因子前最多出现三个连续的正负号,所以只要在parser中的parseExpr,parseItem,parseFactor函数中先读取一个符号,根据正负转换为常数因子(+1或-1)乘入即可。

  2. OO度量

 

 

 总体来说,函数中只有Unit.print的复杂度高,因为输出时一些符号的判断导致函数较长。可以考虑重写toString函数降低函数耦合。在Unit复杂度高也是因为Unit承担了化简,输出的重任,如果在解析时进行化简也许会降低复杂度。Main中多写了一个合并同类项的工作,应该放在Unit中。

  • HW2

  1. 类图

    在这次作业中,增加了三角函数和自定义函数类,我按照第一次的思路把他们作为Factor接口的实现,和其他因子统一起来。然后在Unit中增加了三角函数属性,从而保证Unit能够存放所有类型。对于自定义函数, 我使用了一个HashMap存放自定义函数,在parser中解析时调用自定义函数类的replaceParameter进行替换。

  2. OO度量

 

这次因为对自定义函数和三角函数单独进行解析,所以Lexer,Parser类复杂度变高了,可以使用更多的函数简化中间过程。Main函数中实现了储存自定义函数的HashMap,其实应该单独创建一个类完成这项工作,降低Main的复杂度。

  • HW3

  1. 类图

    由于导数可以视为一个运算符,所有我直接在各个因子类中增加了derive导数运算函数,在Parser类中调用Expression的derive函数,就可以解决。同时这次自定义函数可以使用之前的函数,所以在自定义函数类中必须调用Parser进行化简处理,再返回成表达式形式代入。 

  2. OO度量

 

 OO度量的问题和之前两次作业相同,根本原因是Unit输出的问题,以及化简堆到Unit类中造成运算复杂度变大,只能重构解决。

程序Bug分析

第一第二次作业没有发现Bug,也是因为对三角函数的优化不够,所以没有进行很复杂的程序设计。在第三次作业中,因为没有自己构造全面的测试数据来测试程序,导致在自定义函数化简返回表达式时,三角函数忘记输出指数,导致犯了低级错误,其他方面暂时没有发现问题。

互测

这三次作业都没有刀人成功,但是也在研讨课上了解了评测机的构建方法,主要核心在于自己构建特殊的数据和自动生成全面覆盖的数据,之后有机会研究一下大佬们的代码。

架构设计体验

这次架构主要是依据发布作业的示例,选择了层次递归的方法,将因子作为接口,在lexer中读取,parser中解析,最后在Unit中化简和输出。

心得体会

这次作业开始感觉很困难,但是架构好整体程序后,再增添新的需求变得更简单,不过优化程序还是需要更优秀的架构和解析方法。

 

...全文
69 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

443

社区成员

发帖
与我相关
我的任务
社区描述
2023年北京航空航天大学《面向对象设计与构造》课程博客
java 高校 北京·海淀区
社区管理员
  • 被Taylor淹没的一条鱼
  • 0逝者如斯夫0
  • Mr.Lin30
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧