OO-Part1-多项式求导
希望我能从前三次作业中发现并总结自己的问题,在后续的挑战中迎难而上,抵达到昆仑课程的顶峰。
第一次作业:简单多项式导函数
用UML工具生成的类图:
由于当时没有及时总结面向过程式编程的弊端,我没有合理的划分类,更不用说了继承和接口的使用了。
现在想想,其实幂函数本身就是一种因子,没必要根据其结构划分五个求导方法,这种设计不满足高内聚低耦合的思想。并且,在类内没有对数据进行封装和隐藏,这也显然不符合OOP的思想。
公测
公测没有出现意外,笔者的程序在公测阶段没有出现除性能分以外的错误。
互测
总共被hack9次,类型基本上是格式判断的问题,对正则表达式进行了简单的修改后,顺利完成了合并修复。
hack屋内所有人共计18次,发现bug的主要问题在:对格式的判断和对单个数字的求导的处理不正确。
思考与感想
第一次作业的算法和工程方面的要求都不高,所以用面向过程的思维也苟了过来。。。但其中发现了自己和同学的一些共性的bug,也可以说是不够良好的编程风格:
1、试图用一个庞大的正则表达式判断格式,在浏览昂神的blog之后发现,我对正则表达式的使用存在一定的误解。正则表达式更多的用于相对简单且没有复杂的重复和嵌套的一些的模式匹配,以及其内部关键位置信息的提取。所以在第三次作
业中,很完美的限制了正则表达式的使用。
2、一个值得提升的点是关于数据容器的使用,数据的存储也是Java面向对象设计中的一个重要环节,是否能高效的组织数据极大程度上决定了一个程序是否能跑下去. 直接使用传统的固定大小数据容器显然无法满足需求,所以, 自然就想到了利用Arraylist, Hashmap之类的序列类容器.
第二次作业
在第一次作业的基础之上添加了三角函数因子
类图
在第二次作业中,我依旧没有领悟到面向对象的核心思想, 因为通过观察和一定的数学计算,我发现了所有的正确输入都可以转化为如下所示的统一形式.
coeff*x^a*sin(x)^b*cos(x)^c
那么利用三个指数作为hashmap的索引,系数作为Hshmap的值组织数据既可以高效的组织数据,又能轻松的进行同类项合并。
不足:
没有体现面向对象的思想,思维仍然束缚于面向过程式的编程,主要体现在:利用多个函数组合处理输入的多项式,设法将其化简为标准形式。
公测:
1.由于优化的问题,导致原先已经完成的数据处理出现了bug
2.正则表达式的使用出现了bug,【】内对字符的引用不应添加单引号。
思考与感想:
第二次作业相对于第一次作业难度上的递增较大,但是由于发现了三元组这一奇技淫巧,导致面向对象的思想还是没能在脑海中建立起来,这是在写第二次作业中较为遗憾的地方,所以笔者在第三次作业中遇到了极大的困难。
第三次作业
这是什么鬼?这怎么写得出来?又要重构?!这设计根本无法实现啊?!
在拿到指导书冥思苦想了一天之后,我想到了利用分类的做法,即:将表达式分为【加减|乘|嵌套】三类,去完成这次作业;但开始码字伊始,就觉得方案不可行,因为正则表达式不能嵌套定义,所以无法匹配出我设计中想要的信息,当时时间已经到了周日晚上,我的初步架构都没有建立起来,心里十分崩溃。
最终令我极为难以接受的失败终于降临了,我miss了第三次作业的ddl。
事后想想,感觉程序设计这活,一开始是不可能找到完美的解决方案的(最优解),然而这次作业的最优解也是存在的,即如下图所示。(虽然没有在ddl内完成作业,也不甘心被这次作业打败)。
JAVA设计模式——工厂模式
创建型模式是三大设计模式(创建型模式、结构型模式、工厂型模式)之一,另外两种为结构型模式与行为型模式。创建型模式一共分为五种模式:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。在第三次作业中主要采用了工厂模式,即:因子类这一工厂,可以生产出不同类型的因子“产品”,每种产品保留了因子类的共性,同时也有自身的特性,如:求导方式,判别模式……
思考与感想:
2.对OO作业新的认识:
除了指导书的各种官方要求:讲究代码风格,设计层次之外,我还想谈谈OO作业的挑战性。
挑战点一:编写程序的挑战。解决从无到有的问题是我们首先应该考虑的问题,任何一次OO作业都不可能一蹴而就,设想程序无法站立起来的情况下,还指望它能跑吗?所以应一步一步地由独立的单元搭建起整个工程,而不是整天对着设计纸上那几条算式疯狂抖腿抓头发…
挑战点二:要充分明确指导书的需求,掌握其中的重要细节和提示。这对后续的bug调试和互测中程序的防御十分重要。在第一节OO课上老师就强调过“道路千万条,条条皆安全”。在编写程序的时候就要注意到哪些是薄弱环节,如何加强它,如何保证它的鲁棒性,不会轻易被攻破。
挑战点三:OO作业不仅是对面向对象能力的考查,也是对一个人性情的考验。在面对困难的时候,失败者总是设想“如果我做不出来的后果”,于是终日惶惶恐恐,什么也写不出来;成功者想的却是“只要我认真去做,就一定能完成”。在如此短时间内完成如此庞大的工程实属不易,保持一颗积极向上的心态,多构思,多实习,在不断尝试中提升自己的OO水平。
2.对OO新的认识:
经过第三次作业的挫折,似乎对面向对象这个概念有了新的认识,借用何大佬在交流课上所提出的问题,“如何造一架飞机”?典型的面向过程思维是:先设计图纸,然后一股脑的把整架飞机搭建出来,显然这是不可能完成的事情;然而如果用面向对象的思想,将其分而治之,先造机翼,再建机舱,再建控制台,起落架……最后把各种零件整合到一起,组成一架飞机。具体到第三次作业来说,面向过程的思维是一次性处理所有的输入数据,判断格式,构建数据容器存储数据,求导,相加,输出……繁冗的细节决定了面向过程思想必然不能解决问题;然而用面向对象的思想就应该是,因子分类:sin/cos/power/num/expre五个类,共同继承一个抽象类factor;项是由因子组成的链表;表达式看成是项组成的列表。如此层层递进,数据的存储将变得十分简便。
面向对象的编程思想不是一朝一夕能实现的,需要不断的动手尝试,阅读高质量的优秀代码,才能不断的提升。希望与我有同样问题的同学能再接再励,利用这次写博客的时间好好反思,好好整理心情,该出去踏青的时间就不要在学校里苦干写不完的作业,这样其实效率很低(个人亲测)。一次挫折并不影响昆仑历练的成功,不要被困难击退,重整旗鼓,迎难而上。