一、实验内容
1. 初步掌握单元测试和TDD
2. 理解并掌握面向对象三要素:封装、继承、多态
3. 初步掌握UML建模
4. 熟悉S.O.L.I.D原则
5. 了解设计模式
二、实验过程(本次试验都是在自己电脑上完成,没有使用实验楼)
(一)单元测试
用程序解决问题时,要会写三种码:伪代码、产品代码、测试代码
这种先写测试代码,然后再写产品代码的开发方法叫“测试驱动开发”(TDD)
TDD的一般步骤如下:
- 明确当前要完成的功能,记录成一个测试列表
- 快速完成编写针对此功能的测试用例
- 测试代码编译不通过(没产品代码呢)
- 编写产品代码
- 测试通过
- 对代码进行重构,并保证测试通过(重构下次实验练习)
- 循环完成所有功能的开发
(二)面向对象三要素
1.抽象
抽象就是抽出事物的本质特征而暂时不考虑他们的细节。对于复杂系统问题人们借助分层次抽象的方法进行问题求解;在抽象的最高层,可以使用问题环境的语言,以概括的方式叙述问题的解。在抽象的较低层,则采用过程化的方式进行描述。在描述问题解时,使用面向问题和面向实现的术语。 程序设计中,抽象包括两个方面,一是过程抽象,二是数据抽象。
2.封装、继承与多态
面向对象(Object-Oriented)的三要素包括:封装、继承、多态。
过程抽象的结果是函数,数据抽象的结果是抽象数据类型。
封装实际上使用方法(method)将类的数据隐藏起来,控制用户对类的修改和访问数据的程度,从而带来模块化(Modularity)和信息隐藏(Information hiding)的好处;接口(interface)是封装的准确描述手段。
(三)设计模式初步
(1)S.O.L.I.D原则
面向对象三要素是“封装、继承、多态”,任何面向对象编程语言都会在语法上支持这三要素。如何借助抽象思维用好三要素特别是多态还是非常困难的,S.O.L.I.D类设计原则是一个很好的指导:
- SRP(Single Responsibility Principle,单一职责原则)
- OCP(Open-Closed Principle,开放-封闭原则)
- LSP(Liskov Substitusion Principle,Liskov替换原则)
- ISP(Interface Segregation Principle,接口分离原则)
- DIP(Dependency Inversion Principle,依赖倒置原则)
(2)模式与设计模式
模式是某外在环境(Context) 下﹐对特定问题(Problem)的惯用解决之道。
在面向对象中设计模式的地位可以和面向过程编程中的数据结构的地位相当。
(四)练习
1.使用TDD的方式设计关实现复数类Complex。
伪代码:
首先设计一个复数类complex,定义三个构造方法:
①没有参数时默认为实部和虚部都为0;
②一个参数时默认为实数,即虚部为0,
③两个参数时分别为实部和虚部
再定义两个成员方法计算两个复数的和与差.定义一个print()方法输出复数的值,当虚部为0时不输出虚部.
最后定义一个song类使用complex类,在这个类的主方法中创建两个复数对象,分别计算这两个复数的和与差并输出.
产品代码:
测试代码:
运行结果:
2.PSP(Personal Software Process)时间
步骤 |
耗时百分比 |
需求分析 |
10% |
设计 |
20% |
代码实现 |
40% |
测试 |
15% |
分析总结 |
15% |
4.总结单元测试的好处
在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试,可以查找错误、写出高质量的代码、提高编程水平。
经过网上查询资料,单元测试的好处远不止我目前发现的这些。它可以使代码可以放心修改和重构、使程序员从调用者而不是实现者的角度设计软件模块、
使程序员将软件模块写得易于测试和调用,从而有利于解耦、测试本身可作为被测代码的用法说明,从而替代了一部分文档功能。
三、遇到的问题及解决方法
1.eclipse提示Animal代码有错,Dog和Cat需要在文件中被定义。解决方法:将Animal和Dog、Cat放在不同的class文件中编译
2.设计复数类Complex伪代码时不知道应该如何分类。解决方法:网上查询复数类的构造方法,得知可以定义三类
四、实验收获
本次实验让我了解到想用程序解决实际问题时,不仅是只要写出一个代码就可以了,而是最好写出三种代码:伪代码、产品代码、测试代码,这样的程序才有
实际意义,方便使用。而且运用好单元测试可以在未来的程序设计中让自己负责的模块功能定义尽量明确,模块内部的改变不会影响其他模块,而且模块的质
量能得到稳定的、量化的保证。希望以后能通过实验了解更多运用java解决实际问题的方法。