面向对象第一单元总结
程序结构
类图

度量属性
方法复杂度


类复杂度

第一单元作业整体上架构不成熟,由于经验欠缺,各个类与方法的复杂度总体较高。
构建思路
本单元作业最终程序共有11个类,35个方法。
其中,表达式层级类共有Expression、Term、Factor三个类,均继承自Element基类;因子类共有Number、Pow、Sin、Cos、ExpressionFact五个类,继承自因子Factor类;另有工厂类Factory,以及主类MainClass。
Expression负责将表达式分解为 表达式 (Expression)+ 项(Term),直至递归下降至 项 + 项 的表达式。
Term负责将项分解为 项 * 因子,直至递归下降至 因子 * 因子 的项。Factory负责处理生成这些因子。
所有继承自Element的类中都有各自求导(Derivation)的方法与法则,并由因子到项,再到表达式逐步向上级返回求导结果,最终得到输入表达式的求导结果。
在主类中有WrongFormat方法,负责初步检查输入表达式的格式是否正确,而Factory类中可以最终以因子为单位判断表达式是否合法。
Bug分析
本单元作业最终版本的Bug主要集中在错误格式的判断以及工厂模式生成因子(Factor)的方法中。对于错误格式的初步判断,本次作业采用的是正则表达式匹配错误格式的方法实现,而这种方法只能初步判断,依靠此方法来穷举格式错误几乎是不可能的,所以在测试时,部分格式错误无法被检测。经过修改,将格式错误的检测重心放在Factory类的因子生成方法中,便可以从本质上解决格式错误判断的问题。而在因子生成时,部分特殊表达式会出现无法正常解析导致字符串为空的情况,经过对因子生成方法的优化就可以很好的解决这个问题。
从度量表中可以看出,主类中WrongFormat方法与工厂类中getFactor方法都具有较高复杂度,足以说明面向对象的程序设计层级关系,各个类与方法的构建至关重要,层级明确的类、复杂度较低的方法往往不容易出错。
Bug测试方法体会
本次互测中未能发现别人的bug,但在课下与同学交流时,能够感受到部分同学的代码由于层级构建不够明确,方法过于复杂,不仅导致容易出错,调试起来也极其困难。所以,我想对于程序测试来说,最好的方法,也是最重要的一点,就是从程序构建时便做到逻辑清晰,结构明了,方法简洁。只有这样,才能在测试时很好地找到一般数据、特殊数据、临界点等,做到测试样例的高度覆盖,否则,总有些样例是在复杂的结构下难以测试到的。
重构总结与心得感悟
完成第一单元的学习后,我对于面向对象的思维有了更加深刻的了解与感悟。在“万事万物皆对象”的核心思想下,面向对象的设计思维可以说是将对象间的逻辑关系看得尤为重要。在最初完成作业时,由于对于面向对象思维了解欠缺,代码的字里行间都透露着面向过程的思路。冗长的类,复杂的方法,不够明确的层级关系,都导致程序的逻辑结构及其模糊复杂,无论是可读性、性能,还是扩展性、调试难度,都及其受制于紊乱的逻辑结构。其实很多复杂方法可以分离出更加专门化的方法来解决一些问题,而通过明确的层级关系,也可以大大降低各类耦合的复杂度,并“以不变应万变”,来对整个工程实现宏观简洁的调配。在重构的过程与思考中,我逐渐靠近面向对象思维的真谛,开始重视各个类的内聚,开始尝试使用归一化的方法,开始将主要精力放在各个对象的层级关系与程序整体逻辑关系的构架上,能够逐渐设计出逻辑相对清晰严密的美观的程序。
虽然由于新学期对于新课程的适应问题,我的前两次作业并没有很好地完成,但在反思感悟的过程中,渐入佳境,进入状态,相信在以后的课程任务中定能更加完美地完成任务,收获更多有益的东西。

浙公网安备 33010602011771号