OO-第一单元总结
————看,他已经敲了三次oo作业,精神仍然很好
1. 类的设计反思
笔者三次oo作业,每次都为如何设计类与类间关系而头痛,回顾三次痛苦经历,总结出如下原因:
分类不是源于需求而是拘泥于问题的表面形式。
以第二、三次作业为例,我们将多项式拆分为单项式,继而拆分为因子,却难以给出如此拆分的理由。当我们面对拆分之后的因子时,却发现求导方式需要分类讨论,降低了类内聚性。所谓使用接口也正是由于目前项目架构不完全面向于需求而采取的折衷做法。
因此,我们不妨换种思维方式,从求导法则的角度出发,寻找在求导过程中有相同行为的元素归为一类。
原需求中求导法关系法则有以上三条:由加法法则我们可以发现所有由正负号连接的元素在求导时行为相同,这解释了我们polynomial中拆分monomial类的原因,同理,可以将所有乘法相连的元素归为一类,这解释了我们monomial中拆分factor类的原因。对于链式法则,我们不妨将题目中可能出现的sin(.*)与cos(.*)均当作复合函数看待,这将简化因子类中递归终点处情况的讨论。(当然这都感激求导法则与多项式构造原则存在一定的对应关系)
2. 基于度量来分析自己的程序结构
homework1:
homework2:
homework3:
比较遗憾的是由于碍于设计原因这三次作业都没能使用继承方法减小类的长度,以致于最后的factor仍然十分臃肿。
3.分析自己程序的bug
最严重的bug并没有被测出,观察以下两个正则表达式最后几个字符:
1 string seperator_wrong = 2 "(?<=[0-9x)]\\s{0,60})(?<sign>\\*)(?=\\s*[0-9xsc(-+])"; 3 string seperator_right = 4 "(?<=[0-9x)]\\s{0,60})(?<sign>\\*)(?=\\s*[0-9xsc(+-])";
发现只有最后的+-的位置是反的,但是字符集中的‘-’字符会优先解释为表示字符区间的连接符,这将会导致两个正则表达式意义截然不同。当大家[+-]写习惯之后这个bug极难发现。当然‘-’这种特殊字符在ide中会变色,所以还是转义比较稳妥。
4.分析自己发现别人程序bug所采用的策略
除了传统的边界情况测试之外,我主要从构建多项式方式入手:
首先了解到建立多项式的方式主要为两种,一种是写出下层元素表达式从上层字符串一点一点拆分,另一种是从上层表达式中找到分割字符直接传入下层表达式。对于第一种方法主要考察循环首末处可能出现的错误(如多符号“x*sin(x)*”),第二种方法主要考察其寻找分割字符时的准确程度(如在分割字符周围插入非法字符等)
至于第三次作业中同学输出普遍较长,利用matlab测试脚本辅助,核心代码如下:
expected = double(subs(diff(str2sym(inputl)),'x', a(i))); #注意str2sym只于2017b版本以上适用
上一篇: c#中缓存的使用
下一篇: 人生哪会有什么朋友?