一个学期的软件构造课程就要结束了,下面是我的一些学习心得和感想:
知识内容方面
通过一个学期的学习,我对java有了更深刻的理解。从抽象类、接口到各式各样的设计模式,java这门语言的每一个符号都在体现着“面向对象编程”的含义。如果一些方法中的某一部分可以被反复的利用,就可以像乘法分配律提出公因子那样把它提到父类中去,但同时,各个子类都还具有自己特色化的方法。Java的这个父类功能十分的强大,我深刻的体会并认识到了这一点。还有抽象类的方法,abstract关键字的修饰十分神奇。但最让我觉得收获颇丰的还是Lab3,通过这个浩大的工程,我深刻理解了什么是接口和接口的用法,这个进步让我觉得之前被C语言等基础语言建立起来的世界观被颠覆了,也是从这个时候开始我才认识到java作为一个快捷方便的语言的优点——抽象。无论是面向对象编程还是抽象类、接口,java的思想中,我认为抽象是很关键的一个部分。只有找到事物之间最本质的联系,认真思考如何用最简洁的代码将这个联系表达出来,才能通过这样来发挥java编程的强大。但是这也极大的考验了程序员的抽象能力。Lab3是基于Lab2产生的,其中的代码都有可以在Lab2中参照的地方,但是最后做出的Lab6中却是完整的构造所有的文件,在如何选择ADT的创建、如何使用抽象方法的方面,就真的需要很认真的思考。
除了java之中最基础的代码层面的体会,对于软件构造这门课更高级的构造方法:各种设计模式也让我大开眼界。在Lab3中我们使用了工厂方法来构造,可以使用一个父类方法,结合之前代码层面的抽象类等感悟,更好的设计整个实验的流程。包括最后lab6中的strategy策略模式,可以省去多余的代码,在客户端口进行很好的“封装”。说到封装,我个人认为,这也是java语言的一大特色,也是它面向对象编程的一个特点,更是抽象的一种体现。封去的是糟粕,留下的是精简又精简的步骤,使客户端可以看到简洁而十分有可操作性的步骤。我还记得以前的C语言代码中,main函数中都是一大段一大段的功能代码,而在我这几次的实验过程中,客户端口,包括application类里都是简洁的使用性代码。我又一次感受到了java的强大。
工具使用方面
这学期的很多实验都安装了插件,一开始我并没有认为这些插件会有很好用,但还是被Junit震惊了一下,我才知道并不是所有的测试都是直接跑程序,也知道了在实际编程的过程中都是先写测试用例——毕竟不是每一个程序都有那么多的试错机会。所以我学会了使用Junit,感觉打开了新世界的大门。另外还有后来要用的4个插件,每一个都功能强大,还有外接的UI可以看到代码运行过程中CPU的变化,也是软件构造这门课让我将代码与上学期的计算机系统联系了起来,觉得手中的电脑硬件软件是一个整体,代码也终于摆脱了成为所谓“命令行”的宿命,而是真正的有了生命周期。我上个夏季学期选修了一门课叫做“软件有生命吗”,但是我并不是很理解老师所讲的软件的生命周期,而现在我彻底的明白了代码不仅是有生命的,还会由于各种优化而进一步提高它本身的性能,使程序运行起来变得不一样。这个实验在上一次读入大量数据的实验中我体会的很深刻,可能就是构建图的时候的算法优化问题,可以将程序的效率提高百分之三十不止。并且很可能就是I/O方式的选择不一样,读入的时间就相差了几十分钟。我记忆犹新。
实验感悟方面
这学期一共做了6个实验,记忆犹新的是lab3和lab6。lab3巨大的代码量让我认识到了开发一个小小的软件要经历什么,要考虑什么。感觉经过这门课自己的代码素养有了一个进步,以前的C语言编程都是只考虑如何将想得到的答案跑出来,而不会考虑特殊情况,不会考虑复用,不会考虑健壮性。而现在因为有很多测试用例,我会想我的代码健壮性是否周全,是否有复用价值,是否整洁美观,是否足够简洁而不冗杂……我认为现在的我更像一个程序员应该有的样子,而不是以前的学生模样,凡事都只是想要一个答案而不思考。这门课真的教会了我很多,不仅仅是知识上,也有心理上的教诲。无论任务多么繁重,也慢慢学会拆卸开一点点写完,我不知道未来是否还会遇到代码量这么大的实验课,但我很确定我收获颇丰。