一、程序结构分析
第一次作业:
第一次作业基本思路是,用set储存单项式,相同的单项式在输入时就合并。每个单项式各自求导,然后放到一个新的set中就得到了一个新的多项式,然后输出。
类图:
代码行数:
第二次作业:
第二次作业加入了sin和cos,变得复杂了起来。定义三个子类,sin,cos,幂函数。每个项都由一个sin,一个cos,一个幂函数组成。正则表达式整体匹配来检查格式错误,缺点使可能爆栈。
类图:
代码行数:
第三次作业:
第三次作业中,对于每个因子都建立类,每个计算方法都建立类,以树的形式组织起表达式。
采用分段匹配,对于每一个表达式中的项匹配完成后,把对应部分从表达式中删除。
类图:
代码行数:
二、bug分析
第一次作业:没有bug
第二次作业:当系数为1时,项与项之间会缺少加减号。合并sin(x)**2+cos(x)**2=1时会出现合并错同类项的状况。
解决方式:在每个项的toString中把系数唯一的情况加上“+”号。合并同类项错误是因为把两个功能不同但是名字相似的方法弄混了,改回了就好了。
第三次作业:没有考虑到sin(x)内部可能是0的情况,导致这种情况下无法输出。
解决方式:在一个常数为0是,它的toString方法会返回空串,在嵌套类中捕捉是空串的情况,在对应位置补充上0
三、发现别人bug的策略
第二次作业用Python生成测试数据进行测试。
第三次作业由于不知道怎么用正则表达式生成测试数据,人工进行的测试。
基本思路是首先测试自己出现错误的地方,然后检查特殊的输入。但是效果不是太好,我觉得主要原因是读代码的能力还需要多锻炼。
四、应用对象创建模式
在第一次第二次作业尝试使用工厂模式,但是并不成功,主要是前两次任务相对简单,只用一个工厂类就完成了任务,因此感觉不到工厂模式的优势。在第三次作业中,针对每个类建立了对应的工厂,由专用的工厂来生成对应的类,这其中必然有多个工厂之间的相互配合,比如说我们创建一个表达式,先用表达式工厂把其中各个项读取出来,再用项工厂把其中各个因子读取出来,在根据因子调用相同的工厂,如果没有工厂模式,创建方法必然极其臃肿且复杂。
五、心得体会
一方面是正则表达式不够熟练,常常出现捕捉不到想要的内容的现象,另一个方面,在算法掌握上我还有很大差距,第三次作业几乎没有优化的思路。
六、心得体会
每次作业都能够给我很大的锻炼,还有很多东西,比如说各种设计模式的知识,需要学习。