去年在学校准备找工作的时候,因为没有学过Java的一些常用框架从而导致自己碰了不少壁。现在算上实习和工作大概5个月对框架和代码层级有了一些理解和认识,简单谈谈自己的看法。当然,这些看法应该还是比较浅薄的,或许一段时间之后再看自己的这篇文章可能会觉得自己的理解还不够深刻吧!
1.什么是框架
我理解的框架时让你来实现一个接口的某个方法,当程序运行时这个方法会被调用,但是你并没有写过调用这个方法的代码。框架这个词很形象,它的意思就是说我把主要的都给你做好了,你只要往里面填充一些东西就可以完成。
举一个最常见的例子:JDK中的多线程。
@Override
public void run(){
//do something
}
当我们使用多线程的时候,我们一般让这个类继承runnable接口,然后实现run方法,在使用的时候我们调用start()方法。这时我们可以看到我们在run()方法中写的代码被执行,但是我们并没有调用过run()方法。
run()方法肯定被调用了,既然我们没有调用,那就是JDK调用了。那么这其实就可以看作是一个框架。框架是什么,我认为它是一种抽象,有些框架在上层进行了抽象,就像我们前面讲的例子,或者Spring MVC的DispatcherServlet,一般是让你实现它给的接口就可以按照我们想要的逻辑运行;另一种对底层做了抽象,类似mybatis(mybatis封装了JDBC对象转换的细节)。
并非只有ssh或者ssm才称得上是框架,我们再举一个JDK中的例子:HashSet集合与hashcode()、equals()方法。当我们向HashSet中add一个元素时这两个方法都会被调用。
2.什么是层级
我们看下面两段代码:
public class Layer1{
public int sum(int a, int b){
return a + b;
}
}
public class Layer2{
Layer1 layer1;
public int sum(Param param1, Param param2){
int a = param1.getNum();
int b = param1.getNum();
layer1.sum(a, b);
}
}
Layer1这个类负责具体的计算逻辑,Layer2这个类负责提取入参中的有用信息,然后调用Layer1来执行计算逻辑。这里Layer2就是在Layer1之上封装的一层,这一层的作用就是拆解入参,这样很能体现出代码的单一职责。你可能觉得这样做多了好几个类,增添了许多调来调去的没有逻辑的代码,但是这样的代码可读性是很强的,可维护性也很强,不会出现牵一发而动全身的问题。搞学术研究的人一般都不太注意代码的可读性和可维护性,这一点和工程不同。搞工程未必有多么复杂的业务逻辑,不需要多么高深的算法,但是合理的设计可以提升代码的扩展性和维护性,而且许多架构的设计也能大大提升一个系统的性能和吞吐量(例如对高耗时的服务使用缓存)。
我见过许多鄙视这些写业务代码的人,觉得这都是面向API编程,没什么技术含量,他们动不动就提底层,提数学。我也只是一只菜鸟,没有评价人家的权利,但我很不认同这种看法。因为写业务代码也可以学到很多,前提是你要有一点求知欲,想知道自己的的代码什么时候被调用,想知道自己调用的类库的代码是如何实现的。其实许多框架是很好的源码,当熟悉一个框架的使用后尝试着去看一些它的源码,我想这样能获得很大的提升。