1700456461
1700456462
其次,开闭原则是最基础的一个原则,前五章节介绍的原则都是开闭原则的具体形态,也就是说前五个原则就是指导设计的工具和方法,而开闭原则才是其精神领袖。换一个角度来理解,依照Java语言的称谓,开闭原则是抽象类,其他五大原则是具体的实现类,开闭原则在面向对象设计领域中的地位就类似于牛顿第一定律在力学、勾股定律在几何学、质能方程在狭义相对论中的地位,其地位无人能及。
1700456463
1700456464
最后,开闭原则是非常重要的,可通过以下几个方面来理解其重要性。
1700456465
1700456466
1.开闭原则对测试的影响
1700456467
1700456468
所有已经投产的代码都是有意义的,并且都受系统规则的约束,这样的代码都要经过“千锤百炼”的测试过程,不仅保证逻辑是正确的,还要保证苛刻条件(高压力、异常、错误)下不产生“有毒代码”(Poisonous Code),因此有变化提出时,我们就需要考虑一下,原有的健壮代码是否可以不修改,仅仅通过扩展实现变化呢?否则,就需要把原有的测试过程回笼一遍,需要进行单元测试、功能测试、集成测试甚至是验收测试,现在虽然在大力提倡自动化测试工具,但是仍然代替不了人工的测试工作。
1700456469
1700456470
以上面提到的书店售书为例,IBook接口写完了,实现类NovelBook也写好了,我们需要写一个测试类进行测试,测试类如代码清单6-6所示。
1700456471
1700456472
代码清单6-6 小说类的单元测试
1700456473
1700456474
public class NovelBookTest extends TestCase{
1700456475
1700456476
private String name=“平凡的世界”;
1700456477
1700456478
private int price=6000;
1700456479
1700456480
private String author=“路遥”;
1700456481
1700456482
private IBook novelBook=new NovelBook(name,price,author);
1700456483
1700456484
//测试getPrice方法
1700456485
1700456486
public void testGetPrice(){
1700456487
1700456488
//原价销售,根据输入和输出的值是否相等进行断言
1700456489
1700456490
super.assertEquals(this.price,this.novelBook.getPrice());
1700456491
1700456492
}
1700456493
1700456494
}
1700456495
1700456496
单元测试通过,显示绿条。在单元测试中,有一句非常有名的话,叫做”Keep the bar green to keep the code clean”,即保持绿条有利于代码整洁,这是什么意思呢?绿条就是Junit运行的两种结果中的一种:要么是红条,单元测试失败;要么是绿条,单元测试通过。一个方法的测试方法一般不少于3种,为什么呢?首先是正常的业务逻辑要保证测试到,其次是边界条件要测试到,然后是异常要测试到,比较重要的方法的测试方法甚至有十多种,而且单元测试是对类的测试,类中的方法耦合是允许的,在这样的条件下,如果再想着通过修改一个方法或多个方法代码来完成变化,基本上就是痴人说梦,该类的所有测试方法都要重构,想象一下你在一堆你并不熟悉的代码中进行重构时的感觉吧!
1700456497
1700456498
在书店售书的例子中,增加了一个打折销售的需求,如果我们直接修改getPrice方法来实现业务需求的变化,那就要修改单元测试类。想想看,我们举的这个例子是非常简单的,如果是一个复杂的逻辑,你的测试类就要修改得面目全非。还有,在实际的项目中,一个类一般只有一个测试类,其中可以有很多的测试方法,在一堆本来就很复杂的断言中进行大量修改,难免会出现测试遗漏情况,这是项目经理很难容忍的事情。
1700456499
1700456500
所以,我们需要通过扩展来实现业务逻辑的变化,而不是修改。上面的例子中通过增加一个子类OffNovelBook来完成了业务需求的变化,这对测试有什么好处呢?我们重新生成一个测试文件OffNovelBookTest,然后对getPrice进行测试,单元测试是孤立测试,只要保证我提供的方法正确就成了,其他的我不管,OffNovelBookTest如代码清单6-7所示。
1700456501
1700456502
代码清单6-7 打折销售的小说类单元测试
1700456503
1700456504
public class OffNovelBookTest extends TestCase{
1700456505
1700456506
private IBook below40NovelBook=new OffNovelBook(“平凡的世界”,3000,“路遥”);
1700456507
1700456508
private IBook above40NovelBook=new OffNovelBook(“平凡的世界”,6000,“路遥”);
1700456509
1700456510
//测试低于40元的数据是否是打8折
[
上一页 ]
[ :1.700456461e+09 ]
[
下一页 ]