类 | OCavg | WMC |
---|---|---|
format.InputParser | 9.0 | 9.0 |
format.FormatCheck | 6.5 | 13.0 |
element.multiple.Term | 4.625 | 37.0 |
element.multiple.Expression | 3.5714285714285716 | 25.0 |
SyntaxAnalyzer | 2.6 | 39.0 |
element.unitary.Exp | 2.4 | 12.0 |
element.multiple.Nest | 2.3333333333333335 | 21.0 |
element.unitary.Sin | 2.0 | 8.0 |
MainClass | 2.0 | 2.0 |
element.unitary.Cos | 2.0 | 8.0 |
element.multiple.SerialElement | 1.1111111111111112 | 10.0 |
element.unitary.SimpleElement | 1.0 | 2.0 |
element.unitary.Const | 1.0 | 5.0 |
format.InputFormatException | 1.0 | 1.0 |
Total | 192.0 | |
Average | 2.6301369863013697 | 13.714285714285714 |
方法 | ev(G) | iv(G) | v(G) |
---|---|---|---|
Total | 126.0 | 189.0 | 211.0 |
Average | 1.726027397260274 | 2.589041095890411 | 2.8904109589041096 |
总行数 | 源码行数 | 源码占比 |
---|---|---|
1019 | 885 | 0.8684985279685966 |
类图:
元素类图:
耦合程度较低,功能分离,面向对象纯度高。
思路:
//1.格式检查(InputParser,FormatCheck,InputFormatException)
//2.保证格式正确后,进行解析,解析的同时初始化(SyntaxAnalyser)
//3.求导(derivation)
//4.化简(simplification)
格式检查利用正则表达式,公式解析利用递归下降分析法,分析过程中初始化表达式,递归化简、求导、再化简。
将所有成分看作Element
,具有求导和化简两个方法。不使用一个程序执行这些过程可以降低程序复杂度(分治思想,化整为零)。同时,将Cos
、Sin
看作一类(SimpleElement
),提取公共方法、属性,将Term
、Expression
看作一类(SerialElement
):它们都有一个ArrayList<Object>
,化简方法具有共通性。
第二次作业架构问题导致超时(递归深度过大)。
下面的公式会超时:
出现Bug的作业耦合度明显高于修补之后:
方法 | ev(G) | iv(G) | v(G) |
---|---|---|---|
Total | 123.0 | 141.0 | 179.0 |
Average | 2.1206896551724137 | 2.4310344827586206 | 3.086206896551724 |
搭建评测机,黑盒测试:使用Xeger、random生成数据;使用sympy生成标准答案,并采用评测机相同方法将每位同学的答案与标答对比。
当我看到超时问题时,我当即重写。类图或度量见上。
相当痛苦,因为我不想在OO重修上花一分钟,更不想失一分。但事实上,我花了大量的时间重写,并且第二次作业得分相当低,令我痛心疾首,亚历山大,辗转反侧,彻夜难眠,后悔重修,我是sb。
原文:https://www.cnblogs.com/mokoghost/p/14584708.html