实验1中的BinaryOP在于使读者知道回调机制如何实现,在它面临术语IoC时,将它称为框架似乎缺乏说服力,因为它缺乏一个控制模块。本节通过另外一个例子给出框架设计的更多思考和讨论。
【最后编辑2022.2】返回目录
【实验2:框架设计者】
- 实验目的:通过编写排序的测试框架,理解什么是框架、框架与库函数的区别(IoC)以及什么是针对接口编程,认识依赖倒置原则DIP的基本错误。
- 实验内容:重构冒泡排序chap1.temp.BubbleSort,在此基础上编写(或者说获得)对任意排序算法进行测试的框架。
1.2.1起点
先给出实验2的最简单粗暴的chap1.temp.BubbleSort代码,它完成冒泡排序并在本类中进行测试。temp(临时)这个包名,意味着BubbleSort的结构,有许多值得改进的地方。
package chap1.temp;//将被重构 –移动
public class BubbleSort {
public int[] sort(int[] arr){//本书通常不关注算法!
for(int i = 0 ; i< arr.length-1; i++){
for(int j = 0 ; j < arr.length-i-1;j++){
if(arr[j] > arr[j+1]){ //冒泡
swap(arr ,j, j+1);
}
}
}
return arr;
}
//移到父类型中
public static void swap(int[] arr ,int one, int two){
if(one == two){return;}
int temp = arr[one];
arr[one] = arr[two];
arr[two] = temp;
}
//移到SortTest中
public static void simpTest(int[] array) {
array = new BubbleSort().sort(array);
pln(array);
}
public static void pln(int[] array) {
System.out.println(java.util.Arrays.toString(array));
}
public static void main(String[] args){//BlueJ中可以省略本方法。
simpTest(new int[]{5, 8, 5, 4, 3, 5, 2, 7, 5, 9});
}
}
大体上说,本实验一共包括五个步骤的变化,下面的→表示使用关系,<=表示继承关系。
- SortTest→BubbleSort。代码职责分离;但是客户SortTest依赖具体的服务BubbleSort,这是不好的设计。
- SortTest→IntSort<=BubbleSort。应用程序SortTest遵循针对接口编程/依赖抽象类型原则,它依赖抽象类型IntSort,而BubbleSort自然地依赖抽象的父类型。
- 【SortTest→In