文档章节

框架的本质

jtn
 jtn
发布于 2015/04/13 15:09
字数 2347
阅读 9
收藏 1

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

郑重申明:包括本文在内的很多技术文章,大多出自山外高人,而非Fans。
                   Fans暂时没有能力写作优秀的技术文章,Fans只是转载、浓缩、加入部分自己的代码而已。
 
    框架的本质

       什么是框架?框架从何而来?为什么要使用框架?这是一系列简单而又复杂的问题。简单,是因为它们本身似乎不应该成为问题。框架实实在在存在,并且在开发中发挥着重要的作用,我们的日常工作,遵循着框架所规定的编程模式,在其指导之下,我们能够编写更为强大的程序。说其复杂,是因为框架本身又是如此纷繁复杂,我们在使用框架的同时,往往会迷失其中。任何事物都有蕴含在其内部的本质。无论框架本身有多复杂,我们所需要探寻的,都是其最为内在的东西。框架为什么会产生?我们来看一个最最简单的例子。

 

        在Java中,如果要判定一个输入是否为null或空字符串,我们会使用下面的代码:


    
  1. if(str == null || str.length() == 0) {  
  2.    // 在这里添加你的逻辑  

       这段代码非常普通,简单学习过Java语法的程序员都能够读懂并编写。那么这段代码是如何运作的呢?我们所编写的Java程序,首先获得的是来自于Java的基本支持:语法支持与基本功能的API级别的支持(str.length()方法实际上就是JDK所提供的字符串的基本API)。换句话说,我们编写的所有程序,都依赖于一个最最基本的前提条件:JDK所提供的API支持。

        当一个需求被重复1000次,那么我们就需要重复1000次针对需求的解决办法,这是一个显而易见的道理。然而当上面的代码片段散落在我们的程序中1000次,我们不免会思考,是不是有什么简单有效的途径可以把事情做得更加漂亮一些呢?我们可以针对代码片段做一次简单的逻辑抽取重构,如代码清单2-4所示。

 

代码清单2-4 StringUtils.java


    
  1. // 定义一个类和一个静态工具方法来抽象出将被重复调用的逻辑  
  2. public abstract class StringUtils {  
  3.    // 封装了一个静态方法  
  4.    public static boolean isEmpty(String str) {  
  5.        return str == null || str.length() == 0;  
  6.    }  
  7. }  
  8.  
  9. // 引用静态方法取代之前的代码片段  
  10. if(StringUtils.isEmpty(string)) {  
  11.    // 在这里添加你的逻辑  

在上面的代码段中,我们定义了一个静态方法,将之前写的那段逻辑封装起来。这一层小小的封装虽然看上去是一个“换汤不换药”的做法,但是从深远意义上来说,我们至少可以从以下两个方面获得好处:

可读性

静态方法的签名从一个角度向我们揭示了一段逻辑的实际意义。比如在这个例子中,isEmpty表示“判定某个输入是否为空”。与之前的代码片段相比,如果我们在一个1000行的程序代码片段中观察这2种不同的代码形式,那么前者往往会被你无视,它完全无法引起你的思维停顿,而后者却能够显而易见地在逻辑上给你足够且直观的提示。

 

可扩展性

如果我们对上述需求稍作改动,程序同时需要对输入为空格的字符串做出同样的判定。我们同样将上述的需求应用1000次,那么前者将导致我们在整个应用中进行搜索并替换修改1000次,而后者只需要针对我们封装的逻辑修改1次即可。

从上面的例子我们可以看出,虽然仅仅对代码做了一次简单的重构,却在上述的两个方面为我们解决了潜在的问题。这一现象或许直到现在你才意识到,但很多程序员前辈在很早以前就意识到了。因而,早就有人为此编写了类似的代码。比如说,类似的方法就存在于Apache的commons-lang的JAR包中,如代码清单2-5所示。

 

代码清单2-5 StringUtils.java


    
  1.    package org.apache.commons.lang;  
  2.  
  3.    public class StringUtils {  
  4.  
  5.    // 这里省略了许多其他的代码  
  6.  
  7.    public static boolean isEmpty(String str) {  
  8.        return str == null || str.length() == 0;  
  9.    }  
  10.  

当我们将Apache的commons-lang的JAR包加到CLASSPATH中时,就能在程序的任何地方“免费地”使用上述方法。也就是说,我们自己无须自行编写代码对JDK进行扩展,因为Apache的commons-lang已经为我们做了。既然如此,我们唯一所需要做的,只是把别人做的东西加到CLASSPATH中并且使用它而已。

这是一个很熟悉的过程,不是吗?我们在搭建程序运行的基本环境时,指定程序所依赖的JAR文件是其中的一个重要步骤。而这一步骤,实际上包含了Java开发中最最基本而浅显的道理:

结论 当我们加载一个JAR包到CLASSPATH时,实际上是获得了JAR中所有对JDK的额外支持。

 

          我们的程序就像一个金字塔形状。位于最底部的当然是JVM,提供运行Java程序的基础环境,包括对整个Java程序的编译运行。在这个之上的是JDK,JDK是构建在JVM之上的基本的对象行为的定义(我们在搭建开发环境时所安装的JDK就是这个)。而再往上,是一个具备层次结构的JAR层,所有被加载到CLASSPATH中的JAR文件都搭建在JDK层次之上,它们之间可能形成互相依赖,但不管怎么说,它们的作用都是提供JDK以外的功能支持。最后,在金字塔尖的,才是我们日常编写的应用程序,它将依赖于金字塔低端的所有程序。这样一个结构如图2-3所示。

 
(点击查看大图)图2-3 Java应用的金字塔结构

       仔细观察一下处于中间的JAR层,这个层次的组成结构与其他的层次不同。它是由一块块砖头堆砌而成,上层的砖块搭建在下层的砖块之上。如果我们把其中的每一块砖都比作一个JAR文件,它们之间也就形成了明显的具备层次的依赖关系。

 

        这个层次中的任何JAR文件本身可能并不为最终的程序提供具体的功能实现,但它却为我们编写程序提供了必要的支持。如果查看一个标准的J2EE程序运行时所依赖的CLASSPATH中的JAR包,会发现我们所熟悉的那些“框架”,实际上都蕴涵其中。我们在这里给出一个最简单的示例程序在Eclipse中的CLASSPATH截图,如图2-4所示。

 
图2-4 Eclipse中的CLASSPATH示例

       从图中我们看到,JRE System Library是整个应用程序最基本的运行环境。而无论是Struts2还是Spring,它们都以JAR文件的形式被加载到程序运行所依赖的CLASSPATH中,并为我们的应用程序使用。如果我们用更加通俗的话来表述这一现象,则是:

结论 框架只是一个JAR包而已,其本质是对JDK的功能扩展。

 

        当我们说一个程序使用了Spring框架,隐藏在背后的潜台词实际上是说,我们把Spring的分发包加入到CLASSPATH,并且在程序中使用了其功能。框架,其实就是这么回事!就是如此简单!

 

        到现在为止,框架似乎还没有任何在我们的知识范畴以外的东西,它们的本质是如此一致,以至于我们很容易遗忘把一个JAR文件加入到CLASSPATH中的初衷:解决在某个领域的开发中所碰到的困境。正如我们在一开始使用的那个例子一样,框架作为一个JAR包,实际上是许许多多解决各种问题的类和方法的集合。当然,更多时候,它们包含了编写这些JAR包的作者所创造的许多最佳实践。

 

结论 框架是一组程序的集合,包含了一系列的最佳实践,作用是解决某个领域的问题。

 

          只有解决问题才是所有框架的共同目标。框架的产生就是为了解决一个又一个在开发中所遇到的困境。不同的框架,只是为了解决不同领域的问题。所以,对于广大程序员来说,千万不要为了学习框架而学习框架,而是要为了解决问题而学习框架,这才是一个程序员的正确学习之道。

原文参见 http://book.51cto.com/art/201201/311881.htm

                或者购买《Struts2技术内幕》 机械工业出版社 陆舟

© 著作权归作者所有

jtn

jtn

粉丝 12
博文 879
码字总数 879609
作品 0
武汉
程序员
私信 提问
区块链到底是个啥?新型的大规模协作平台

简介:围绕区块链有很多标签,分布式、去中心化、可追溯、不可篡改,等等等等。但区块链的本质到底是什么?面对这个问题,我们需要一个思考框架,这个框架帮助我们认识区块链的本质,进而可以...

桑榆仁
2018/08/17
0
0
Struts1和Struts2的特点、工作流程及差异性

图解Struts1的工作流程: Struts1的优缺点: 优点:a.从技术的本质而言:是基于jsp+javabean模式2的基础的一个框架。 b.从设计的本质而言:仅仅只针对与MVC。 c.从模型本质而言:它就是一套框...

鲁雯雪
2014/02/16
174
0
即将三十,我不敢说我精通任何一项技术

超级奶爸 图片来源:http://www.imdb.com/title/tt0395699/ 回顾自己的技术成长之路,具体技术真心没有一样敢说精通,对于一个像我这样工作6、7年的人来说,实在有些难以启齿。 现在中国整个...

翟志军
2017/05/10
0
0
强子哥哥/MyMVC

#为什么开发MyMVC 希望借助于Netty强大的NIO能力来打造一款轻量级、性能高的HTTP服务器。 同时,并不会屏蔽技术原理,使得用户知其然且知其所以然。 #MyMVC的技术方案 网络IO框架: Netty URL...

强子哥哥
2016/05/17
0
0
jfinal和play framework是什么关系?

我看介绍,都是做web开发的框架,有什么本质区别吗? 推荐用哪个?

jack_jones
2014/09/10
2.6K
6

没有更多内容

加载失败,请刷新页面

加载更多

mysql免安装

参考:http://blog.csdn.net/qq_28569585/article/details/79072805 [mysqld]#设置mysql密码为空#skip-grant-tables#设置3306端口 port = 3306# 设置mysql的安装目录 basedir=E...

秋默
8分钟前
2
0
立足于SpringCloud.H + Netflix-Ribbon + Hystrix断路器(9)

《SpringCloud.H心法总纲》 继续上一篇,接下来Springcloud配置Netflix-Ribbon集成Hystrix断路器的功能。 1、添加依赖 <!--使用hystrix,测试断路器--><dependency> <groupId>org.spr......

木九天
9分钟前
2
0
Dropbox怎么共享文件?Dropbox共享文件操作

Dropbox网盘是国外的一项云存储服务,这意味着即使您使用的是其他设备,您也可以将文件复制到云中并在以后访问它们,目前支持PC、Android和MAC三大平台,为用户带来最精准的资源传输工作。就...

坚果云
12分钟前
5
0
Vant Weapp 1.0 正式版发布

1.0 来了 2018 年 8 月 11 日,我们发布了 Vant Weapp 的首个版本。16 个月以来,我们收到了 27 位开发者贡献的 1000 多次提交,也处理了 1200 多个 issue,发布了 50 多个版本。Github 的 ...

有赞coder
13分钟前
3
0
VCF文件格式详解

VCF文件全称为Variant Call Format,表示基因组的变异信息,通常为GATK和Samtools软件处理所得到。 VCF文件大致可以分为两个部分: 1、以##开头的头文件信息 ##fileformat=VCFv4.2##FILTER...

悲催的古灵武士
14分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部